@@ -4206,3 +4206,12 @@ int spi_flash_cmd_get_sw_write_prot(struct spi_nor *nor)
return (sr >> 2) & 7;
}
+
+__weak int spi_get_env_dev(void)
+{
+#ifdef CONFIG_ENV_SPI_BUS
+ return CONFIG_ENV_SPI_BUS;
+#else
+ return 0;
+#endif
+}
@@ -44,9 +44,10 @@ static int setup_flash_device(struct spi_flash **env_flash)
#if CONFIG_IS_ENABLED(DM_SPI_FLASH)
struct udevice *new;
int ret;
+ int dev = spi_get_env_dev();
/* speed and mode will be read from DT */
- ret = spi_flash_probe_bus_cs(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
+ ret = spi_flash_probe_bus_cs(dev, CONFIG_ENV_SPI_CS,
&new);
if (ret) {
env_set_default("spi_flash_probe_bus_cs() failed", 0);
@@ -743,4 +743,6 @@ int dm_spi_get_mmap(struct udevice *dev, ulong *map_basep, uint *map_sizep,
#define spi_get_ops(dev) ((struct dm_spi_ops *)(dev)->driver->ops)
#define spi_emul_get_ops(dev) ((struct dm_spi_emul_ops *)(dev)->driver->ops)
+int spi_get_env_dev(void);
+
#endif /* _SPI_H_ */
This enables boards to choose where to/from the environment should be saved/loaded. They can then for example support using the same device (dynamically) from which the bootloader was launched to load and save env data and do not have to define CONFIG_ENV_SPI_BUS statically. In my use case, the environment needs to be on the same device I booted from. It can be the QSPI or OSPI device. I therefore would override spi_get_env_dev in the board code, read the bootmode registers to determine where we booted from and return the corresponding device index. Signed-off-by: Venkatesh Yadav Abbarapu <venkatesh.abbarapu@amd.com> --- drivers/mtd/spi/spi-nor-core.c | 9 +++++++++ env/sf.c | 3 ++- include/spi.h | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-)