mediatek: add a new spi-nand driver for kernel 5.10
[openwrt/openwrt.git] / target / linux / mediatek / files-5.10 / drivers / mtd / mtk-snand / mtk-snand-ids.c
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /*
3 * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
4 *
5 * Author: Weijie Gao <weijie.gao@mediatek.com>
6 */
7
8 #include "mtk-snand-def.h"
9
10 static int mtk_snand_winbond_select_die(struct mtk_snand *snf, uint32_t dieidx);
11 static int mtk_snand_micron_select_die(struct mtk_snand *snf, uint32_t dieidx);
12
13 #define SNAND_MEMORG_512M_2K_64 SNAND_MEMORG(2048, 64, 64, 512, 1, 1)
14 #define SNAND_MEMORG_1G_2K_64 SNAND_MEMORG(2048, 64, 64, 1024, 1, 1)
15 #define SNAND_MEMORG_2G_2K_64 SNAND_MEMORG(2048, 64, 64, 2048, 1, 1)
16 #define SNAND_MEMORG_2G_2K_120 SNAND_MEMORG(2048, 120, 64, 2048, 1, 1)
17 #define SNAND_MEMORG_4G_2K_64 SNAND_MEMORG(2048, 64, 64, 4096, 1, 1)
18 #define SNAND_MEMORG_1G_2K_120 SNAND_MEMORG(2048, 120, 64, 1024, 1, 1)
19 #define SNAND_MEMORG_1G_2K_128 SNAND_MEMORG(2048, 128, 64, 1024, 1, 1)
20 #define SNAND_MEMORG_2G_2K_128 SNAND_MEMORG(2048, 128, 64, 2048, 1, 1)
21 #define SNAND_MEMORG_4G_2K_128 SNAND_MEMORG(2048, 128, 64, 4096, 1, 1)
22 #define SNAND_MEMORG_4G_4K_240 SNAND_MEMORG(4096, 240, 64, 2048, 1, 1)
23 #define SNAND_MEMORG_4G_4K_256 SNAND_MEMORG(4096, 256, 64, 2048, 1, 1)
24 #define SNAND_MEMORG_8G_4K_256 SNAND_MEMORG(4096, 256, 64, 4096, 1, 1)
25 #define SNAND_MEMORG_2G_2K_64_2P SNAND_MEMORG(2048, 64, 64, 2048, 2, 1)
26 #define SNAND_MEMORG_2G_2K_64_2D SNAND_MEMORG(2048, 64, 64, 1024, 1, 2)
27 #define SNAND_MEMORG_2G_2K_128_2P SNAND_MEMORG(2048, 128, 64, 2048, 2, 1)
28 #define SNAND_MEMORG_4G_2K_64_2P SNAND_MEMORG(2048, 64, 64, 4096, 2, 1)
29 #define SNAND_MEMORG_4G_2K_128_2P_2D SNAND_MEMORG(2048, 128, 64, 2048, 2, 2)
30 #define SNAND_MEMORG_8G_4K_256_2D SNAND_MEMORG(4096, 256, 64, 2048, 1, 2)
31
32 static const SNAND_IO_CAP(snand_cap_read_from_cache_quad,
33 SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_2_2 | SPI_IO_1_1_4 |
34 SPI_IO_1_4_4,
35 SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8),
36 SNAND_OP(SNAND_IO_1_1_2, SNAND_CMD_READ_FROM_CACHE_X2, 8),
37 SNAND_OP(SNAND_IO_1_2_2, SNAND_CMD_READ_FROM_CACHE_DUAL, 4),
38 SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8),
39 SNAND_OP(SNAND_IO_1_4_4, SNAND_CMD_READ_FROM_CACHE_QUAD, 4));
40
41 static const SNAND_IO_CAP(snand_cap_read_from_cache_quad_q2d,
42 SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_2_2 | SPI_IO_1_1_4 |
43 SPI_IO_1_4_4,
44 SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8),
45 SNAND_OP(SNAND_IO_1_1_2, SNAND_CMD_READ_FROM_CACHE_X2, 8),
46 SNAND_OP(SNAND_IO_1_2_2, SNAND_CMD_READ_FROM_CACHE_DUAL, 4),
47 SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8),
48 SNAND_OP(SNAND_IO_1_4_4, SNAND_CMD_READ_FROM_CACHE_QUAD, 2));
49
50 static const SNAND_IO_CAP(snand_cap_read_from_cache_quad_a8d,
51 SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_2_2 | SPI_IO_1_1_4 |
52 SPI_IO_1_4_4,
53 SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8),
54 SNAND_OP(SNAND_IO_1_1_2, SNAND_CMD_READ_FROM_CACHE_X2, 8),
55 SNAND_OP(SNAND_IO_1_2_2, SNAND_CMD_READ_FROM_CACHE_DUAL, 8),
56 SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8),
57 SNAND_OP(SNAND_IO_1_4_4, SNAND_CMD_READ_FROM_CACHE_QUAD, 8));
58
59 static const SNAND_IO_CAP(snand_cap_read_from_cache_x4,
60 SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_1_4,
61 SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8),
62 SNAND_OP(SNAND_IO_1_1_2, SNAND_CMD_READ_FROM_CACHE_X2, 8),
63 SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8));
64
65 static const SNAND_IO_CAP(snand_cap_read_from_cache_x4_only,
66 SPI_IO_1_1_1 | SPI_IO_1_1_4,
67 SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8),
68 SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8));
69
70 static const SNAND_IO_CAP(snand_cap_program_load_x1,
71 SPI_IO_1_1_1,
72 SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_PROGRAM_LOAD, 0));
73
74 static const SNAND_IO_CAP(snand_cap_program_load_x4,
75 SPI_IO_1_1_1 | SPI_IO_1_1_4,
76 SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_PROGRAM_LOAD, 0),
77 SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_PROGRAM_LOAD_X4, 0));
78
79 static const struct snand_flash_info snand_flash_ids[] = {
80 SNAND_INFO("W25N512GV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xaa, 0x20),
81 SNAND_MEMORG_512M_2K_64,
82 &snand_cap_read_from_cache_quad,
83 &snand_cap_program_load_x4),
84 SNAND_INFO("W25N01GV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xaa, 0x21),
85 SNAND_MEMORG_1G_2K_64,
86 &snand_cap_read_from_cache_quad,
87 &snand_cap_program_load_x4),
88 SNAND_INFO("W25M02GV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xab, 0x21),
89 SNAND_MEMORG_2G_2K_64_2D,
90 &snand_cap_read_from_cache_quad,
91 &snand_cap_program_load_x4,
92 mtk_snand_winbond_select_die),
93 SNAND_INFO("W25N02KV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xaa, 0x22),
94 SNAND_MEMORG_2G_2K_128,
95 &snand_cap_read_from_cache_quad,
96 &snand_cap_program_load_x4),
97
98 SNAND_INFO("GD5F1GQ4UAWxx", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0x10),
99 SNAND_MEMORG_1G_2K_64,
100 &snand_cap_read_from_cache_quad_q2d,
101 &snand_cap_program_load_x4),
102 SNAND_INFO("GD5F1GQ4UExIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xd1),
103 SNAND_MEMORG_1G_2K_128,
104 &snand_cap_read_from_cache_quad_q2d,
105 &snand_cap_program_load_x4),
106 SNAND_INFO("GD5F1GQ4UExxH", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xd9),
107 SNAND_MEMORG_1G_2K_64,
108 &snand_cap_read_from_cache_quad_q2d,
109 &snand_cap_program_load_x4),
110 SNAND_INFO("GD5F1GQ4xAYIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xf1),
111 SNAND_MEMORG_1G_2K_64,
112 &snand_cap_read_from_cache_quad_q2d,
113 &snand_cap_program_load_x4),
114 SNAND_INFO("GD5F2GQ4UExIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xd2),
115 SNAND_MEMORG_2G_2K_128,
116 &snand_cap_read_from_cache_quad_q2d,
117 &snand_cap_program_load_x4),
118 SNAND_INFO("GD5F2GQ5UExxH", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0x32),
119 SNAND_MEMORG_2G_2K_64,
120 &snand_cap_read_from_cache_quad_a8d,
121 &snand_cap_program_load_x4),
122 SNAND_INFO("GD5F2GQ4xAYIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xf2),
123 SNAND_MEMORG_2G_2K_64,
124 &snand_cap_read_from_cache_quad_q2d,
125 &snand_cap_program_load_x4),
126 SNAND_INFO("GD5F4GQ4UBxIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xd4),
127 SNAND_MEMORG_4G_4K_256,
128 &snand_cap_read_from_cache_quad_q2d,
129 &snand_cap_program_load_x4),
130 SNAND_INFO("GD5F4GQ4xAYIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xf4),
131 SNAND_MEMORG_4G_2K_64,
132 &snand_cap_read_from_cache_quad_q2d,
133 &snand_cap_program_load_x4),
134 SNAND_INFO("GD5F2GQ5UExxG", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x52),
135 SNAND_MEMORG_2G_2K_128,
136 &snand_cap_read_from_cache_quad_q2d,
137 &snand_cap_program_load_x4),
138 SNAND_INFO("GD5F4GQ4UCxIG", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0xb4),
139 SNAND_MEMORG_4G_4K_256,
140 &snand_cap_read_from_cache_quad_q2d,
141 &snand_cap_program_load_x4),
142
143 SNAND_INFO("MX35LF1GE4AB", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x12),
144 SNAND_MEMORG_1G_2K_64,
145 &snand_cap_read_from_cache_x4,
146 &snand_cap_program_load_x4),
147 SNAND_INFO("MX35LF1G24AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x14),
148 SNAND_MEMORG_1G_2K_128,
149 &snand_cap_read_from_cache_quad,
150 &snand_cap_program_load_x4),
151 SNAND_INFO("MX31LF1GE4BC", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x1e),
152 SNAND_MEMORG_1G_2K_64,
153 &snand_cap_read_from_cache_x4,
154 &snand_cap_program_load_x4),
155 SNAND_INFO("MX35LF2GE4AB", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x22),
156 SNAND_MEMORG_2G_2K_64,
157 &snand_cap_read_from_cache_x4,
158 &snand_cap_program_load_x4),
159 SNAND_INFO("MX35LF2G24AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x24),
160 SNAND_MEMORG_2G_2K_128,
161 &snand_cap_read_from_cache_quad,
162 &snand_cap_program_load_x4),
163 SNAND_INFO("MX35LF2GE4AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x26),
164 SNAND_MEMORG_2G_2K_128,
165 &snand_cap_read_from_cache_x4,
166 &snand_cap_program_load_x4),
167 SNAND_INFO("MX35LF2G14AC", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x20),
168 SNAND_MEMORG_2G_2K_64,
169 &snand_cap_read_from_cache_x4,
170 &snand_cap_program_load_x4),
171 SNAND_INFO("MX35LF4G24AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x35),
172 SNAND_MEMORG_4G_4K_256,
173 &snand_cap_read_from_cache_quad,
174 &snand_cap_program_load_x4),
175 SNAND_INFO("MX35LF4GE4AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x37),
176 SNAND_MEMORG_4G_4K_256,
177 &snand_cap_read_from_cache_x4,
178 &snand_cap_program_load_x4),
179
180 SNAND_INFO("MT29F1G01AAADD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x12),
181 SNAND_MEMORG_1G_2K_64,
182 &snand_cap_read_from_cache_x4,
183 &snand_cap_program_load_x1),
184 SNAND_INFO("MT29F1G01ABAFD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x14),
185 SNAND_MEMORG_1G_2K_128,
186 &snand_cap_read_from_cache_quad,
187 &snand_cap_program_load_x4),
188 SNAND_INFO("MT29F2G01AAAED", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x9f),
189 SNAND_MEMORG_2G_2K_64_2P,
190 &snand_cap_read_from_cache_x4,
191 &snand_cap_program_load_x1),
192 SNAND_INFO("MT29F2G01ABAGD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x24),
193 SNAND_MEMORG_2G_2K_128_2P,
194 &snand_cap_read_from_cache_quad,
195 &snand_cap_program_load_x4),
196 SNAND_INFO("MT29F4G01AAADD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x32),
197 SNAND_MEMORG_4G_2K_64_2P,
198 &snand_cap_read_from_cache_x4,
199 &snand_cap_program_load_x1),
200 SNAND_INFO("MT29F4G01ABAFD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x34),
201 SNAND_MEMORG_4G_4K_256,
202 &snand_cap_read_from_cache_quad,
203 &snand_cap_program_load_x4),
204 SNAND_INFO("MT29F4G01ADAGD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x36),
205 SNAND_MEMORG_4G_2K_128_2P_2D,
206 &snand_cap_read_from_cache_quad,
207 &snand_cap_program_load_x4,
208 mtk_snand_micron_select_die),
209 SNAND_INFO("MT29F8G01ADAFD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x46),
210 SNAND_MEMORG_8G_4K_256_2D,
211 &snand_cap_read_from_cache_quad,
212 &snand_cap_program_load_x4,
213 mtk_snand_micron_select_die),
214
215 SNAND_INFO("TC58CVG0S3HRAIG", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xc2),
216 SNAND_MEMORG_1G_2K_128,
217 &snand_cap_read_from_cache_x4,
218 &snand_cap_program_load_x1),
219 SNAND_INFO("TC58CVG1S3HRAIG", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xcb),
220 SNAND_MEMORG_2G_2K_128,
221 &snand_cap_read_from_cache_x4,
222 &snand_cap_program_load_x1),
223 SNAND_INFO("TC58CVG2S0HRAIG", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xcd),
224 SNAND_MEMORG_4G_4K_256,
225 &snand_cap_read_from_cache_x4,
226 &snand_cap_program_load_x1),
227 SNAND_INFO("TC58CVG0S3HRAIJ", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xe2),
228 SNAND_MEMORG_1G_2K_128,
229 &snand_cap_read_from_cache_x4,
230 &snand_cap_program_load_x4),
231 SNAND_INFO("TC58CVG1S3HRAIJ", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xeb),
232 SNAND_MEMORG_2G_2K_128,
233 &snand_cap_read_from_cache_x4,
234 &snand_cap_program_load_x4),
235 SNAND_INFO("TC58CVG2S0HRAIJ", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xed),
236 SNAND_MEMORG_4G_4K_256,
237 &snand_cap_read_from_cache_x4,
238 &snand_cap_program_load_x4),
239 SNAND_INFO("TH58CVG3S0HRAIJ", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xe4),
240 SNAND_MEMORG_8G_4K_256,
241 &snand_cap_read_from_cache_x4,
242 &snand_cap_program_load_x4),
243
244 SNAND_INFO("F50L512M41A", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x20),
245 SNAND_MEMORG_512M_2K_64,
246 &snand_cap_read_from_cache_x4,
247 &snand_cap_program_load_x4),
248 SNAND_INFO("F50L1G41A", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x21),
249 SNAND_MEMORG_1G_2K_64,
250 &snand_cap_read_from_cache_x4,
251 &snand_cap_program_load_x4),
252 SNAND_INFO("F50L1G41LB", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x01),
253 SNAND_MEMORG_1G_2K_64,
254 &snand_cap_read_from_cache_quad,
255 &snand_cap_program_load_x4),
256 SNAND_INFO("F50L2G41LB", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x0a),
257 SNAND_MEMORG_2G_2K_64_2D,
258 &snand_cap_read_from_cache_quad,
259 &snand_cap_program_load_x4,
260 mtk_snand_winbond_select_die),
261
262 SNAND_INFO("CS11G0T0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x00),
263 SNAND_MEMORG_1G_2K_128,
264 &snand_cap_read_from_cache_quad_q2d,
265 &snand_cap_program_load_x4),
266 SNAND_INFO("CS11G0G0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x10),
267 SNAND_MEMORG_1G_2K_128,
268 &snand_cap_read_from_cache_quad_q2d,
269 &snand_cap_program_load_x4),
270 SNAND_INFO("CS11G0S0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x20),
271 SNAND_MEMORG_1G_2K_64,
272 &snand_cap_read_from_cache_quad_q2d,
273 &snand_cap_program_load_x4),
274 SNAND_INFO("CS11G1T0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x01),
275 SNAND_MEMORG_2G_2K_128,
276 &snand_cap_read_from_cache_quad_q2d,
277 &snand_cap_program_load_x4),
278 SNAND_INFO("CS11G1S0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x21),
279 SNAND_MEMORG_2G_2K_64,
280 &snand_cap_read_from_cache_quad_q2d,
281 &snand_cap_program_load_x4),
282 SNAND_INFO("CS11G2T0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x02),
283 SNAND_MEMORG_4G_2K_128,
284 &snand_cap_read_from_cache_quad_q2d,
285 &snand_cap_program_load_x4),
286 SNAND_INFO("CS11G2S0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x22),
287 SNAND_MEMORG_4G_2K_64,
288 &snand_cap_read_from_cache_quad_q2d,
289 &snand_cap_program_load_x4),
290
291 SNAND_INFO("EM73B044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x01),
292 SNAND_MEMORG_512M_2K_64,
293 &snand_cap_read_from_cache_quad_q2d,
294 &snand_cap_program_load_x4),
295 SNAND_INFO("EM73C044SNB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x11),
296 SNAND_MEMORG_1G_2K_120,
297 &snand_cap_read_from_cache_quad_q2d,
298 &snand_cap_program_load_x4),
299 SNAND_INFO("EM73C044SNF", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x09),
300 SNAND_MEMORG_1G_2K_128,
301 &snand_cap_read_from_cache_quad_q2d,
302 &snand_cap_program_load_x4),
303 SNAND_INFO("EM73C044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x18),
304 SNAND_MEMORG_1G_2K_64,
305 &snand_cap_read_from_cache_quad_q2d,
306 &snand_cap_program_load_x4),
307 SNAND_INFO("EM73C044SNA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x19),
308 SNAND_MEMORG(2048, 64, 128, 512, 1, 1),
309 &snand_cap_read_from_cache_quad_q2d,
310 &snand_cap_program_load_x4),
311 SNAND_INFO("EM73C044VCD", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1c),
312 SNAND_MEMORG_1G_2K_64,
313 &snand_cap_read_from_cache_quad_q2d,
314 &snand_cap_program_load_x4),
315 SNAND_INFO("EM73C044SND", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1d),
316 SNAND_MEMORG_1G_2K_64,
317 &snand_cap_read_from_cache_quad_q2d,
318 &snand_cap_program_load_x4),
319 SNAND_INFO("EM73D044SND", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1e),
320 SNAND_MEMORG_2G_2K_64,
321 &snand_cap_read_from_cache_quad_q2d,
322 &snand_cap_program_load_x4),
323 SNAND_INFO("EM73C044VCC", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x22),
324 SNAND_MEMORG_1G_2K_64,
325 &snand_cap_read_from_cache_quad_q2d,
326 &snand_cap_program_load_x4),
327 SNAND_INFO("EM73C044VCF", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x25),
328 SNAND_MEMORG_1G_2K_64,
329 &snand_cap_read_from_cache_quad_q2d,
330 &snand_cap_program_load_x4),
331 SNAND_INFO("EM73C044SNC", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x31),
332 SNAND_MEMORG_1G_2K_128,
333 &snand_cap_read_from_cache_quad_q2d,
334 &snand_cap_program_load_x4),
335 SNAND_INFO("EM73D044SNC", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0a),
336 SNAND_MEMORG_2G_2K_120,
337 &snand_cap_read_from_cache_quad_q2d,
338 &snand_cap_program_load_x4),
339 SNAND_INFO("EM73D044SNA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x12),
340 SNAND_MEMORG_2G_2K_128,
341 &snand_cap_read_from_cache_quad_q2d,
342 &snand_cap_program_load_x4),
343 SNAND_INFO("EM73D044SNF", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x10),
344 SNAND_MEMORG_2G_2K_128,
345 &snand_cap_read_from_cache_quad_q2d,
346 &snand_cap_program_load_x4),
347 SNAND_INFO("EM73D044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x13),
348 SNAND_MEMORG_2G_2K_128,
349 &snand_cap_read_from_cache_quad_q2d,
350 &snand_cap_program_load_x4),
351 SNAND_INFO("EM73D044VCB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x14),
352 SNAND_MEMORG_2G_2K_64,
353 &snand_cap_read_from_cache_quad_q2d,
354 &snand_cap_program_load_x4),
355 SNAND_INFO("EM73D044VCD", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x17),
356 SNAND_MEMORG_2G_2K_128,
357 &snand_cap_read_from_cache_quad_q2d,
358 &snand_cap_program_load_x4),
359 SNAND_INFO("EM73D044VCH", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1b),
360 SNAND_MEMORG_2G_2K_64,
361 &snand_cap_read_from_cache_quad_q2d,
362 &snand_cap_program_load_x4),
363 SNAND_INFO("EM73D044SND", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1d),
364 SNAND_MEMORG_2G_2K_64,
365 &snand_cap_read_from_cache_quad_q2d,
366 &snand_cap_program_load_x4),
367 SNAND_INFO("EM73D044VCG", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1f),
368 SNAND_MEMORG_2G_2K_64,
369 &snand_cap_read_from_cache_quad_q2d,
370 &snand_cap_program_load_x4),
371 SNAND_INFO("EM73D044VCE", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x20),
372 SNAND_MEMORG_2G_2K_64,
373 &snand_cap_read_from_cache_quad_q2d,
374 &snand_cap_program_load_x4),
375 SNAND_INFO("EM73D044VCL", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x2e),
376 SNAND_MEMORG_2G_2K_128,
377 &snand_cap_read_from_cache_quad_q2d,
378 &snand_cap_program_load_x4),
379 SNAND_INFO("EM73D044SNB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x32),
380 SNAND_MEMORG_2G_2K_128,
381 &snand_cap_read_from_cache_quad_q2d,
382 &snand_cap_program_load_x4),
383 SNAND_INFO("EM73E044SNA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x03),
384 SNAND_MEMORG_4G_4K_256,
385 &snand_cap_read_from_cache_quad_q2d,
386 &snand_cap_program_load_x4),
387 SNAND_INFO("EM73E044SND", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0b),
388 SNAND_MEMORG_4G_4K_240,
389 &snand_cap_read_from_cache_quad_q2d,
390 &snand_cap_program_load_x4),
391 SNAND_INFO("EM73E044SNB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x23),
392 SNAND_MEMORG_4G_4K_256,
393 &snand_cap_read_from_cache_quad_q2d,
394 &snand_cap_program_load_x4),
395 SNAND_INFO("EM73E044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x2c),
396 SNAND_MEMORG_4G_4K_256,
397 &snand_cap_read_from_cache_quad_q2d,
398 &snand_cap_program_load_x4),
399 SNAND_INFO("EM73E044VCB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x2f),
400 SNAND_MEMORG_4G_2K_128,
401 &snand_cap_read_from_cache_quad_q2d,
402 &snand_cap_program_load_x4),
403 SNAND_INFO("EM73F044SNA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x24),
404 SNAND_MEMORG_8G_4K_256,
405 &snand_cap_read_from_cache_quad_q2d,
406 &snand_cap_program_load_x4),
407 SNAND_INFO("EM73F044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x2d),
408 SNAND_MEMORG_8G_4K_256,
409 &snand_cap_read_from_cache_quad_q2d,
410 &snand_cap_program_load_x4),
411 SNAND_INFO("EM73E044SNE", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0e),
412 SNAND_MEMORG_8G_4K_256,
413 &snand_cap_read_from_cache_quad_q2d,
414 &snand_cap_program_load_x4),
415 SNAND_INFO("EM73C044SNG", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0c),
416 SNAND_MEMORG_1G_2K_120,
417 &snand_cap_read_from_cache_quad_q2d,
418 &snand_cap_program_load_x4),
419 SNAND_INFO("EM73D044VCN", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0f),
420 SNAND_MEMORG_2G_2K_64,
421 &snand_cap_read_from_cache_quad_q2d,
422 &snand_cap_program_load_x4),
423
424 SNAND_INFO("FM35Q1GA", SNAND_ID(SNAND_ID_DYMMY, 0xe5, 0x71),
425 SNAND_MEMORG_1G_2K_64,
426 &snand_cap_read_from_cache_x4,
427 &snand_cap_program_load_x4),
428
429 SNAND_INFO("PN26G01A", SNAND_ID(SNAND_ID_DYMMY, 0xa1, 0xe1),
430 SNAND_MEMORG_1G_2K_128,
431 &snand_cap_read_from_cache_quad_q2d,
432 &snand_cap_program_load_x4),
433 SNAND_INFO("PN26G02A", SNAND_ID(SNAND_ID_DYMMY, 0xa1, 0xe2),
434 SNAND_MEMORG_2G_2K_128,
435 &snand_cap_read_from_cache_quad_q2d,
436 &snand_cap_program_load_x4),
437
438 SNAND_INFO("IS37SML01G1", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x21),
439 SNAND_MEMORG_1G_2K_64,
440 &snand_cap_read_from_cache_x4,
441 &snand_cap_program_load_x4),
442
443 SNAND_INFO("ATO25D1GA", SNAND_ID(SNAND_ID_DYMMY, 0x9b, 0x12),
444 SNAND_MEMORG_1G_2K_64,
445 &snand_cap_read_from_cache_x4_only,
446 &snand_cap_program_load_x4),
447
448 SNAND_INFO("HYF1GQ4U", SNAND_ID(SNAND_ID_DYMMY, 0xc9, 0x51),
449 SNAND_MEMORG_1G_2K_128,
450 &snand_cap_read_from_cache_quad_q2d,
451 &snand_cap_program_load_x4),
452 SNAND_INFO("HYF2GQ4U", SNAND_ID(SNAND_ID_DYMMY, 0xc9, 0x52),
453 SNAND_MEMORG_2G_2K_128,
454 &snand_cap_read_from_cache_quad_q2d,
455 &snand_cap_program_load_x4),
456 };
457
458 static int mtk_snand_winbond_select_die(struct mtk_snand *snf, uint32_t dieidx)
459 {
460 uint8_t op[2];
461
462 if (dieidx > 1) {
463 snand_log_chip(snf->pdev, "Invalid die index %u\n", dieidx);
464 return -EINVAL;
465 }
466
467 op[0] = SNAND_CMD_WINBOND_SELECT_DIE;
468 op[1] = (uint8_t)dieidx;
469
470 return mtk_snand_mac_io(snf, op, sizeof(op), NULL, 0);
471 }
472
473 static int mtk_snand_micron_select_die(struct mtk_snand *snf, uint32_t dieidx)
474 {
475 int ret;
476
477 if (dieidx > 1) {
478 snand_log_chip(snf->pdev, "Invalid die index %u\n", dieidx);
479 return -EINVAL;
480 }
481
482 ret = mtk_snand_set_feature(snf, SNAND_FEATURE_MICRON_DIE_ADDR,
483 SNAND_MICRON_DIE_SEL_1);
484 if (ret) {
485 snand_log_chip(snf->pdev,
486 "Failed to set die selection feature\n");
487 return ret;
488 }
489
490 return 0;
491 }
492
493 const struct snand_flash_info *snand_flash_id_lookup(enum snand_id_type type,
494 const uint8_t *id)
495 {
496 const struct snand_id *fid;
497 uint32_t i;
498
499 for (i = 0; i < ARRAY_SIZE(snand_flash_ids); i++) {
500 if (snand_flash_ids[i].id.type != type)
501 continue;
502
503 fid = &snand_flash_ids[i].id;
504 if (memcmp(fid->id, id, fid->len))
505 continue;
506
507 return &snand_flash_ids[i];
508 }
509
510 return NULL;
511 }