Hi Jagan, On Fri, Apr 24, 2015 at 4:07 PM, Jagan Teki <jagannadh.t...@gmail.com> wrote: > 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? >
Yep, this way works too. Let me know which way you prefer and I can respin a v2. Regards, Bin _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot