1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
3 * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
5 * Author: Weijie Gao <weijie.gao@mediatek.com>
8 #include "mtk-snand-def.h"
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
);
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)
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
|
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));
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
|
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));
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
|
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));
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));
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));
70 static const SNAND_IO_CAP(snand_cap_program_load_x1
,
72 SNAND_OP(SNAND_IO_1_1_1
, SNAND_CMD_PROGRAM_LOAD
, 0));
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));
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
),
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
),
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
),
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
),
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
),
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
),
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
),
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
),
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
),
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
),
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
),
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
),
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
),
458 static int mtk_snand_winbond_select_die(struct mtk_snand
*snf
, uint32_t dieidx
)
463 snand_log_chip(snf
->pdev
, "Invalid die index %u\n", dieidx
);
467 op
[0] = SNAND_CMD_WINBOND_SELECT_DIE
;
468 op
[1] = (uint8_t)dieidx
;
470 return mtk_snand_mac_io(snf
, op
, sizeof(op
), NULL
, 0);
473 static int mtk_snand_micron_select_die(struct mtk_snand
*snf
, uint32_t dieidx
)
478 snand_log_chip(snf
->pdev
, "Invalid die index %u\n", dieidx
);
482 ret
= mtk_snand_set_feature(snf
, SNAND_FEATURE_MICRON_DIE_ADDR
,
483 SNAND_MICRON_DIE_SEL_1
);
485 snand_log_chip(snf
->pdev
,
486 "Failed to set die selection feature\n");
493 const struct snand_flash_info
*snand_flash_id_lookup(enum snand_id_type type
,
496 const struct snand_id
*fid
;
499 for (i
= 0; i
< ARRAY_SIZE(snand_flash_ids
); i
++) {
500 if (snand_flash_ids
[i
].id
.type
!= type
)
503 fid
= &snand_flash_ids
[i
].id
;
504 if (memcmp(fid
->id
, id
, fid
->len
))
507 return &snand_flash_ids
[i
];