Call SPI setup_for_spinand() if supported and defined to configure the
SPI slave for the attached NAND. This is needed to configure the SPI
with the NAND page size and spare size for correct configuration of the
device.

Call it as soon as the NAND is detected to correctly handle SPI
controller with select_op_variant detection.

Signed-off-by: Christian Marangi <ansuels...@gmail.com>
---
 drivers/mtd/nand/spi/core.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
index f5ddfbf4b83..3a1e7e18736 100644
--- a/drivers/mtd/nand/spi/core.c
+++ b/drivers/mtd/nand/spi/core.c
@@ -941,6 +941,19 @@ spinand_select_op_variant(struct spinand_device *spinand,
        return NULL;
 }
 
+static int spinand_setup_slave(struct spinand_device *spinand,
+                              const struct spinand_info *spinand_info)
+{
+       struct spi_slave *slave = spinand->slave;
+       struct udevice *bus = slave->dev->parent;
+       struct dm_spi_ops *ops = spi_get_ops(bus);
+
+       if (!ops->setup_for_spinand)
+               return 0;
+
+       return ops->setup_for_spinand(slave, spinand_info);
+}
+
 /**
  * spinand_match_and_init() - Try to find a match between a device ID and an
  *                           entry in a spinand_info table
@@ -964,6 +977,7 @@ int spinand_match_and_init(struct spinand_device *spinand,
        u8 *id = spinand->id.data;
        struct nand_device *nand = spinand_to_nand(spinand);
        unsigned int i;
+       int ret;
 
        for (i = 0; i < table_size; i++) {
                const struct spinand_info *info = &table[i];
@@ -975,6 +989,10 @@ int spinand_match_and_init(struct spinand_device *spinand,
                if (memcmp(id + 1, info->devid.id, info->devid.len))
                        continue;
 
+               ret = spinand_setup_slave(spinand, info);
+               if (ret)
+                       return ret;
+
                nand->memorg = table[i].memorg;
                nand->eccreq = table[i].eccreq;
                spinand->eccinfo = table[i].eccinfo;
-- 
2.48.1

Reply via email to