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

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to