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