Add support for spi-nor flash reset via GPIO controller by reading the reset-gpios property.
[Ported from Linux kernel commit 8f1ee9ef71d0 ("mtd: spi-nor: Add support for flash reset") ] Signed-off-by: Venkatesh Yadav Abbarapu <venkatesh.abbar...@amd.com> --- Changes in v2: - Removed the code from spi_nor_remove() as gpio descriptor is managed by DEVRES. --- drivers/mtd/spi/spi-nor-core.c | 38 ++++++++++++++++++++++++++++++++++ include/linux/mtd/spi-nor.h | 1 + 2 files changed, 39 insertions(+) diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c index ec841fb13b..93a7d046c0 100644 --- a/drivers/mtd/spi/spi-nor-core.c +++ b/drivers/mtd/spi/spi-nor-core.c @@ -12,6 +12,7 @@ #include <display_options.h> #include <log.h> #include <watchdog.h> +#include <asm/gpio.h> #include <dm.h> #include <dm/device_compat.h> #include <dm/devres.h> @@ -4415,6 +4416,37 @@ void spi_nor_set_fixups(struct spi_nor *nor) #endif /* SPI_FLASH_MACRONIX */ } +static int spi_nor_hw_reset(struct spi_nor *nor) +{ + struct udevice *dev = nor->spi->dev; + int rc; + + nor->flash_gpio_reset = devm_gpiod_get_optional(dev, "reset", + GPIOD_IS_OUT | GPIOD_ACTIVE_LOW); + + if (nor->flash_gpio_reset) { + /* + * Experimental delay values by looking at different flash device + * vendors datasheets. + */ + udelay(5); + + /* Toggle gpio to reset the flash device. */ + rc = dm_gpio_set_value(nor->flash_gpio_reset, 1); + if (rc) + return rc; + + udelay(150); + + rc = dm_gpio_set_value(nor->flash_gpio_reset, 0); + if (rc) + return rc; + + udelay(1200); + } + return 0; +} + int spi_nor_scan(struct spi_nor *nor) { struct spi_nor_flash_parameter params; @@ -4440,6 +4472,12 @@ int spi_nor_scan(struct spi_nor *nor) nor->setup = spi_nor_default_setup; + if (CONFIG_IS_ENABLED(DM_GPIO)) { + ret = spi_nor_hw_reset(nor); + if (ret) + return ret; + } + #ifdef CONFIG_SPI_FLASH_SOFT_RESET_ON_BOOT /* * When the flash is handed to us in a stateful mode like 8D-8D-8D, it diff --git a/include/linux/mtd/spi-nor.h b/include/linux/mtd/spi-nor.h index b8b207f7b5..eb2e9c90b2 100644 --- a/include/linux/mtd/spi-nor.h +++ b/include/linux/mtd/spi-nor.h @@ -583,6 +583,7 @@ struct spi_nor { u8 cmd_buf[SPI_NOR_MAX_CMD_SIZE]; enum spi_nor_cmd_ext cmd_ext_type; struct spi_nor_fixups *fixups; + struct gpio_desc *flash_gpio_reset; int (*setup)(struct spi_nor *nor, const struct flash_info *info, const struct spi_nor_flash_parameter *params); -- 2.17.1