]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
spi: cadence_qspi: Select flash subnode at runtime
authorUdit Kumar <u-kumar1@ti.com>
Tue, 12 Sep 2023 09:50:35 +0000 (15:20 +0530)
committerJagan Teki <jagan@amarulasolutions.com>
Sat, 9 Dec 2023 11:13:00 +0000 (16:43 +0530)
Currently spi driver gets flash parameter from first subnode.

Few boards have more than one flash with different parameters
and selection of flash is done by on board switch settings.
In such case, uboot needs to be recompiled with updated
device tree to align with board switch settings.

This patch allows to select flash node at runtime.

Boards those are supporting multiple flashes
needs to implement cadence_qspi_get_subnode function and return correct
flash node.

Cc: Apurva Nandan <a-nandan@ti.com>
Signed-off-by: Udit Kumar <u-kumar1@ti.com>
Reviewed-by: Neha Malcom Francis <n-francis@ti.com>
Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
drivers/spi/cadence_qspi.c
drivers/spi/cadence_qspi.h

index cc3a54f2958283147f281902b3e38b29766adce1..eb7fbf83d013af9f299e8bccae954ca9582c2909 100644 (file)
@@ -40,6 +40,11 @@ __weak int cadence_qspi_versal_flash_reset(struct udevice *dev)
        return 0;
 }
 
+__weak ofnode cadence_qspi_get_subnode(struct udevice *dev)
+{
+       return dev_read_first_subnode(dev);
+}
+
 static int cadence_spi_write_speed(struct udevice *bus, uint hz)
 {
        struct cadence_spi_priv *priv = dev_get_priv(bus);
@@ -401,7 +406,7 @@ static int cadence_spi_of_to_plat(struct udevice *bus)
        plat->is_dma = dev_read_bool(bus, "cdns,is-dma");
 
        /* All other parameters are embedded in the child node */
-       subnode = dev_read_first_subnode(bus);
+       subnode = cadence_qspi_get_subnode(bus);
        if (!ofnode_valid(subnode)) {
                printf("Error: subnode with SPI flash config missing!\n");
                return -ENODEV;
index 1c59d1a9d9a2d94a2581bd0fb267ffe948842923..12825f8911ce09c09ca6354a0c32ea2ca87c2f1d 100644 (file)
@@ -304,6 +304,7 @@ int cadence_qspi_apb_dma_read(struct cadence_spi_priv *priv,
 int cadence_qspi_apb_wait_for_dma_cmplt(struct cadence_spi_priv *priv);
 int cadence_qspi_apb_exec_flash_cmd(void *reg_base, unsigned int reg);
 int cadence_qspi_versal_flash_reset(struct udevice *dev);
+ofnode cadence_qspi_get_subnode(struct udevice *dev);
 void cadence_qspi_apb_enable_linear_mode(bool enable);
 
 #endif /* __CADENCE_QSPI_H__ */