mtd: spinand: Add spinand_init_flash() helper
authorPatrice Chotard <patrice.chotard@foss.st.com>
Wed, 2 Jun 2021 09:49:12 +0000 (11:49 +0200)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Fri, 18 Jun 2021 07:45:20 +0000 (09:45 +0200)
Add spinand_init_flash() helper which implement
all needed init for future SPI-NAND resume ops.

Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20210602094913.26472-3-patrice.chotard@foss.st.com
drivers/mtd/nand/spi/core.c

index a559f6107f78ca12a1ebad516621179bb02a1294..82a8f0f2c1571649951570316d974407aa5067f6 100644 (file)
@@ -1086,12 +1086,55 @@ static int spinand_detect(struct spinand_device *spinand)
        return 0;
 }
 
+static int spinand_init_flash(struct spinand_device *spinand)
+{
+       struct device *dev = &spinand->spimem->spi->dev;
+       struct nand_device *nand = spinand_to_nand(spinand);
+       int ret, i;
+
+       ret = spinand_read_cfg(spinand);
+       if (ret)
+               return ret;
+
+       ret = spinand_init_quad_enable(spinand);
+       if (ret)
+               return ret;
+
+       ret = spinand_upd_cfg(spinand, CFG_OTP_ENABLE, 0);
+       if (ret)
+               return ret;
+
+       ret = spinand_manufacturer_init(spinand);
+       if (ret) {
+               dev_err(dev,
+               "Failed to initialize the SPI NAND chip (err = %d)\n",
+               ret);
+               return ret;
+       }
+
+       /* After power up, all blocks are locked, so unlock them here. */
+       for (i = 0; i < nand->memorg.ntargets; i++) {
+               ret = spinand_select_target(spinand, i);
+               if (ret)
+                       break;
+
+               ret = spinand_lock_block(spinand, BL_ALL_UNLOCKED);
+               if (ret)
+                       break;
+       }
+
+       if (ret)
+               spinand_manufacturer_cleanup(spinand);
+
+       return ret;
+}
+
 static int spinand_init(struct spinand_device *spinand)
 {
        struct device *dev = &spinand->spimem->spi->dev;
        struct mtd_info *mtd = spinand_to_mtd(spinand);
        struct nand_device *nand = mtd_to_nanddev(mtd);
-       int ret, i;
+       int ret;
 
        /*
         * We need a scratch buffer because the spi_mem interface requires that
@@ -1124,26 +1167,10 @@ static int spinand_init(struct spinand_device *spinand)
        if (ret)
                goto err_free_bufs;
 
-       ret = spinand_read_cfg(spinand);
-       if (ret)
-               goto err_free_bufs;
-
-       ret = spinand_init_quad_enable(spinand);
-       if (ret)
-               goto err_free_bufs;
-
-       ret = spinand_upd_cfg(spinand, CFG_OTP_ENABLE, 0);
+       ret = spinand_init_flash(spinand);
        if (ret)
                goto err_free_bufs;
 
-       ret = spinand_manufacturer_init(spinand);
-       if (ret) {
-               dev_err(dev,
-                       "Failed to initialize the SPI NAND chip (err = %d)\n",
-                       ret);
-               goto err_free_bufs;
-       }
-
        ret = spinand_create_dirmaps(spinand);
        if (ret) {
                dev_err(dev,
@@ -1152,17 +1179,6 @@ static int spinand_init(struct spinand_device *spinand)
                goto err_manuf_cleanup;
        }
 
-       /* After power up, all blocks are locked, so unlock them here. */
-       for (i = 0; i < nand->memorg.ntargets; i++) {
-               ret = spinand_select_target(spinand, i);
-               if (ret)
-                       goto err_manuf_cleanup;
-
-               ret = spinand_lock_block(spinand, BL_ALL_UNLOCKED);
-               if (ret)
-                       goto err_manuf_cleanup;
-       }
-
        ret = nanddev_init(nand, &spinand_ops, THIS_MODULE);
        if (ret)
                goto err_manuf_cleanup;