18
18
19
19
#define W25N04KV_STATUS_ECC_5_8_BITFLIPS (3 << 4)
20
20
21
+ #define W25N0XJW_SR4 0xD0
22
+ #define W25N0XJW_SR4_HS BIT(2)
23
+
21
24
/*
22
25
* "X2" in the core is equivalent to "dual output" in the datasheets,
23
26
* "X4" in the core is equivalent to "quad output" in the datasheets.
@@ -42,10 +45,12 @@ static SPINAND_OP_VARIANTS(update_cache_octal_variants,
42
45
static SPINAND_OP_VARIANTS (read_cache_dual_quad_dtr_variants ,
43
46
SPINAND_PAGE_READ_FROM_CACHE_1S_4D_4D_OP (0 , 8 , NULL , 0 , 80 * HZ_PER_MHZ ),
44
47
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 ),
45
49
SPINAND_PAGE_READ_FROM_CACHE_1S_4S_4S_OP (0 , 2 , NULL, 0 , 104 * HZ_PER_MHZ ),
46
50
SPINAND_PAGE_READ_FROM_CACHE_1S_1S_4S_OP (0 , 1 , NULL, 0 , 0 ),
47
51
SPINAND_PAGE_READ_FROM_CACHE_1S_2D_2D_OP (0 , 4 , NULL, 0 , 80 * HZ_PER_MHZ ),
48
52
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 ),
49
54
SPINAND_PAGE_READ_FROM_CACHE_1S_2S_2S_OP (0 , 1 , NULL, 0 , 104 * HZ_PER_MHZ ),
50
55
SPINAND_PAGE_READ_FROM_CACHE_1S_1S_2S_OP (0 , 1 , NULL, 0 , 0 ),
51
56
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,
230
235
return - EINVAL ;
231
236
}
232
237
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
+
233
272
static const struct spinand_info winbond_spinand_table [] = {
234
273
/* 512M-bit densities */
235
274
SPINAND_INFO ("W25N512GW" , /* 1.8V */
@@ -268,7 +307,8 @@ static const struct spinand_info winbond_spinand_table[] = {
268
307
& write_cache_variants ,
269
308
& update_cache_variants ),
270
309
0 ,
271
- SPINAND_ECCINFO (& w25m02gv_ooblayout , NULL )),
310
+ SPINAND_ECCINFO (& w25m02gv_ooblayout , NULL ),
311
+ SPINAND_CONFIGURE_CHIP (w25n0xjw_hs_cfg )),
272
312
SPINAND_INFO ("W25N01KV" , /* 3.3V */
273
313
SPINAND_ID (SPINAND_READID_METHOD_OPCODE_DUMMY , 0xae , 0x21 ),
274
314
NAND_MEMORG (1 , 2048 , 96 , 64 , 1024 , 20 , 1 , 1 , 1 ),
@@ -324,7 +364,8 @@ static const struct spinand_info winbond_spinand_table[] = {
324
364
& write_cache_variants ,
325
365
& update_cache_variants ),
326
366
0 ,
327
- SPINAND_ECCINFO (& w25m02gv_ooblayout , NULL )),
367
+ SPINAND_ECCINFO (& w25m02gv_ooblayout , NULL ),
368
+ SPINAND_CONFIGURE_CHIP (w25n0xjw_hs_cfg )),
328
369
SPINAND_INFO ("W25N02KV" , /* 3.3V */
329
370
SPINAND_ID (SPINAND_READID_METHOD_OPCODE_DUMMY , 0xaa , 0x22 ),
330
371
NAND_MEMORG (1 , 2048 , 128 , 64 , 2048 , 40 , 1 , 1 , 1 ),
0 commit comments