Hi Bin, On 23 April 2015 at 14:30, Bin Meng <bmeng...@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...@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. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot