mtd: spi-nor: Do not change nor->addr_nbytes at SFDP parsing time
authorTudor Ambarus <tudor.ambarus@microchip.com>
Mon, 25 Jul 2022 09:25:01 +0000 (12:25 +0300)
committerTudor Ambarus <tudor.ambarus@microchip.com>
Thu, 28 Jul 2022 02:11:56 +0000 (05:11 +0300)
At the SFDP parsing time we should not change members of struct spi_nor,
but instead fill members of struct spi_nor_flash_parameters which could
later on be used by callers. The caller will then decide if SFDP params
should be used and more importantly when they should be used. Clean the
code flow and don't initialize nor->addr_nbytes at SFDP parsing time.

Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
Tested-by: Takahiro Kuwano <Takahiro.Kuwano@infineon.com>
Reviewed-by: Michael Walle <michael@walle.cc>
Reviewed-by: Pratyush Yadav <p.yadav@ti.com>
Link: https://lore.kernel.org/r/20220725092505.446315-4-tudor.ambarus@microchip.com
drivers/mtd/spi-nor/core.c
drivers/mtd/spi-nor/core.h
drivers/mtd/spi-nor/issi.c
drivers/mtd/spi-nor/sfdp.c

index 31604188ee59f6b80f1f54c1357557c152261395..9f07f10361512578ff376a8f2a3bf7f92486dfe0 100644 (file)
@@ -2251,8 +2251,8 @@ static int spi_nor_default_setup(struct spi_nor *nor,
 
 static int spi_nor_set_addr_nbytes(struct spi_nor *nor)
 {
-       if (nor->addr_nbytes) {
-               /* already configured from SFDP */
+       if (nor->params->addr_nbytes) {
+               nor->addr_nbytes = nor->params->addr_nbytes;
        } else if (nor->read_proto == SNOR_PROTO_8_8_8_DTR) {
                /*
                 * In 8D-8D-8D mode, one byte takes half a cycle to transfer. So
@@ -2492,7 +2492,6 @@ static void spi_nor_sfdp_init_params_deprecated(struct spi_nor *nor)
 
        if (spi_nor_parse_sfdp(nor)) {
                memcpy(nor->params, &sfdp_params, sizeof(*nor->params));
-               nor->addr_nbytes = 0;
                nor->flags &= ~SNOR_F_4B_OPCODES;
        }
 }
index 19a692e27c92297eb346b4dd75af656bebf4ba66..7dc4cda41db326466a7ebd31b3ebf49e2f294655 100644 (file)
@@ -340,6 +340,7 @@ struct spi_nor_otp {
  * @writesize          Minimal writable flash unit size. Defaults to 1. Set to
  *                     ECC unit size for ECC-ed flashes.
  * @page_size:         the page size of the SPI NOR flash memory.
+ * @addr_nbytes:       number of address bytes to send.
  * @rdsr_dummy:                dummy cycles needed for Read Status Register command
  *                     in octal DTR mode.
  * @rdsr_addr_nbytes:  dummy address bytes needed for Read Status Register
@@ -372,6 +373,7 @@ struct spi_nor_flash_parameter {
        u64                             size;
        u32                             writesize;
        u32                             page_size;
+       u8                              addr_nbytes;
        u8                              rdsr_dummy;
        u8                              rdsr_addr_nbytes;
 
index 71687e5babdc0a2d17e518e5eccb372d5bc85f5f..89a66a19d754f2b0002576b16909fb673e8fad9b 100644 (file)
@@ -20,7 +20,7 @@ is25lp256_post_bfpt_fixups(struct spi_nor *nor,
         */
        if ((bfpt->dwords[BFPT_DWORD(1)] & BFPT_DWORD1_ADDRESS_BYTES_MASK) ==
                BFPT_DWORD1_ADDRESS_BYTES_3_ONLY)
-               nor->addr_nbytes = 4;
+               nor->params->addr_nbytes = 4;
 
        return 0;
 }
index 61ae8c8c52374a7d4ba6042ad681f5a3acf25329..3a48173a2d7827b9e75d89390cbaab4b0c3505b7 100644 (file)
@@ -462,11 +462,11 @@ static int spi_nor_parse_bfpt(struct spi_nor *nor,
        switch (bfpt.dwords[BFPT_DWORD(1)] & BFPT_DWORD1_ADDRESS_BYTES_MASK) {
        case BFPT_DWORD1_ADDRESS_BYTES_3_ONLY:
        case BFPT_DWORD1_ADDRESS_BYTES_3_OR_4:
-               nor->addr_nbytes = 3;
+               params->addr_nbytes = 3;
                break;
 
        case BFPT_DWORD1_ADDRESS_BYTES_4_ONLY:
-               nor->addr_nbytes = 4;
+               params->addr_nbytes = 4;
                break;
 
        default:
@@ -653,7 +653,7 @@ static u8 spi_nor_smpt_addr_nbytes(const struct spi_nor *nor, const u32 settings
                return 4;
        case SMPT_CMD_ADDRESS_LEN_USE_CURRENT:
        default:
-               return nor->addr_nbytes;
+               return nor->params->addr_nbytes;
        }
 }
 
@@ -1098,7 +1098,7 @@ static int spi_nor_parse_4bait(struct spi_nor *nor,
         * Spansion memory. However this quirk is no longer needed with new
         * SFDP compliant memories.
         */
-       nor->addr_nbytes = 4;
+       params->addr_nbytes = 4;
        nor->flags |= SNOR_F_4B_OPCODES | SNOR_F_HAS_4BAIT;
 
        /* fall through */