126126#define STR_DATA BIT(0)
127127
128128#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)
130131#define NFI_FSM GENMASK(19, 16)
131132#define READ_EMPTY BIT(12)
132133
158159#define MAS_WR GENMASK(5, 3)
159160#define MAS_RDDLY GENMASK(2, 0)
160161#define NFI_MASTERSTA_MASK_7622 (MAS_ADDR | MAS_RD | MAS_WR | MAS_RDDLY)
162+ #define NFI_MASTERSTA_MASK_7986 3
161163
162164// SNFI registers
163165#define SNF_MAC_CTL 0x500
220222
221223static const u8 mt7622_spare_sizes [] = { 16 , 26 , 27 , 28 };
222224
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+
223230struct mtk_snand_caps {
224231 u16 sector_size ;
225232 u16 max_sectors ;
@@ -230,6 +237,7 @@ struct mtk_snand_caps {
230237 bool bbm_swap ;
231238 bool empty_page_check ;
232239 u32 mastersta_mask ;
240+ u32 nandfsm_mask ;
233241
234242 const u8 * spare_sizes ;
235243 u32 num_spare_size ;
@@ -244,6 +252,7 @@ static const struct mtk_snand_caps mt7622_snand_caps = {
244252 .bbm_swap = false,
245253 .empty_page_check = false,
246254 .mastersta_mask = NFI_MASTERSTA_MASK_7622 ,
255+ .nandfsm_mask = NFI_NAND_FSM_7622 ,
247256 .spare_sizes = mt7622_spare_sizes ,
248257 .num_spare_size = ARRAY_SIZE (mt7622_spare_sizes )
249258};
@@ -257,10 +266,25 @@ static const struct mtk_snand_caps mt7629_snand_caps = {
257266 .bbm_swap = true,
258267 .empty_page_check = false,
259268 .mastersta_mask = NFI_MASTERSTA_MASK_7622 ,
269+ .nandfsm_mask = NFI_NAND_FSM_7622 ,
260270 .spare_sizes = mt7622_spare_sizes ,
261271 .num_spare_size = ARRAY_SIZE (mt7622_spare_sizes )
262272};
263273
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+
264288struct mtk_snand_conf {
265289 size_t page_size ;
266290 size_t oob_size ;
@@ -360,7 +384,7 @@ static int mtk_nfi_reset(struct mtk_snand *snf)
360384 }
361385
362386 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 ,
364388 SNFI_POLL_INTERVAL );
365389 if (ret ) {
366390 dev_err (snf -> dev , "Failed to reset NFI\n" );
@@ -1295,6 +1319,7 @@ static irqreturn_t mtk_snand_irq(int irq, void *id)
12951319static const struct of_device_id mtk_snand_ids [] = {
12961320 { .compatible = "mediatek,mt7622-snand" , .data = & mt7622_snand_caps },
12971321 { .compatible = "mediatek,mt7629-snand" , .data = & mt7629_snand_caps },
1322+ { .compatible = "mediatek,mt7986-snand" , .data = & mt7986_snand_caps },
12981323 {},
12991324};
13001325
0 commit comments