]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
mtd: rawnand: omap_gpmc: Add SPL NAND support
authorRoger Quadros <rogerq@kernel.org>
Tue, 20 Dec 2022 10:22:00 +0000 (12:22 +0200)
committerDario Binacchi <dario.binacchi@amarulasolutions.com>
Sun, 8 Jan 2023 09:38:50 +0000 (10:38 +0100)
Enables SPL NAND support for ARCH_K3 by enabling
SPL_NAND_INIT and SPL_SYS_NAND_SELF_INIT.

Legacy OMAP2plus platforms still rely on SPL_NAND_AM33XX_BCH
instead.

Signed-off-by: Roger Quadros <rogerq@kernel.org>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
Link: https://lore.kernel.org/all/20221220102203.52398-6-rogerq@kernel.org
drivers/mtd/nand/raw/Kconfig
drivers/mtd/nand/raw/Makefile
drivers/mtd/nand/raw/omap_gpmc.c

index 87ed4a22d644b5ae3a7b9a6c80a86c6d6f559d2e..7f2f49c5600f6349dfd34c6cb5f504e513f8e0ac 100644 (file)
@@ -26,6 +26,9 @@ config TPL_SYS_NAND_SELF_INIT
 config TPL_NAND_INIT
        bool
 
+config SPL_NAND_INIT
+       bool
+
 config SYS_MAX_NAND_DEVICE
        int "Maximum number of NAND devices to support"
        default 1
@@ -254,6 +257,8 @@ config NAND_OMAP_GPMC
        bool "Support OMAP GPMC NAND controller"
        depends on ARCH_OMAP2PLUS || ARCH_KEYSTONE || ARCH_K3
        select SYS_NAND_SELF_INIT if ARCH_K3
+       select SPL_NAND_INIT if ARCH_K3
+       select SPL_SYS_NAND_SELF_INIT if ARCH_K3
        help
          Enables omap_gpmc.c driver for OMAPx and AMxxxx platforms.
          GPMC controller is used for parallel NAND flash devices, and can
index a398aa9d88647adfd921ef48fa2f1997e9c9f23d..6fe33d2485b96534adb5061067e5e7f25856372c 100644 (file)
@@ -18,7 +18,7 @@ obj-$(CONFIG_SPL_NAND_BASE) += nand_base.o nand_amd.o nand_hynix.o \
                                nand_macronix.o nand_micron.o \
                                nand_samsung.o nand_toshiba.o
 obj-$(CONFIG_SPL_NAND_IDENT) += nand_ids.o nand_timings.o
-obj-$(CONFIG_TPL_NAND_INIT) += nand.o
+obj-$(CONFIG_$(SPL_TPL_)NAND_INIT) += nand.o
 ifeq ($(CONFIG_SPL_ENV_SUPPORT),y)
 obj-$(CONFIG_ENV_IS_IN_NAND) += nand_util.o
 endif
index fa60c371c2da28a63c3dd767f3e2a7407ca11b80..4d5f2455df3e247a9c9f4a3824ac988603a75c75 100644 (file)
@@ -1263,3 +1263,43 @@ int board_nand_init(struct nand_chip *nand)
 }
 
 #endif /* CONFIG_SYS_NAND_SELF_INIT */
+
+#if defined(CONFIG_SPL_NAND_INIT)
+
+/* nand_init() is provided by nand.c */
+
+/* Unselect after operation */
+void nand_deselect(void)
+{
+       struct mtd_info *mtd = nand_to_mtd(nand_chip);
+
+       if (nand_chip->select_chip)
+               nand_chip->select_chip(mtd, -1);
+}
+
+static int nand_is_bad_block(int block)
+{
+       struct mtd_info *mtd = nand_to_mtd(nand_chip);
+
+       loff_t ofs = block * CONFIG_SYS_NAND_BLOCK_SIZE;
+
+       return nand_chip->block_bad(mtd, ofs);
+}
+
+static int nand_read_page(int block, int page, uchar *dst)
+{
+       int page_addr = block * CONFIG_SYS_NAND_PAGE_COUNT + page;
+       loff_t ofs = page_addr * CONFIG_SYS_NAND_PAGE_SIZE;
+       int ret;
+       size_t len = CONFIG_SYS_NAND_PAGE_SIZE;
+       struct mtd_info *mtd = nand_to_mtd(nand_chip);
+
+       ret = nand_read(mtd, ofs, &len, dst);
+       if (ret)
+               printf("nand_read failed %d\n", ret);
+
+       return ret;
+}
+
+#include "nand_spl_loaders.c"
+#endif /* CONFIG_SPL_NAND_INIT */