mtd: spi-nor: allow registering multiple MTDs when DM is enabled

Currently when the SPI_FLASH_MTD config option is enabled, only one SPI
can be registered as MTD at any time - it is the last one probed (since
with old non-DM model only one SPI NOR could be probed at any time).

When DM is enabled, allow for registering multiple SPI NORs as MTDs by
utilizing the nor->mtd structure, which is filled in by spi_nor_scan
anyway, instead of filling a separate struct mtd_info.

Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Pali Rohár <pali@kernel.org>
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
Tested-by: Patrice Chotard <patrice.chotard@foss.st.com>
Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
Cc: Priyanka Jain <priyanka.jain@nxp.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Heiko Schocher <hs@denx.de>
Cc: Patrick Delaunay <patrick.delaunay@st.com>
This commit is contained in:
Marek Behún 2021-05-26 14:08:20 +02:00 committed by Jagan Teki
parent dc339bf784
commit b7f060565e
3 changed files with 23 additions and 5 deletions

View file

@ -81,14 +81,14 @@ int spi_flash_cmd_get_sw_write_prot(struct spi_flash *flash);
#if CONFIG_IS_ENABLED(SPI_FLASH_MTD) #if CONFIG_IS_ENABLED(SPI_FLASH_MTD)
int spi_flash_mtd_register(struct spi_flash *flash); int spi_flash_mtd_register(struct spi_flash *flash);
void spi_flash_mtd_unregister(void); void spi_flash_mtd_unregister(struct spi_flash *flash);
#else #else
static inline int spi_flash_mtd_register(struct spi_flash *flash) static inline int spi_flash_mtd_register(struct spi_flash *flash)
{ {
return 0; return 0;
} }
static inline void spi_flash_mtd_unregister(void) static inline void spi_flash_mtd_unregister(struct spi_flash *flash)
{ {
} }
#endif #endif

View file

@ -10,6 +10,20 @@
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <spi_flash.h> #include <spi_flash.h>
#if CONFIG_IS_ENABLED(DM_SPI_FLASH)
int spi_flash_mtd_register(struct spi_flash *flash)
{
return add_mtd_device(&flash->mtd);
}
void spi_flash_mtd_unregister(struct spi_flash *flash)
{
del_mtd_device(&flash->mtd);
}
#else /* !CONFIG_IS_ENABLED(DM_SPI_FLASH) */
static struct mtd_info sf_mtd_info; static struct mtd_info sf_mtd_info;
static bool sf_mtd_registered; static bool sf_mtd_registered;
static char sf_mtd_name[8]; static char sf_mtd_name[8];
@ -123,7 +137,7 @@ int spi_flash_mtd_register(struct spi_flash *flash)
return ret; return ret;
} }
void spi_flash_mtd_unregister(void) void spi_flash_mtd_unregister(struct spi_flash *flash)
{ {
int ret; int ret;
@ -146,3 +160,5 @@ void spi_flash_mtd_unregister(void)
printf("Failed to unregister MTD %s and the spi_flash object is going away: you're in deep trouble!", printf("Failed to unregister MTD %s and the spi_flash object is going away: you're in deep trouble!",
sf_mtd_info.name); sf_mtd_info.name);
} }
#endif /* !CONFIG_IS_ENABLED(DM_SPI_FLASH) */

View file

@ -84,7 +84,7 @@ struct spi_flash *spi_flash_probe(unsigned int busnum, unsigned int cs,
void spi_flash_free(struct spi_flash *flash) void spi_flash_free(struct spi_flash *flash)
{ {
if (CONFIG_IS_ENABLED(SPI_FLASH_MTD)) if (CONFIG_IS_ENABLED(SPI_FLASH_MTD))
spi_flash_mtd_unregister(); spi_flash_mtd_unregister(flash);
spi_free_slave(flash->spi); spi_free_slave(flash->spi);
free(flash); free(flash);
@ -150,8 +150,10 @@ int spi_flash_std_probe(struct udevice *dev)
static int spi_flash_std_remove(struct udevice *dev) static int spi_flash_std_remove(struct udevice *dev)
{ {
struct spi_flash *flash = dev_get_uclass_priv(dev);
if (CONFIG_IS_ENABLED(SPI_FLASH_MTD)) if (CONFIG_IS_ENABLED(SPI_FLASH_MTD))
spi_flash_mtd_unregister(); spi_flash_mtd_unregister(flash);
return 0; return 0;
} }