mtd: rawnand: omap_gpmc: Add SPL NAND support
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
This commit is contained in:
parent
ff0d078942
commit
b747090705
@ -26,6 +26,9 @@ config TPL_SYS_NAND_SELF_INIT
|
|||||||
config TPL_NAND_INIT
|
config TPL_NAND_INIT
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
config SPL_NAND_INIT
|
||||||
|
bool
|
||||||
|
|
||||||
config SYS_MAX_NAND_DEVICE
|
config SYS_MAX_NAND_DEVICE
|
||||||
int "Maximum number of NAND devices to support"
|
int "Maximum number of NAND devices to support"
|
||||||
default 1
|
default 1
|
||||||
@ -254,6 +257,8 @@ config NAND_OMAP_GPMC
|
|||||||
bool "Support OMAP GPMC NAND controller"
|
bool "Support OMAP GPMC NAND controller"
|
||||||
depends on ARCH_OMAP2PLUS || ARCH_KEYSTONE || ARCH_K3
|
depends on ARCH_OMAP2PLUS || ARCH_KEYSTONE || ARCH_K3
|
||||||
select SYS_NAND_SELF_INIT if 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
|
help
|
||||||
Enables omap_gpmc.c driver for OMAPx and AMxxxx platforms.
|
Enables omap_gpmc.c driver for OMAPx and AMxxxx platforms.
|
||||||
GPMC controller is used for parallel NAND flash devices, and can
|
GPMC controller is used for parallel NAND flash devices, and can
|
||||||
|
@ -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_macronix.o nand_micron.o \
|
||||||
nand_samsung.o nand_toshiba.o
|
nand_samsung.o nand_toshiba.o
|
||||||
obj-$(CONFIG_SPL_NAND_IDENT) += nand_ids.o nand_timings.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)
|
ifeq ($(CONFIG_SPL_ENV_SUPPORT),y)
|
||||||
obj-$(CONFIG_ENV_IS_IN_NAND) += nand_util.o
|
obj-$(CONFIG_ENV_IS_IN_NAND) += nand_util.o
|
||||||
endif
|
endif
|
||||||
|
@ -1263,3 +1263,43 @@ int board_nand_init(struct nand_chip *nand)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_SYS_NAND_SELF_INIT */
|
#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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user