1818
1919#define W25N04KV_STATUS_ECC_5_8_BITFLIPS (3 << 4)
2020
21+ #define W25N0XJW_SR4 0xD0
22+ #define W25N0XJW_SR4_HS BIT(2)
23+
2124/*
2225 * "X2" in the core is equivalent to "dual output" in the datasheets,
2326 * "X4" in the core is equivalent to "quad output" in the datasheets.
@@ -42,10 +45,12 @@ static SPINAND_OP_VARIANTS(update_cache_octal_variants,
4245static SPINAND_OP_VARIANTS (read_cache_dual_quad_dtr_variants ,
4346 SPINAND_PAGE_READ_FROM_CACHE_1S_4D_4D_OP (0 , 8 , NULL , 0 , 80 * HZ_PER_MHZ ),
4447 SPINAND_PAGE_READ_FROM_CACHE_1S_1D_4D_OP (0 , 2 , NULL, 0 , 80 * HZ_PER_MHZ ),
48+ SPINAND_PAGE_READ_FROM_CACHE_1S_4S_4S_OP (0 , 4 , NULL, 0 , 0 ),
4549 SPINAND_PAGE_READ_FROM_CACHE_1S_4S_4S_OP (0 , 2 , NULL, 0 , 104 * HZ_PER_MHZ ),
4650 SPINAND_PAGE_READ_FROM_CACHE_1S_1S_4S_OP (0 , 1 , NULL, 0 , 0 ),
4751 SPINAND_PAGE_READ_FROM_CACHE_1S_2D_2D_OP (0 , 4 , NULL, 0 , 80 * HZ_PER_MHZ ),
4852 SPINAND_PAGE_READ_FROM_CACHE_1S_1D_2D_OP (0 , 2 , NULL, 0 , 80 * HZ_PER_MHZ ),
53+ SPINAND_PAGE_READ_FROM_CACHE_1S_2S_2S_OP (0 , 2 , NULL, 0 , 0 ),
4954 SPINAND_PAGE_READ_FROM_CACHE_1S_2S_2S_OP (0 , 1 , NULL, 0 , 104 * HZ_PER_MHZ ),
5055 SPINAND_PAGE_READ_FROM_CACHE_1S_1S_2S_OP (0 , 1 , NULL, 0 , 0 ),
5156 SPINAND_PAGE_READ_FROM_CACHE_1S_1D_1D_OP (0 , 2 , NULL, 0 , 80 * HZ_PER_MHZ ),
@@ -230,6 +235,40 @@ static int w25n02kv_ecc_get_status(struct spinand_device *spinand,
230235 return - EINVAL ;
231236}
232237
238+ static int w25n0xjw_hs_cfg (struct spinand_device * spinand )
239+ {
240+ const struct spi_mem_op * op ;
241+ bool hs ;
242+ u8 sr4 ;
243+ int ret ;
244+
245+ op = spinand -> op_templates .read_cache ;
246+ if (op -> cmd .dtr || op -> addr .dtr || op -> dummy .dtr || op -> data .dtr )
247+ hs = false;
248+ else if (op -> cmd .buswidth == 1 && op -> addr .buswidth == 1 &&
249+ op -> dummy .buswidth == 1 && op -> data .buswidth == 1 )
250+ hs = false;
251+ else if (!op -> max_freq )
252+ hs = true;
253+ else
254+ hs = false;
255+
256+ ret = spinand_read_reg_op (spinand , W25N0XJW_SR4 , & sr4 );
257+ if (ret )
258+ return ret ;
259+
260+ if (hs )
261+ sr4 |= W25N0XJW_SR4_HS ;
262+ else
263+ sr4 &= ~W25N0XJW_SR4_HS ;
264+
265+ ret = spinand_write_reg_op (spinand , W25N0XJW_SR4 , sr4 );
266+ if (ret )
267+ return ret ;
268+
269+ return 0 ;
270+ }
271+
233272static const struct spinand_info winbond_spinand_table [] = {
234273 /* 512M-bit densities */
235274 SPINAND_INFO ("W25N512GW" , /* 1.8V */
@@ -268,7 +307,8 @@ static const struct spinand_info winbond_spinand_table[] = {
268307 & write_cache_variants ,
269308 & update_cache_variants ),
270309 0 ,
271- SPINAND_ECCINFO (& w25m02gv_ooblayout , NULL )),
310+ SPINAND_ECCINFO (& w25m02gv_ooblayout , NULL ),
311+ SPINAND_CONFIGURE_CHIP (w25n0xjw_hs_cfg )),
272312 SPINAND_INFO ("W25N01KV" , /* 3.3V */
273313 SPINAND_ID (SPINAND_READID_METHOD_OPCODE_DUMMY , 0xae , 0x21 ),
274314 NAND_MEMORG (1 , 2048 , 96 , 64 , 1024 , 20 , 1 , 1 , 1 ),
@@ -324,7 +364,8 @@ static const struct spinand_info winbond_spinand_table[] = {
324364 & write_cache_variants ,
325365 & update_cache_variants ),
326366 0 ,
327- SPINAND_ECCINFO (& w25m02gv_ooblayout , NULL )),
367+ SPINAND_ECCINFO (& w25m02gv_ooblayout , NULL ),
368+ SPINAND_CONFIGURE_CHIP (w25n0xjw_hs_cfg )),
328369 SPINAND_INFO ("W25N02KV" , /* 3.3V */
329370 SPINAND_ID (SPINAND_READID_METHOD_OPCODE_DUMMY , 0xaa , 0x22 ),
330371 NAND_MEMORG (1 , 2048 , 128 , 64 , 2048 , 40 , 1 , 1 , 1 ),
0 commit comments