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("GD5F1GQ5xExxG", SNAND_ID(SNAND_ID_DYMMY
, 0xc8, 0x51),
135 SNAND_MEMORG_1G_2K_128
,
136 &snand_cap_read_from_cache_quad_q2d
,
137 &snand_cap_program_load_x4
),
138 SNAND_INFO("GD5F2GQ5UExxG", SNAND_ID(SNAND_ID_DYMMY
, 0xc8, 0x52),
139 SNAND_MEMORG_2G_2K_128
,
140 &snand_cap_read_from_cache_quad_q2d
,
141 &snand_cap_program_load_x4
),
142 SNAND_INFO("GD5F4GQ4UCxIG", SNAND_ID(SNAND_ID_DYMMY
, 0xc8, 0xb4),
143 SNAND_MEMORG_4G_4K_256
,
144 &snand_cap_read_from_cache_quad_q2d
,
145 &snand_cap_program_load_x4
),
147 SNAND_INFO("MX35LF1GE4AB", SNAND_ID(SNAND_ID_DYMMY
, 0xc2, 0x12),
148 SNAND_MEMORG_1G_2K_64
,
149 &snand_cap_read_from_cache_x4
,
150 &snand_cap_program_load_x4
),
151 SNAND_INFO("MX35LF1G24AD", SNAND_ID(SNAND_ID_DYMMY
, 0xc2, 0x14),
152 SNAND_MEMORG_1G_2K_128
,
153 &snand_cap_read_from_cache_quad
,
154 &snand_cap_program_load_x4
),
155 SNAND_INFO("MX31LF1GE4BC", SNAND_ID(SNAND_ID_DYMMY
, 0xc2, 0x1e),
156 SNAND_MEMORG_1G_2K_64
,
157 &snand_cap_read_from_cache_x4
,
158 &snand_cap_program_load_x4
),
159 SNAND_INFO("MX35LF2GE4AB", SNAND_ID(SNAND_ID_DYMMY
, 0xc2, 0x22),
160 SNAND_MEMORG_2G_2K_64
,
161 &snand_cap_read_from_cache_x4
,
162 &snand_cap_program_load_x4
),
163 SNAND_INFO("MX35LF2G24AD", SNAND_ID(SNAND_ID_DYMMY
, 0xc2, 0x24),
164 SNAND_MEMORG_2G_2K_128
,
165 &snand_cap_read_from_cache_quad
,
166 &snand_cap_program_load_x4
),
167 SNAND_INFO("MX35LF2GE4AD", SNAND_ID(SNAND_ID_DYMMY
, 0xc2, 0x26),
168 SNAND_MEMORG_2G_2K_128
,
169 &snand_cap_read_from_cache_x4
,
170 &snand_cap_program_load_x4
),
171 SNAND_INFO("MX35LF2G14AC", SNAND_ID(SNAND_ID_DYMMY
, 0xc2, 0x20),
172 SNAND_MEMORG_2G_2K_64
,
173 &snand_cap_read_from_cache_x4
,
174 &snand_cap_program_load_x4
),
175 SNAND_INFO("MX35LF4G24AD", SNAND_ID(SNAND_ID_DYMMY
, 0xc2, 0x35),
176 SNAND_MEMORG_4G_4K_256
,
177 &snand_cap_read_from_cache_quad
,
178 &snand_cap_program_load_x4
),
179 SNAND_INFO("MX35LF4GE4AD", SNAND_ID(SNAND_ID_DYMMY
, 0xc2, 0x37),
180 SNAND_MEMORG_4G_4K_256
,
181 &snand_cap_read_from_cache_x4
,
182 &snand_cap_program_load_x4
),
184 SNAND_INFO("MT29F1G01AAADD", SNAND_ID(SNAND_ID_DYMMY
, 0x2c, 0x12),
185 SNAND_MEMORG_1G_2K_64
,
186 &snand_cap_read_from_cache_x4
,
187 &snand_cap_program_load_x1
),
188 SNAND_INFO("MT29F1G01ABAFD", SNAND_ID(SNAND_ID_DYMMY
, 0x2c, 0x14),
189 SNAND_MEMORG_1G_2K_128
,
190 &snand_cap_read_from_cache_quad
,
191 &snand_cap_program_load_x4
),
192 SNAND_INFO("MT29F2G01AAAED", SNAND_ID(SNAND_ID_DYMMY
, 0x2c, 0x9f),
193 SNAND_MEMORG_2G_2K_64_2P
,
194 &snand_cap_read_from_cache_x4
,
195 &snand_cap_program_load_x1
),
196 SNAND_INFO("MT29F2G01ABAGD", SNAND_ID(SNAND_ID_DYMMY
, 0x2c, 0x24),
197 SNAND_MEMORG_2G_2K_128_2P
,
198 &snand_cap_read_from_cache_quad
,
199 &snand_cap_program_load_x4
),
200 SNAND_INFO("MT29F4G01AAADD", SNAND_ID(SNAND_ID_DYMMY
, 0x2c, 0x32),
201 SNAND_MEMORG_4G_2K_64_2P
,
202 &snand_cap_read_from_cache_x4
,
203 &snand_cap_program_load_x1
),
204 SNAND_INFO("MT29F4G01ABAFD", SNAND_ID(SNAND_ID_DYMMY
, 0x2c, 0x34),
205 SNAND_MEMORG_4G_4K_256
,
206 &snand_cap_read_from_cache_quad
,
207 &snand_cap_program_load_x4
),
208 SNAND_INFO("MT29F4G01ADAGD", SNAND_ID(SNAND_ID_DYMMY
, 0x2c, 0x36),
209 SNAND_MEMORG_4G_2K_128_2P_2D
,
210 &snand_cap_read_from_cache_quad
,
211 &snand_cap_program_load_x4
,
212 mtk_snand_micron_select_die
),
213 SNAND_INFO("MT29F8G01ADAFD", SNAND_ID(SNAND_ID_DYMMY
, 0x2c, 0x46),
214 SNAND_MEMORG_8G_4K_256_2D
,
215 &snand_cap_read_from_cache_quad
,
216 &snand_cap_program_load_x4
,
217 mtk_snand_micron_select_die
),
219 SNAND_INFO("TC58CVG0S3HRAIG", SNAND_ID(SNAND_ID_DYMMY
, 0x98, 0xc2),
220 SNAND_MEMORG_1G_2K_128
,
221 &snand_cap_read_from_cache_x4
,
222 &snand_cap_program_load_x1
),
223 SNAND_INFO("TC58CVG1S3HRAIG", SNAND_ID(SNAND_ID_DYMMY
, 0x98, 0xcb),
224 SNAND_MEMORG_2G_2K_128
,
225 &snand_cap_read_from_cache_x4
,
226 &snand_cap_program_load_x1
),
227 SNAND_INFO("TC58CVG2S0HRAIG", SNAND_ID(SNAND_ID_DYMMY
, 0x98, 0xcd),
228 SNAND_MEMORG_4G_4K_256
,
229 &snand_cap_read_from_cache_x4
,
230 &snand_cap_program_load_x1
),
231 SNAND_INFO("TC58CVG0S3HRAIJ", SNAND_ID(SNAND_ID_DYMMY
, 0x98, 0xe2),
232 SNAND_MEMORG_1G_2K_128
,
233 &snand_cap_read_from_cache_x4
,
234 &snand_cap_program_load_x4
),
235 SNAND_INFO("TC58CVG1S3HRAIJ", SNAND_ID(SNAND_ID_DYMMY
, 0x98, 0xeb),
236 SNAND_MEMORG_2G_2K_128
,
237 &snand_cap_read_from_cache_x4
,
238 &snand_cap_program_load_x4
),
239 SNAND_INFO("TC58CVG2S0HRAIJ", SNAND_ID(SNAND_ID_DYMMY
, 0x98, 0xed),
240 SNAND_MEMORG_4G_4K_256
,
241 &snand_cap_read_from_cache_x4
,
242 &snand_cap_program_load_x4
),
243 SNAND_INFO("TH58CVG3S0HRAIJ", SNAND_ID(SNAND_ID_DYMMY
, 0x98, 0xe4),
244 SNAND_MEMORG_8G_4K_256
,
245 &snand_cap_read_from_cache_x4
,
246 &snand_cap_program_load_x4
),
248 SNAND_INFO("F50L512M41A", SNAND_ID(SNAND_ID_DYMMY
, 0xc8, 0x20),
249 SNAND_MEMORG_512M_2K_64
,
250 &snand_cap_read_from_cache_x4
,
251 &snand_cap_program_load_x4
),
252 SNAND_INFO("F50L1G41A", SNAND_ID(SNAND_ID_DYMMY
, 0xc8, 0x21),
253 SNAND_MEMORG_1G_2K_64
,
254 &snand_cap_read_from_cache_x4
,
255 &snand_cap_program_load_x4
),
256 SNAND_INFO("F50L1G41LB", SNAND_ID(SNAND_ID_DYMMY
, 0xc8, 0x01),
257 SNAND_MEMORG_1G_2K_64
,
258 &snand_cap_read_from_cache_quad
,
259 &snand_cap_program_load_x4
),
260 SNAND_INFO("F50L2G41LB", SNAND_ID(SNAND_ID_DYMMY
, 0xc8, 0x0a),
261 SNAND_MEMORG_2G_2K_64_2D
,
262 &snand_cap_read_from_cache_quad
,
263 &snand_cap_program_load_x4
,
264 mtk_snand_winbond_select_die
),
266 SNAND_INFO("CS11G0T0A0AA", SNAND_ID(SNAND_ID_DYMMY
, 0x6b, 0x00),
267 SNAND_MEMORG_1G_2K_128
,
268 &snand_cap_read_from_cache_quad_q2d
,
269 &snand_cap_program_load_x4
),
270 SNAND_INFO("CS11G0G0A0AA", SNAND_ID(SNAND_ID_DYMMY
, 0x6b, 0x10),
271 SNAND_MEMORG_1G_2K_128
,
272 &snand_cap_read_from_cache_quad_q2d
,
273 &snand_cap_program_load_x4
),
274 SNAND_INFO("CS11G0S0A0AA", SNAND_ID(SNAND_ID_DYMMY
, 0x6b, 0x20),
275 SNAND_MEMORG_1G_2K_64
,
276 &snand_cap_read_from_cache_quad_q2d
,
277 &snand_cap_program_load_x4
),
278 SNAND_INFO("CS11G1T0A0AA", SNAND_ID(SNAND_ID_DYMMY
, 0x6b, 0x01),
279 SNAND_MEMORG_2G_2K_128
,
280 &snand_cap_read_from_cache_quad_q2d
,
281 &snand_cap_program_load_x4
),
282 SNAND_INFO("CS11G1S0A0AA", SNAND_ID(SNAND_ID_DYMMY
, 0x6b, 0x21),
283 SNAND_MEMORG_2G_2K_64
,
284 &snand_cap_read_from_cache_quad_q2d
,
285 &snand_cap_program_load_x4
),
286 SNAND_INFO("CS11G2T0A0AA", SNAND_ID(SNAND_ID_DYMMY
, 0x6b, 0x02),
287 SNAND_MEMORG_4G_2K_128
,
288 &snand_cap_read_from_cache_quad_q2d
,
289 &snand_cap_program_load_x4
),
290 SNAND_INFO("CS11G2S0A0AA", SNAND_ID(SNAND_ID_DYMMY
, 0x6b, 0x22),
291 SNAND_MEMORG_4G_2K_64
,
292 &snand_cap_read_from_cache_quad_q2d
,
293 &snand_cap_program_load_x4
),
295 SNAND_INFO("EM73B044VCA", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x01),
296 SNAND_MEMORG_512M_2K_64
,
297 &snand_cap_read_from_cache_quad_q2d
,
298 &snand_cap_program_load_x4
),
299 SNAND_INFO("EM73C044SNB", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x11),
300 SNAND_MEMORG_1G_2K_120
,
301 &snand_cap_read_from_cache_quad_q2d
,
302 &snand_cap_program_load_x4
),
303 SNAND_INFO("EM73C044SNF", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x09),
304 SNAND_MEMORG_1G_2K_128
,
305 &snand_cap_read_from_cache_quad_q2d
,
306 &snand_cap_program_load_x4
),
307 SNAND_INFO("EM73C044VCA", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x18),
308 SNAND_MEMORG_1G_2K_64
,
309 &snand_cap_read_from_cache_quad_q2d
,
310 &snand_cap_program_load_x4
),
311 SNAND_INFO("EM73C044SNA", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x19),
312 SNAND_MEMORG(2048, 64, 128, 512, 1, 1),
313 &snand_cap_read_from_cache_quad_q2d
,
314 &snand_cap_program_load_x4
),
315 SNAND_INFO("EM73C044VCD", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x1c),
316 SNAND_MEMORG_1G_2K_64
,
317 &snand_cap_read_from_cache_quad_q2d
,
318 &snand_cap_program_load_x4
),
319 SNAND_INFO("EM73C044SND", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x1d),
320 SNAND_MEMORG_1G_2K_64
,
321 &snand_cap_read_from_cache_quad_q2d
,
322 &snand_cap_program_load_x4
),
323 SNAND_INFO("EM73D044SND", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x1e),
324 SNAND_MEMORG_2G_2K_64
,
325 &snand_cap_read_from_cache_quad_q2d
,
326 &snand_cap_program_load_x4
),
327 SNAND_INFO("EM73C044VCC", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x22),
328 SNAND_MEMORG_1G_2K_64
,
329 &snand_cap_read_from_cache_quad_q2d
,
330 &snand_cap_program_load_x4
),
331 SNAND_INFO("EM73C044VCF", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x25),
332 SNAND_MEMORG_1G_2K_64
,
333 &snand_cap_read_from_cache_quad_q2d
,
334 &snand_cap_program_load_x4
),
335 SNAND_INFO("EM73C044SNC", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x31),
336 SNAND_MEMORG_1G_2K_128
,
337 &snand_cap_read_from_cache_quad_q2d
,
338 &snand_cap_program_load_x4
),
339 SNAND_INFO("EM73D044SNC", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x0a),
340 SNAND_MEMORG_2G_2K_120
,
341 &snand_cap_read_from_cache_quad_q2d
,
342 &snand_cap_program_load_x4
),
343 SNAND_INFO("EM73D044SNA", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x12),
344 SNAND_MEMORG_2G_2K_128
,
345 &snand_cap_read_from_cache_quad_q2d
,
346 &snand_cap_program_load_x4
),
347 SNAND_INFO("EM73D044SNF", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x10),
348 SNAND_MEMORG_2G_2K_128
,
349 &snand_cap_read_from_cache_quad_q2d
,
350 &snand_cap_program_load_x4
),
351 SNAND_INFO("EM73D044VCA", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x13),
352 SNAND_MEMORG_2G_2K_128
,
353 &snand_cap_read_from_cache_quad_q2d
,
354 &snand_cap_program_load_x4
),
355 SNAND_INFO("EM73D044VCB", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x14),
356 SNAND_MEMORG_2G_2K_64
,
357 &snand_cap_read_from_cache_quad_q2d
,
358 &snand_cap_program_load_x4
),
359 SNAND_INFO("EM73D044VCD", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x17),
360 SNAND_MEMORG_2G_2K_128
,
361 &snand_cap_read_from_cache_quad_q2d
,
362 &snand_cap_program_load_x4
),
363 SNAND_INFO("EM73D044VCH", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x1b),
364 SNAND_MEMORG_2G_2K_64
,
365 &snand_cap_read_from_cache_quad_q2d
,
366 &snand_cap_program_load_x4
),
367 SNAND_INFO("EM73D044SND", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x1d),
368 SNAND_MEMORG_2G_2K_64
,
369 &snand_cap_read_from_cache_quad_q2d
,
370 &snand_cap_program_load_x4
),
371 SNAND_INFO("EM73D044VCG", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x1f),
372 SNAND_MEMORG_2G_2K_64
,
373 &snand_cap_read_from_cache_quad_q2d
,
374 &snand_cap_program_load_x4
),
375 SNAND_INFO("EM73D044VCE", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x20),
376 SNAND_MEMORG_2G_2K_64
,
377 &snand_cap_read_from_cache_quad_q2d
,
378 &snand_cap_program_load_x4
),
379 SNAND_INFO("EM73D044VCL", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x2e),
380 SNAND_MEMORG_2G_2K_128
,
381 &snand_cap_read_from_cache_quad_q2d
,
382 &snand_cap_program_load_x4
),
383 SNAND_INFO("EM73D044SNB", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x32),
384 SNAND_MEMORG_2G_2K_128
,
385 &snand_cap_read_from_cache_quad_q2d
,
386 &snand_cap_program_load_x4
),
387 SNAND_INFO("EM73E044SNA", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x03),
388 SNAND_MEMORG_4G_4K_256
,
389 &snand_cap_read_from_cache_quad_q2d
,
390 &snand_cap_program_load_x4
),
391 SNAND_INFO("EM73E044SND", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x0b),
392 SNAND_MEMORG_4G_4K_240
,
393 &snand_cap_read_from_cache_quad_q2d
,
394 &snand_cap_program_load_x4
),
395 SNAND_INFO("EM73E044SNB", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x23),
396 SNAND_MEMORG_4G_4K_256
,
397 &snand_cap_read_from_cache_quad_q2d
,
398 &snand_cap_program_load_x4
),
399 SNAND_INFO("EM73E044VCA", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x2c),
400 SNAND_MEMORG_4G_4K_256
,
401 &snand_cap_read_from_cache_quad_q2d
,
402 &snand_cap_program_load_x4
),
403 SNAND_INFO("EM73E044VCB", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x2f),
404 SNAND_MEMORG_4G_2K_128
,
405 &snand_cap_read_from_cache_quad_q2d
,
406 &snand_cap_program_load_x4
),
407 SNAND_INFO("EM73F044SNA", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x24),
408 SNAND_MEMORG_8G_4K_256
,
409 &snand_cap_read_from_cache_quad_q2d
,
410 &snand_cap_program_load_x4
),
411 SNAND_INFO("EM73F044VCA", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x2d),
412 SNAND_MEMORG_8G_4K_256
,
413 &snand_cap_read_from_cache_quad_q2d
,
414 &snand_cap_program_load_x4
),
415 SNAND_INFO("EM73E044SNE", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x0e),
416 SNAND_MEMORG_8G_4K_256
,
417 &snand_cap_read_from_cache_quad_q2d
,
418 &snand_cap_program_load_x4
),
419 SNAND_INFO("EM73C044SNG", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x0c),
420 SNAND_MEMORG_1G_2K_120
,
421 &snand_cap_read_from_cache_quad_q2d
,
422 &snand_cap_program_load_x4
),
423 SNAND_INFO("EM73D044VCN", SNAND_ID(SNAND_ID_DYMMY
, 0xd5, 0x0f),
424 SNAND_MEMORG_2G_2K_64
,
425 &snand_cap_read_from_cache_quad_q2d
,
426 &snand_cap_program_load_x4
),
428 SNAND_INFO("FM35Q1GA", SNAND_ID(SNAND_ID_DYMMY
, 0xe5, 0x71),
429 SNAND_MEMORG_1G_2K_64
,
430 &snand_cap_read_from_cache_x4
,
431 &snand_cap_program_load_x4
),
433 SNAND_INFO("PN26G01A", SNAND_ID(SNAND_ID_DYMMY
, 0xa1, 0xe1),
434 SNAND_MEMORG_1G_2K_128
,
435 &snand_cap_read_from_cache_quad_q2d
,
436 &snand_cap_program_load_x4
),
437 SNAND_INFO("PN26G02A", SNAND_ID(SNAND_ID_DYMMY
, 0xa1, 0xe2),
438 SNAND_MEMORG_2G_2K_128
,
439 &snand_cap_read_from_cache_quad_q2d
,
440 &snand_cap_program_load_x4
),
442 SNAND_INFO("IS37SML01G1", SNAND_ID(SNAND_ID_DYMMY
, 0xc8, 0x21),
443 SNAND_MEMORG_1G_2K_64
,
444 &snand_cap_read_from_cache_x4
,
445 &snand_cap_program_load_x4
),
447 SNAND_INFO("ATO25D1GA", SNAND_ID(SNAND_ID_DYMMY
, 0x9b, 0x12),
448 SNAND_MEMORG_1G_2K_64
,
449 &snand_cap_read_from_cache_x4_only
,
450 &snand_cap_program_load_x4
),
452 SNAND_INFO("HYF1GQ4U", SNAND_ID(SNAND_ID_DYMMY
, 0xc9, 0x51),
453 SNAND_MEMORG_1G_2K_128
,
454 &snand_cap_read_from_cache_quad_q2d
,
455 &snand_cap_program_load_x4
),
456 SNAND_INFO("HYF2GQ4U", SNAND_ID(SNAND_ID_DYMMY
, 0xc9, 0x52),
457 SNAND_MEMORG_2G_2K_128
,
458 &snand_cap_read_from_cache_quad_q2d
,
459 &snand_cap_program_load_x4
),
462 static int mtk_snand_winbond_select_die(struct mtk_snand
*snf
, uint32_t dieidx
)
467 snand_log_chip(snf
->pdev
, "Invalid die index %u\n", dieidx
);
471 op
[0] = SNAND_CMD_WINBOND_SELECT_DIE
;
472 op
[1] = (uint8_t)dieidx
;
474 return mtk_snand_mac_io(snf
, op
, sizeof(op
), NULL
, 0);
477 static int mtk_snand_micron_select_die(struct mtk_snand
*snf
, uint32_t dieidx
)
482 snand_log_chip(snf
->pdev
, "Invalid die index %u\n", dieidx
);
486 ret
= mtk_snand_set_feature(snf
, SNAND_FEATURE_MICRON_DIE_ADDR
,
487 SNAND_MICRON_DIE_SEL_1
);
489 snand_log_chip(snf
->pdev
,
490 "Failed to set die selection feature\n");
497 const struct snand_flash_info
*snand_flash_id_lookup(enum snand_id_type type
,
500 const struct snand_id
*fid
;
503 for (i
= 0; i
< ARRAY_SIZE(snand_flash_ids
); i
++) {
504 if (snand_flash_ids
[i
].id
.type
!= type
)
507 fid
= &snand_flash_ids
[i
].id
;
508 if (memcmp(fid
->id
, id
, fid
->len
))
511 return &snand_flash_ids
[i
];