No functional changes, just some refactoring to match better linux
kernel driver.

changes:
 * move spinand configuration reading out from spinand_init_cfg_cache()
   to separate function spinand_read_cfg()
 * move spinand flash initialization to separate function
   spinand_init_flash()
 * move direct mapping initialization to the end of spinand_init()

Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevets...@iopsys.eu>
---
 drivers/mtd/nand/spi/core.c | 112 ++++++++++++++++++++++--------------
 1 file changed, 70 insertions(+), 42 deletions(-)

diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
index 9629fac3388..6ca8b7c80cc 100644
--- a/drivers/mtd/nand/spi/core.c
+++ b/drivers/mtd/nand/spi/core.c
@@ -160,20 +160,12 @@ int spinand_select_target(struct spinand_device *spinand, 
unsigned int target)
        return 0;
 }
 
-static int spinand_init_cfg_cache(struct spinand_device *spinand)
+static int spinand_read_cfg(struct spinand_device *spinand)
 {
        struct nand_device *nand = spinand_to_nand(spinand);
-       struct udevice *dev = spinand->slave->dev;
        unsigned int target;
        int ret;
 
-       spinand->cfg_cache = devm_kzalloc(dev,
-                                         sizeof(*spinand->cfg_cache) *
-                                         nand->memorg.ntargets,
-                                         GFP_KERNEL);
-       if (!spinand->cfg_cache)
-               return -ENOMEM;
-
        for (target = 0; target < nand->memorg.ntargets; target++) {
                ret = spinand_select_target(spinand, target);
                if (ret)
@@ -192,6 +184,21 @@ static int spinand_init_cfg_cache(struct spinand_device 
*spinand)
        return 0;
 }
 
+static int spinand_init_cfg_cache(struct spinand_device *spinand)
+{
+       struct nand_device *nand = spinand_to_nand(spinand);
+       struct udevice *dev = spinand->slave->dev;
+
+       spinand->cfg_cache = devm_kcalloc(dev,
+                                         nand->memorg.ntargets,
+                                         sizeof(*spinand->cfg_cache),
+                                         GFP_KERNEL);
+       if (!spinand->cfg_cache)
+               return -ENOMEM;
+
+       return 0;
+}
+
 static int spinand_init_quad_enable(struct spinand_device *spinand)
 {
        bool enable = false;
@@ -1073,11 +1080,55 @@ static const struct mtd_ooblayout_ops 
spinand_noecc_ooblayout = {
        .rfree = spinand_noecc_ooblayout_free,
 };
 
+static int spinand_init_flash(struct spinand_device *spinand)
+{
+       struct udevice *dev = spinand->slave->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 udevice *dev = spinand->slave->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
@@ -1110,41 +1161,10 @@ static int spinand_init(struct spinand_device *spinand)
        if (ret)
                goto err_free_bufs;
 
-       ret = spinand_init_quad_enable(spinand);
+       ret = spinand_init_flash(spinand);
        if (ret)
                goto err_free_bufs;
 
-       ret = spinand_upd_cfg(spinand, CFG_OTP_ENABLE, 0);
-       if (ret)
-               goto err_free_bufs;
-
-       ret = spinand_manufacturer_init(spinand);
-       if (ret) {
-               dev_err(spinand->slave->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(spinand->slave->dev,
-                       "Failed to create direct mappings for read/write 
operations (err = %d)\n",
-                       ret);
-               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;
@@ -1171,6 +1191,14 @@ static int spinand_init(struct spinand_device *spinand)
 
        mtd->oobavail = ret;
 
+       ret = spinand_create_dirmaps(spinand);
+       if (ret) {
+               dev_err(dev,
+                       "Failed to create direct mappings for read/write 
operations (err = %d)\n",
+                       ret);
+               goto err_cleanup_nanddev;
+       }
+
        return 0;
 
 err_cleanup_nanddev:
-- 
2.39.2

Reply via email to