[PATCH] mtd: spi-nor: Add support for flash reset
Abbarapu, Venkatesh
venkatesh.abbarapu at amd.com
Mon Nov 11 05:18:12 CET 2024
Hi,
> -----Original Message-----
> From: Quentin Schulz <quentin.schulz at cherry.de>
> Sent: Monday, October 28, 2024 3:48 PM
> To: Abbarapu, Venkatesh <venkatesh.abbarapu at amd.com>; u-boot at lists.denx.de
> Cc: Simek, Michal <michal.simek at amd.com>; jagan at amarulasolutions.com;
> vigneshr at ti.com; p.yadav at ti.com; trini at konsulko.com; tudor.ambarus at linaro.org;
> marex at denx.de; sjg at chromium.org; git (AMD-Xilinx) <git at amd.com>
> Subject: Re: [PATCH] mtd: spi-nor: Add support for flash reset
>
> Hi Venkatesh Yadav Abbarapu,
>
> On 10/28/24 8:03 AM, Venkatesh Yadav Abbarapu wrote:
> > 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.abbarapu at amd.com>
> > ---
> > drivers/mtd/spi/spi-nor-core.c | 44 ++++++++++++++++++++++++++++++++++
> > include/linux/mtd/spi-nor.h | 1 +
> > 2 files changed, 45 insertions(+)
> >
> > diff --git a/drivers/mtd/spi/spi-nor-core.c
> > b/drivers/mtd/spi/spi-nor-core.c index f5c9868bbc..900f66b0e8 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>
> > @@ -4401,7 +4402,13 @@ int spi_nor_remove(struct spi_nor *nor)
> > nor->flags & SNOR_F_SOFT_RESET)
> > return spi_nor_soft_reset(nor);
> > #endif
> > + if (CONFIG_IS_ENABLED(DM_GPIO)) {
> > + if (nor->flash_gpio_reset) {
> > + struct gpio_desc *flash_gpio_reset = nor->flash_gpio_reset;
> >
> > + dm_gpio_free(flash_gpio_reset->dev, flash_gpio_reset);
>
> Since we get the gpio descriptor with a devres-managed function, I think this is
> unnecessary as the core should do it by itself when removing
>
> > + }
> > + }
> > return 0;
> > }
> >
> > @@ -4448,6 +4455,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);
>
> This is a bit odd, I would have assumed a proper reset like mmc-pwrseq-emmc or
> mmc-pwrseq-simple but for nor would have been more appropriate than just
> guessing which timing would cover all NORs?
These delays have been updated by looking at different flash vendor datasheets as per below reference
https://github.com/torvalds/linux/blob/master/drivers/mtd/spi-nor/core.c#L3428
Do you have anything with respect to these delay values?
Thanks
Venkatesh
>
> > + }
> > + return 0;
> > +}
> > +
> > int spi_nor_scan(struct spi_nor *nor)
> > {
> > struct spi_nor_flash_parameter params; @@ -4473,6 +4511,12 @@ int
> > spi_nor_scan(struct spi_nor *nor)
>
> This function also exists in spi-nor-tiny, should we add support for the hw-reset there
> as well?
>
> Cheers,
> Quentin
More information about the U-Boot
mailing list