mtd: spi-nor: Introduce spi_nor_set_mtd_info()
authorTudor Ambarus <tudor.ambarus@microchip.com>
Tue, 7 Dec 2021 14:02:43 +0000 (16:02 +0200)
committerTudor Ambarus <tudor.ambarus@microchip.com>
Tue, 7 Dec 2021 15:05:10 +0000 (17:05 +0200)
Used to init all the mtd_info fields. Move the mtd_info init
the last thing in the spi_nor_scan(), so that we avoid superfluous
initialization of the mtd_info fields in case of errors.

While here use common naming scheme for functions that are setting
mtd_info fields:
s/spi_nor_register_locking_ops/spi_nor_set_mtd_locking_ops
s/spi_nor_otp_init/spi_nor_set_mtd_otp_ops
The functions names are self explanatory, get rid of the comment
for the OTP function.

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

index 5b9c827..dbb2c98 100644 (file)
@@ -3080,6 +3080,35 @@ static const struct flash_info *spi_nor_get_flash_info(struct spi_nor *nor,
        return info;
 }
 
+static void spi_nor_set_mtd_info(struct spi_nor *nor)
+{
+       struct mtd_info *mtd = &nor->mtd;
+       struct device *dev = nor->dev;
+
+       spi_nor_set_mtd_locking_ops(nor);
+       spi_nor_set_mtd_otp_ops(nor);
+
+       mtd->dev.parent = dev;
+       if (!mtd->name)
+               mtd->name = dev_name(dev);
+       mtd->type = MTD_NORFLASH;
+       mtd->flags = MTD_CAP_NORFLASH;
+       if (nor->info->flags & SPI_NOR_NO_ERASE)
+               mtd->flags |= MTD_NO_ERASE;
+       mtd->writesize = nor->params->writesize;
+       mtd->writebufsize = nor->params->page_size;
+       mtd->size = nor->params->size;
+       mtd->_erase = spi_nor_erase;
+       mtd->_read = spi_nor_read;
+       /* Might be already set by some SST flashes. */
+       if (!mtd->_write)
+               mtd->_write = spi_nor_write;
+       mtd->_suspend = spi_nor_suspend;
+       mtd->_resume = spi_nor_resume;
+       mtd->_get_device = spi_nor_get_device;
+       mtd->_put_device = spi_nor_put_device;
+}
+
 int spi_nor_scan(struct spi_nor *nor, const char *name,
                 const struct spi_nor_hwcaps *hwcaps)
 {
@@ -3134,26 +3163,11 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
        if (info->flags & SPI_NOR_HAS_LOCK)
                nor->flags |= SNOR_F_HAS_LOCK;
 
-       mtd->_write = spi_nor_write;
-
        /* Init flash parameters based on flash_info struct and SFDP */
        ret = spi_nor_init_params(nor);
        if (ret)
                return ret;
 
-       if (!mtd->name)
-               mtd->name = dev_name(dev);
-       mtd->type = MTD_NORFLASH;
-       mtd->writesize = nor->params->writesize;
-       mtd->flags = MTD_CAP_NORFLASH;
-       mtd->size = nor->params->size;
-       mtd->_erase = spi_nor_erase;
-       mtd->_read = spi_nor_read;
-       mtd->_suspend = spi_nor_suspend;
-       mtd->_resume = spi_nor_resume;
-       mtd->_get_device = spi_nor_get_device;
-       mtd->_put_device = spi_nor_put_device;
-
        if (info->flags & USE_FSR)
                nor->flags |= SNOR_F_USE_FSR;
        if (info->flags & SPI_NOR_HAS_TB) {
@@ -3175,12 +3189,6 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
                        nor->flags |= SNOR_F_HAS_SR_BP3_BIT6;
        }
 
-       if (info->flags & SPI_NOR_NO_ERASE)
-               mtd->flags |= MTD_NO_ERASE;
-
-       mtd->dev.parent = dev;
-       mtd->writebufsize = nor->params->page_size;
-
        if (of_property_read_bool(np, "broken-flash-reset"))
                nor->flags |= SNOR_F_BROKEN_RESET;
 
@@ -3204,15 +3212,13 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
        if (ret)
                return ret;
 
-       spi_nor_register_locking_ops(nor);
-
        /* Send all the required SPI flash commands to initialize device */
        ret = spi_nor_init(nor);
        if (ret)
                return ret;
 
-       /* Configure OTP parameters and ops */
-       spi_nor_otp_init(nor);
+       /* No mtd_info fields should be used up to this point. */
+       spi_nor_set_mtd_info(nor);
 
        dev_info(dev, "%s (%lld Kbytes)\n", info->name,
                        (long long)mtd->size >> 10);
index 50bae06..f6c4b6f 100644 (file)
@@ -552,8 +552,8 @@ int spi_nor_post_bfpt_fixups(struct spi_nor *nor,
 
 void spi_nor_init_default_locking_ops(struct spi_nor *nor);
 void spi_nor_try_unlock_all(struct spi_nor *nor);
-void spi_nor_register_locking_ops(struct spi_nor *nor);
-void spi_nor_otp_init(struct spi_nor *nor);
+void spi_nor_set_mtd_locking_ops(struct spi_nor *nor);
+void spi_nor_set_mtd_otp_ops(struct spi_nor *nor);
 
 static inline struct spi_nor *mtd_to_spi_nor(struct mtd_info *mtd)
 {
index 983e40b..fa63d85 100644 (file)
@@ -480,7 +480,7 @@ out:
        return ret;
 }
 
-void spi_nor_otp_init(struct spi_nor *nor)
+void spi_nor_set_mtd_otp_ops(struct spi_nor *nor)
 {
        struct mtd_info *mtd = &nor->mtd;
 
index 8594bcb..1f17831 100644 (file)
@@ -414,7 +414,7 @@ void spi_nor_try_unlock_all(struct spi_nor *nor)
                dev_dbg(nor->dev, "Failed to unlock the entire flash memory array\n");
 }
 
-void spi_nor_register_locking_ops(struct spi_nor *nor)
+void spi_nor_set_mtd_locking_ops(struct spi_nor *nor)
 {
        struct mtd_info *mtd = &nor->mtd;