|
17 | 17 |
|
18 | 18 | #define SPINOR_OP_CLSR 0x30 /* Clear status register 1 */
|
19 | 19 | #define SPINOR_OP_CLPEF 0x82 /* Clear program/erase failure flags */
|
| 20 | +#define SPINOR_OP_CYPRESS_EX4B 0xB8 /* Exit 4-byte address mode */ |
20 | 21 | #define SPINOR_OP_CYPRESS_DIE_ERASE 0x61 /* Chip (die) erase */
|
21 | 22 | #define SPINOR_OP_RD_ANY_REG 0x65 /* Read any register */
|
22 | 23 | #define SPINOR_OP_WR_ANY_REG 0x71 /* Write any register */
|
|
58 | 59 | SPI_MEM_OP_DUMMY(ndummy, 0), \
|
59 | 60 | SPI_MEM_OP_DATA_IN(1, buf, 0))
|
60 | 61 |
|
| 62 | +#define CYPRESS_NOR_EN4B_EX4B_OP(enable) \ |
| 63 | + SPI_MEM_OP(SPI_MEM_OP_CMD(enable ? SPINOR_OP_EN4B : \ |
| 64 | + SPINOR_OP_CYPRESS_EX4B, 0), \ |
| 65 | + SPI_MEM_OP_NO_ADDR, \ |
| 66 | + SPI_MEM_OP_NO_DUMMY, \ |
| 67 | + SPI_MEM_OP_NO_DATA) |
| 68 | + |
61 | 69 | #define SPANSION_OP(opcode) \
|
62 | 70 | SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 0), \
|
63 | 71 | SPI_MEM_OP_NO_ADDR, \
|
@@ -356,6 +364,20 @@ static int cypress_nor_quad_enable_volatile(struct spi_nor *nor)
|
356 | 364 | return 0;
|
357 | 365 | }
|
358 | 366 |
|
| 367 | +static int cypress_nor_set_4byte_addr_mode(struct spi_nor *nor, bool enable) |
| 368 | +{ |
| 369 | + int ret; |
| 370 | + struct spi_mem_op op = CYPRESS_NOR_EN4B_EX4B_OP(enable); |
| 371 | + |
| 372 | + spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); |
| 373 | + |
| 374 | + ret = spi_mem_exec_op(nor->spimem, &op); |
| 375 | + if (ret) |
| 376 | + dev_dbg(nor->dev, "error %d setting 4-byte mode\n", ret); |
| 377 | + |
| 378 | + return ret; |
| 379 | +} |
| 380 | + |
359 | 381 | /**
|
360 | 382 | * cypress_nor_determine_addr_mode_by_sr1() - Determine current address mode
|
361 | 383 | * (3 or 4-byte) by querying status
|
@@ -526,6 +548,9 @@ s25fs256t_post_bfpt_fixup(struct spi_nor *nor,
|
526 | 548 | struct spi_mem_op op;
|
527 | 549 | int ret;
|
528 | 550 |
|
| 551 | + /* Assign 4-byte address mode method that is not determined in BFPT */ |
| 552 | + nor->params->set_4byte_addr_mode = cypress_nor_set_4byte_addr_mode; |
| 553 | + |
529 | 554 | ret = cypress_nor_set_addr_mode_nbytes(nor);
|
530 | 555 | if (ret)
|
531 | 556 | return ret;
|
@@ -591,6 +616,9 @@ s25hx_t_post_bfpt_fixup(struct spi_nor *nor,
|
591 | 616 | {
|
592 | 617 | int ret;
|
593 | 618 |
|
| 619 | + /* Assign 4-byte address mode method that is not determined in BFPT */ |
| 620 | + nor->params->set_4byte_addr_mode = cypress_nor_set_4byte_addr_mode; |
| 621 | + |
594 | 622 | ret = cypress_nor_set_addr_mode_nbytes(nor);
|
595 | 623 | if (ret)
|
596 | 624 | return ret;
|
@@ -718,6 +746,9 @@ static int s28hx_t_post_bfpt_fixup(struct spi_nor *nor,
|
718 | 746 | const struct sfdp_parameter_header *bfpt_header,
|
719 | 747 | const struct sfdp_bfpt *bfpt)
|
720 | 748 | {
|
| 749 | + /* Assign 4-byte address mode method that is not determined in BFPT */ |
| 750 | + nor->params->set_4byte_addr_mode = cypress_nor_set_4byte_addr_mode; |
| 751 | + |
721 | 752 | return cypress_nor_set_addr_mode_nbytes(nor);
|
722 | 753 | }
|
723 | 754 |
|
|
0 commit comments