mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 07:31:15 +00:00
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:
parent
dc339bf784
commit
b7f060565e
3 changed files with 23 additions and 5 deletions
|
@ -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
|
||||||
|
|
|
@ -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) */
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue