nand_register() and nand_init() is generic API for both
RAW and SPI NAND's. We have to move this functions
from drivers/mtd/nand/raw/nand.c to drivers/mtd/nand/core.c.

Functions designed to work with RAW NAND should remain
in drivers/mtd/nand/raw/nand.c.

Signed-off-by: Alexey Romanov <avroma...@salutedevices.com>
---
 drivers/mtd/Kconfig          |   2 +-
 drivers/mtd/nand/Kconfig     |  10 +++
 drivers/mtd/nand/core.c      | 136 +++++++++++++++++++++++++++++++++++
 drivers/mtd/nand/raw/Kconfig |  10 ---
 drivers/mtd/nand/raw/nand.c  | 134 ----------------------------------
 include/nand.h               |   2 +
 6 files changed, 149 insertions(+), 145 deletions(-)

diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index c56840c849..1902351719 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -260,7 +260,7 @@ config SYS_NAND_MAX_ECCPOS
 
 config SYS_NAND_MAX_CHIPS
        int "NAND max chips"
-       depends on MTD_RAW_NAND || CMD_ONENAND || TARGET_S5PC210_UNIVERSAL || \
+       depends on MTD_RAW_NAND || MTD_SPI_NAND || CMD_ONENAND || 
TARGET_S5PC210_UNIVERSAL || \
                SPL_OMAP3_ID_NAND
        default 1
        help
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
index 78ae04bdcb..9a1d4ac0dc 100644
--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -1,6 +1,16 @@
 config MTD_NAND_CORE
        tristate
 
+config SYS_MAX_NAND_DEVICE
+       int "Maximum number of NAND devices to support"
+       default 1
+
+config SYS_NAND_SELF_INIT
+       bool
+       help
+         This option, if enabled, provides more flexible and linux-like
+         NAND initialization process.
+
 source "drivers/mtd/nand/raw/Kconfig"
 
 source "drivers/mtd/nand/spi/Kconfig"
diff --git a/drivers/mtd/nand/core.c b/drivers/mtd/nand/core.c
index 4b9dd6a926..ff298e3a0f 100644
--- a/drivers/mtd/nand/core.c
+++ b/drivers/mtd/nand/core.c
@@ -10,6 +10,7 @@
 #define pr_fmt(fmt)    "nand: " fmt
 
 #include <common.h>
+#include <nand.h>
 #include <watchdog.h>
 #ifndef __UBOOT__
 #include <linux/compat.h>
@@ -18,6 +19,12 @@
 #include <linux/bitops.h>
 #include <linux/mtd/nand.h>
 
+int nand_curr_device = -1;
+
+static struct mtd_info *nand_info[CONFIG_SYS_MAX_NAND_DEVICE];
+static char dev_name[CONFIG_SYS_MAX_NAND_DEVICE][8];
+static unsigned long total_nand_size; /* in kiB */
+
 /**
  * nanddev_isbad() - Check if a block is bad
  * @nand: NAND device
@@ -250,6 +257,135 @@ void nanddev_cleanup(struct nand_device *nand)
 }
 EXPORT_SYMBOL_GPL(nanddev_cleanup);
 
+struct mtd_info *get_nand_dev_by_index(int dev)
+{
+       if (dev < 0 || dev >= CONFIG_SYS_MAX_NAND_DEVICE || !nand_info[dev] ||
+           !nand_info[dev]->name)
+               return NULL;
+
+       return nand_info[dev];
+}
+EXPORT_SYMBOL_GPL(get_nand_dev_by_index);
+
+int nand_mtd_to_devnum(struct mtd_info *mtd)
+{
+       int i;
+
+       for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++) {
+               if (mtd && get_nand_dev_by_index(i) == mtd)
+                       return i;
+       }
+
+       return -ENODEV;
+}
+EXPORT_SYMBOL_GPL(nand_mtd_to_devnum);
+
+/* Register an initialized NAND mtd device with the U-Boot NAND command. */
+int nand_register(int devnum, struct mtd_info *mtd)
+{
+       if (devnum >= CONFIG_SYS_MAX_NAND_DEVICE)
+               return -EINVAL;
+
+       nand_info[devnum] = mtd;
+
+       sprintf(dev_name[devnum], "nand%d", devnum);
+       mtd->name = dev_name[devnum];
+
+#ifdef CONFIG_MTD
+       /*
+        * Add MTD device so that we can reference it later
+        * via the mtdcore infrastructure (e.g. ubi).
+        */
+       add_mtd_device(mtd);
+#endif
+
+       total_nand_size += mtd->size / 1024;
+
+       if (nand_curr_device == -1)
+               nand_curr_device = devnum;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nand_register);
+
+#ifdef CONFIG_MTD_CONCAT
+static void create_mtd_concat(void)
+{
+       struct mtd_info *nand_info_list[CONFIG_SYS_MAX_NAND_DEVICE];
+       int nand_devices_found = 0;
+       int i;
+
+       for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++) {
+               struct mtd_info *mtd = get_nand_dev_by_index(i);
+               if (mtd != NULL) {
+                       nand_info_list[nand_devices_found] = mtd;
+                       nand_devices_found++;
+               }
+       }
+       if (nand_devices_found > 1) {
+               struct mtd_info *mtd;
+               char c_mtd_name[16];
+
+               /*
+                * We detected multiple devices. Concatenate them together.
+                */
+               sprintf(c_mtd_name, "nand%d", nand_devices_found);
+               mtd = mtd_concat_create(nand_info_list, nand_devices_found,
+                                       c_mtd_name);
+
+               if (mtd == NULL)
+                       return;
+
+               nand_register(nand_devices_found, mtd);
+       }
+
+       return;
+}
+#else
+static void create_mtd_concat(void)
+{
+}
+#endif
+
+unsigned long nand_size(void)
+{
+       return total_nand_size;
+}
+EXPORT_SYMBOL_GPL(nand_size);
+
+void nand_init(void)
+{
+       static int initialized;
+
+       /*
+        * Avoid initializing NAND Flash multiple times,
+        * otherwise it will calculate a wrong total size.
+        */
+       if (initialized)
+               return;
+       initialized = 1;
+
+#if CONFIG_IS_ENABLED(SYS_NAND_SELF_INIT)
+       board_nand_init();
+#else
+       int i;
+
+       for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
+               nand_init_chip(i);
+#endif
+
+#ifdef CONFIG_SYS_NAND_SELECT_DEVICE
+       /*
+        * Select the chip in the board/cpu specific driver
+        */
+       
board_nand_select_device(mtd_to_nand(get_nand_dev_by_index(nand_curr_device)),
+                                nand_curr_device);
+#endif
+
+       create_mtd_concat();
+}
+EXPORT_SYMBOL_GPL(nand_init);
+
 MODULE_DESCRIPTION("Generic NAND framework");
 MODULE_AUTHOR("Boris Brezillon <boris.brezil...@free-electrons.com>");
 MODULE_LICENSE("GPL v2");
diff --git a/drivers/mtd/nand/raw/Kconfig b/drivers/mtd/nand/raw/Kconfig
index f0100a601d..31949f1dff 100644
--- a/drivers/mtd/nand/raw/Kconfig
+++ b/drivers/mtd/nand/raw/Kconfig
@@ -3,12 +3,6 @@ menuconfig MTD_RAW_NAND
        bool "Raw NAND Device Support"
 if MTD_RAW_NAND
 
-config SYS_NAND_SELF_INIT
-       bool
-       help
-         This option, if enabled, provides more flexible and linux-like
-         NAND initialization process.
-
 config SPL_SYS_NAND_SELF_INIT
        bool
        depends on !SPL_NAND_SIMPLE
@@ -29,10 +23,6 @@ config TPL_NAND_INIT
 config SPL_NAND_INIT
        bool
 
-config SYS_MAX_NAND_DEVICE
-       int "Maximum number of NAND devices to support"
-       default 1
-
 config SYS_NAND_DRIVER_ECC_LAYOUT
        bool "Omit standard ECC layouts to save space"
        help
diff --git a/drivers/mtd/nand/raw/nand.c b/drivers/mtd/nand/raw/nand.c
index eacd99c4e2..edca824d77 100644
--- a/drivers/mtd/nand/raw/nand.c
+++ b/drivers/mtd/nand/raw/nand.c
@@ -15,68 +15,10 @@
 #define CFG_SYS_NAND_BASE_LIST { CFG_SYS_NAND_BASE }
 #endif
 
-int nand_curr_device = -1;
-
-static struct mtd_info *nand_info[CONFIG_SYS_MAX_NAND_DEVICE];
-
 #if !CONFIG_IS_ENABLED(SYS_NAND_SELF_INIT)
 static struct nand_chip nand_chip[CONFIG_SYS_MAX_NAND_DEVICE];
 static ulong base_address[CONFIG_SYS_MAX_NAND_DEVICE] = CFG_SYS_NAND_BASE_LIST;
-#endif
-
-static char dev_name[CONFIG_SYS_MAX_NAND_DEVICE][8];
-
-static unsigned long total_nand_size; /* in kiB */
-
-struct mtd_info *get_nand_dev_by_index(int dev)
-{
-       if (dev < 0 || dev >= CONFIG_SYS_MAX_NAND_DEVICE || !nand_info[dev] ||
-           !nand_info[dev]->name)
-               return NULL;
 
-       return nand_info[dev];
-}
-
-int nand_mtd_to_devnum(struct mtd_info *mtd)
-{
-       int i;
-
-       for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++) {
-               if (mtd && get_nand_dev_by_index(i) == mtd)
-                       return i;
-       }
-
-       return -ENODEV;
-}
-
-/* Register an initialized NAND mtd device with the U-Boot NAND command. */
-int nand_register(int devnum, struct mtd_info *mtd)
-{
-       if (devnum >= CONFIG_SYS_MAX_NAND_DEVICE)
-               return -EINVAL;
-
-       nand_info[devnum] = mtd;
-
-       sprintf(dev_name[devnum], "nand%d", devnum);
-       mtd->name = dev_name[devnum];
-
-#ifdef CONFIG_MTD
-       /*
-        * Add MTD device so that we can reference it later
-        * via the mtdcore infrastructure (e.g. ubi).
-        */
-       add_mtd_device(mtd);
-#endif
-
-       total_nand_size += mtd->size / 1024;
-
-       if (nand_curr_device == -1)
-               nand_curr_device = devnum;
-
-       return 0;
-}
-
-#if !CONFIG_IS_ENABLED(SYS_NAND_SELF_INIT)
 static void nand_init_chip(int i)
 {
        struct nand_chip *nand = &nand_chip[i];
@@ -98,79 +40,3 @@ static void nand_init_chip(int i)
        nand_register(i, mtd);
 }
 #endif
-
-#ifdef CONFIG_MTD_CONCAT
-static void create_mtd_concat(void)
-{
-       struct mtd_info *nand_info_list[CONFIG_SYS_MAX_NAND_DEVICE];
-       int nand_devices_found = 0;
-       int i;
-
-       for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++) {
-               struct mtd_info *mtd = get_nand_dev_by_index(i);
-               if (mtd != NULL) {
-                       nand_info_list[nand_devices_found] = mtd;
-                       nand_devices_found++;
-               }
-       }
-       if (nand_devices_found > 1) {
-               struct mtd_info *mtd;
-               char c_mtd_name[16];
-
-               /*
-                * We detected multiple devices. Concatenate them together.
-                */
-               sprintf(c_mtd_name, "nand%d", nand_devices_found);
-               mtd = mtd_concat_create(nand_info_list, nand_devices_found,
-                                       c_mtd_name);
-
-               if (mtd == NULL)
-                       return;
-
-               nand_register(nand_devices_found, mtd);
-       }
-
-       return;
-}
-#else
-static void create_mtd_concat(void)
-{
-}
-#endif
-
-unsigned long nand_size(void)
-{
-       return total_nand_size;
-}
-
-void nand_init(void)
-{
-       static int initialized;
-
-       /*
-        * Avoid initializing NAND Flash multiple times,
-        * otherwise it will calculate a wrong total size.
-        */
-       if (initialized)
-               return;
-       initialized = 1;
-
-#if CONFIG_IS_ENABLED(SYS_NAND_SELF_INIT)
-       board_nand_init();
-#else
-       int i;
-
-       for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
-               nand_init_chip(i);
-#endif
-
-#ifdef CONFIG_SYS_NAND_SELECT_DEVICE
-       /*
-        * Select the chip in the board/cpu specific driver
-        */
-       
board_nand_select_device(mtd_to_nand(get_nand_dev_by_index(nand_curr_device)),
-                                nand_curr_device);
-#endif
-
-       create_mtd_concat();
-}
diff --git a/include/nand.h b/include/nand.h
index 70c1286ccb..16cfc2a24a 100644
--- a/include/nand.h
+++ b/include/nand.h
@@ -25,6 +25,8 @@ int nand_register(int devnum, struct mtd_info *mtd);
 struct nand_chip;
 
 extern int board_nand_init(struct nand_chip *nand);
+
+void nand_init_chip(int index);
 #endif
 
 extern int nand_curr_device;
-- 
2.30.1

Reply via email to