Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) /* Copyright (c) 2018 Rockchip Electronics Co. Ltd. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include "rkflash_api.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include "rk_sftl.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) struct SFNAND_DEV *sfnand_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) static int snand_init(void __iomem *reg_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 	sfc_init(reg_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	ret = sfc_nand_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 		sfnand_dev = sfc_nand_get_private_dev();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #if defined(CONFIG_RK_SFTL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 		sfc_nand_ftl_ops_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 		ret = sftl_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #elif !defined(CONFIG_RK_SFC_NAND_MTD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #error "When CONFIG_RK_SFC_NAND_MTD is not used, CONFIG_RK_SFTL is required!"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) static unsigned int snand_get_capacity(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 		return sftl_get_density();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) static int snand_write(u32 sec, u32 n_sec, void *p_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 		return sftl_write(sec, n_sec, p_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) static int snand_read(u32 sec, u32 n_sec, void *p_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 		return sftl_read(sec, n_sec, p_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) static int snand_vendor_read(u32 sec, u32 n_sec, void *p_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 		return sftl_vendor_read(sec, n_sec, p_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) static int snand_vendor_write(u32 sec, u32 n_sec, void *p_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 		return sftl_vendor_write(sec, n_sec, p_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) static int snand_gc(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 		return sftl_gc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) static int snand_discard(u32 sec, u32 n_sec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 		return sftl_discard(sec, n_sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) static void snand_deinit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	if (IS_ENABLED(CONFIG_RK_SFTL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		sftl_deinit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	sfc_nand_deinit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) static int snand_resume(void __iomem *reg_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	sfc_init(reg_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	return sfc_nand_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) const struct flash_boot_ops sfc_nand_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	snand_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	snand_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	snand_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	snand_get_capacity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	snand_deinit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	snand_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	snand_vendor_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	snand_vendor_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	snand_gc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	snand_discard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) };