cadence_spi_probe() currently invokes
xilinx_pm_request(PM_REQUEST_NODE, ...) directly, guarded by
IS_ENABLED(CONFIG_ZYNQMP_FIRMWARE).

Introduce zynqmp_pm_ospi_init() with a weak no-op default
implementation and a firmware-backed override in firmware-zynqmp.c that
performs the PM_REQUEST_NODE call. This removes the firmware-specific
conditional from the driver and keeps capability, QoS, and acknowledge
parameters encapsulated within the firmware layer. The probe() call
site checks and propagates the return value.

zynqmp_pm_ospi_init() only calls zynqmp_pm_request_node(), so it lives
next to it, outside the CONFIG_ZYNQMP_IPI-guarded block, for the same
reason.

Signed-off-by: Akshay Belsare <[email protected]>
---
 drivers/firmware/firmware-zynqmp.c |  6 ++++++
 drivers/spi/cadence_qspi.c         | 12 ++++++++----
 drivers/spi/cadence_qspi.h         |  1 +
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/firmware/firmware-zynqmp.c 
b/drivers/firmware/firmware-zynqmp.c
index 50a7f8c02e7..dad7fd086bf 100644
--- a/drivers/firmware/firmware-zynqmp.c
+++ b/drivers/firmware/firmware-zynqmp.c
@@ -852,6 +852,12 @@ int zynqmp_pm_request_node(const u32 node, const u32 
capabilities, const u32 qos
                                 ack, 0, 0, NULL);
 }
 
+int zynqmp_pm_ospi_init(void)
+{
+       return zynqmp_pm_request_node(PM_DEV_OSPI, ZYNQMP_PM_CAPABILITY_ACCESS,
+                                     ZYNQMP_PM_MAX_QOS, 
ZYNQMP_PM_REQUEST_ACK_NO);
+}
+
 static const struct udevice_id zynqmp_firmware_ids[] = {
        { .compatible = "xlnx,zynqmp-firmware", .data = (ulong)smc_call_legacy 
},
        { .compatible = "xlnx,versal-firmware", .data = (ulong)smc_call_legacy},
diff --git a/drivers/spi/cadence_qspi.c b/drivers/spi/cadence_qspi.c
index 984d4a39ded..31dfbe88d21 100644
--- a/drivers/spi/cadence_qspi.c
+++ b/drivers/spi/cadence_qspi.c
@@ -39,6 +39,11 @@ __weak int cadence_qspi_apb_dma_read(struct cadence_spi_priv 
*priv,
        return 0;
 }
 
+__weak int zynqmp_pm_ospi_init(void)
+{
+       return 0;
+}
+
 __weak int cadence_device_reset(struct udevice *dev)
 {
        return 0;
@@ -234,10 +239,9 @@ static int cadence_spi_probe(struct udevice *bus)
                debug("Cadence QSPI: DMA mode enabled\n");
        }
 
-       if (IS_ENABLED(CONFIG_ZYNQMP_FIRMWARE))
-               xilinx_pm_request(PM_REQUEST_NODE, PM_DEV_OSPI,
-                                 ZYNQMP_PM_CAPABILITY_ACCESS, 
ZYNQMP_PM_MAX_QOS,
-                                 ZYNQMP_PM_REQUEST_ACK_NO, 0, 0, NULL);
+       ret = zynqmp_pm_ospi_init();
+       if (ret)
+               return ret;
 
        if (priv->ref_clk_hz == 0) {
                ret = clk_get_by_index(bus, 0, &clk);
diff --git a/drivers/spi/cadence_qspi.h b/drivers/spi/cadence_qspi.h
index 1e9081c2d17..f8716aa8c7d 100644
--- a/drivers/spi/cadence_qspi.h
+++ b/drivers/spi/cadence_qspi.h
@@ -317,6 +317,7 @@ int cadence_qspi_apb_exec_flash_cmd(void *reg_base, 
unsigned int reg);
 int cadence_qspi_flash_reset(struct udevice *dev);
 ofnode cadence_qspi_get_subnode(struct udevice *dev);
 void cadence_qspi_apb_enable_linear_mode(bool enable);
+int zynqmp_pm_ospi_init(void);
 int cadence_device_reset(struct udevice *dev);
 int cadence_qspi_setup_opcode_ext(struct cadence_spi_priv *priv,
                                  const struct spi_mem_op *op,
-- 
2.25.1

Reply via email to