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