126
126
#define STR_DATA BIT(0)
127
127
128
128
#define NFI_STA 0x060
129
- #define NFI_NAND_FSM GENMASK(28, 24)
129
+ #define NFI_NAND_FSM_7622 GENMASK(28, 24)
130
+ #define NFI_NAND_FSM_7986 GENMASK(29, 23)
130
131
#define NFI_FSM GENMASK(19, 16)
131
132
#define READ_EMPTY BIT(12)
132
133
158
159
#define MAS_WR GENMASK(5, 3)
159
160
#define MAS_RDDLY GENMASK(2, 0)
160
161
#define NFI_MASTERSTA_MASK_7622 (MAS_ADDR | MAS_RD | MAS_WR | MAS_RDDLY)
162
+ #define NFI_MASTERSTA_MASK_7986 3
161
163
162
164
// SNFI registers
163
165
#define SNF_MAC_CTL 0x500
220
222
221
223
static const u8 mt7622_spare_sizes [] = { 16 , 26 , 27 , 28 };
222
224
225
+ static const u8 mt7986_spare_sizes [] = {
226
+ 16 , 26 , 27 , 28 , 32 , 36 , 40 , 44 , 48 , 49 , 50 , 51 , 52 , 62 , 61 , 63 , 64 , 67 ,
227
+ 74
228
+ };
229
+
223
230
struct mtk_snand_caps {
224
231
u16 sector_size ;
225
232
u16 max_sectors ;
@@ -230,6 +237,7 @@ struct mtk_snand_caps {
230
237
bool bbm_swap ;
231
238
bool empty_page_check ;
232
239
u32 mastersta_mask ;
240
+ u32 nandfsm_mask ;
233
241
234
242
const u8 * spare_sizes ;
235
243
u32 num_spare_size ;
@@ -244,6 +252,7 @@ static const struct mtk_snand_caps mt7622_snand_caps = {
244
252
.bbm_swap = false,
245
253
.empty_page_check = false,
246
254
.mastersta_mask = NFI_MASTERSTA_MASK_7622 ,
255
+ .nandfsm_mask = NFI_NAND_FSM_7622 ,
247
256
.spare_sizes = mt7622_spare_sizes ,
248
257
.num_spare_size = ARRAY_SIZE (mt7622_spare_sizes )
249
258
};
@@ -257,10 +266,25 @@ static const struct mtk_snand_caps mt7629_snand_caps = {
257
266
.bbm_swap = true,
258
267
.empty_page_check = false,
259
268
.mastersta_mask = NFI_MASTERSTA_MASK_7622 ,
269
+ .nandfsm_mask = NFI_NAND_FSM_7622 ,
260
270
.spare_sizes = mt7622_spare_sizes ,
261
271
.num_spare_size = ARRAY_SIZE (mt7622_spare_sizes )
262
272
};
263
273
274
+ static const struct mtk_snand_caps mt7986_snand_caps = {
275
+ .sector_size = 1024 ,
276
+ .max_sectors = 8 ,
277
+ .fdm_size = 8 ,
278
+ .fdm_ecc_size = 1 ,
279
+ .fifo_size = 64 ,
280
+ .bbm_swap = true,
281
+ .empty_page_check = true,
282
+ .mastersta_mask = NFI_MASTERSTA_MASK_7986 ,
283
+ .nandfsm_mask = NFI_NAND_FSM_7986 ,
284
+ .spare_sizes = mt7986_spare_sizes ,
285
+ .num_spare_size = ARRAY_SIZE (mt7986_spare_sizes )
286
+ };
287
+
264
288
struct mtk_snand_conf {
265
289
size_t page_size ;
266
290
size_t oob_size ;
@@ -360,7 +384,7 @@ static int mtk_nfi_reset(struct mtk_snand *snf)
360
384
}
361
385
362
386
ret = readl_poll_timeout (snf -> nfi_base + NFI_STA , val ,
363
- !(val & (NFI_FSM | NFI_NAND_FSM )), 0 ,
387
+ !(val & (NFI_FSM | snf -> caps -> nandfsm_mask )), 0 ,
364
388
SNFI_POLL_INTERVAL );
365
389
if (ret ) {
366
390
dev_err (snf -> dev , "Failed to reset NFI\n" );
@@ -1295,6 +1319,7 @@ static irqreturn_t mtk_snand_irq(int irq, void *id)
1295
1319
static const struct of_device_id mtk_snand_ids [] = {
1296
1320
{ .compatible = "mediatek,mt7622-snand" , .data = & mt7622_snand_caps },
1297
1321
{ .compatible = "mediatek,mt7629-snand" , .data = & mt7629_snand_caps },
1322
+ { .compatible = "mediatek,mt7986-snand" , .data = & mt7986_snand_caps },
1298
1323
{},
1299
1324
};
1300
1325
0 commit comments