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
