[U-Boot] [PATCH 1/2] dm: sf: Make SST flash write op work again

Jagan Teki jagannadh.teki at gmail.com
Fri Apr 24 10:07:18 CEST 2015


Hi Bin,

On 23 April 2015 at 14:30, Bin Meng <bmeng.cn at gmail.com> wrote:
> With SPI flash moving to driver model, commit fbb0991 "dm: Convert
> spi_flash_probe() and 'sf probe' to use driver model" ignored the
> SST flash-specific write op (byte program & word program), which
> actually broke the SST flash from wroking.
>
> This commit makes SST flash work again under driver model, by adding
> a new SST flash-specific driver to handle the different write op
> from the standard one.
>
> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
> ---
>
>  drivers/mtd/spi/sf_probe.c | 31 +++++++++++++++++++++++++++++++
>  1 file changed, 31 insertions(+)
>
> diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
> index d19138d..47438d2 100644
> --- a/drivers/mtd/spi/sf_probe.c
> +++ b/drivers/mtd/spi/sf_probe.c
> @@ -511,4 +511,35 @@ U_BOOT_DRIVER(spi_flash_std) = {
>         .ops            = &spi_flash_std_ops,
>  };
>
> +int spi_flash_sst_write(struct udevice *dev, u32 offset, size_t len,
> +                       const void *buf)
> +{
> +       struct spi_flash *flash = dev_get_uclass_priv(dev);
> +
> +       if (flash->spi->op_mode_tx & SPI_OPM_TX_BP)
> +               return sst_write_bp(flash, offset, len, buf);
> +       else
> +               return sst_write_wp(flash, offset, len, buf);
> +}
> +
> +static const struct dm_spi_flash_ops spi_flash_sst_ops = {
> +       .read = spi_flash_std_read,
> +       .write = spi_flash_sst_write,
> +       .erase = spi_flash_std_erase,
> +};
> +
> +static const struct udevice_id spi_flash_sst_ids[] = {
> +       { .compatible = "spi-flash-sst" },
> +       { }
> +};
> +
> +U_BOOT_DRIVER(spi_flash_sst) = {
> +       .name           = "spi_flash_sst",
> +       .id             = UCLASS_SPI_FLASH,
> +       .of_match       = spi_flash_sst_ids,
> +       .probe          = spi_flash_std_probe,
> +       .priv_auto_alloc_size = sizeof(struct spi_flash),
> +       .ops            = &spi_flash_sst_ops,
> +};
> +
>  #endif /* CONFIG_DM_SPI_FLASH */
> --
> 1.8.2.1

I'm just curiosity to see different approach of being code duplicate
with just for sst write call.

What about this-
int spi_flash_std_write(struct udevice *dev, u32 offset, size_t len,
                        const void *buf)
{
        struct spi_flash *flash = dev_get_uclass_priv(dev);

if defined(CONFIG_SPI_FLASH_SST)
        if (flash->flags & SST_WR) {
                if (flash->spi->op_mode_tx & SPI_OPM_TX_BP)
                        return sst_write_bp(flash, offset, len, buf);
                else
                        return sst_write_wp(flash, offset, len, buf);
         }
#endif

        return spi_flash_cmd_write_ops(flash, offset, len, buf);
}

Of course this requires extra flags member in spi_flash, any other thoughts?

thanks!
-- 
Jagan.


More information about the U-Boot mailing list