spi: qup: Parse OPP table for DVFS support
authorStephan Gerhold <stephan.gerhold@kernkonzept.com>
Tue, 19 Sep 2023 11:59:49 +0000 (13:59 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 25 Sep 2023 12:19:37 +0000 (14:19 +0200)
Parse the OPP table from the device tree and use dev_pm_opp_set_rate()
instead of clk_set_rate() to allow making performance state for power
domains specified in the OPP table.

This is needed to guarantee correct behavior of the clock, especially
with the higher clock/SPI bus frequencies.

Acked-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Signed-off-by: Stephan Gerhold <stephan.gerhold@kernkonzept.com>
Link: https://lore.kernel.org/r/20230919-spi-qup-dvfs-v2-2-1bac2e9ab8db@kernkonzept.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-qup.c

index 4b6f6b25219b3d1944e2bd9d94ecff8c226d9a48..bf043be3a2a97aa690caae30aa0e4c05df30fd0c 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
+#include <linux/pm_opp.h>
 #include <linux/pm_runtime.h>
 #include <linux/spi/spi.h>
 #include <linux/dmaengine.h>
@@ -667,7 +668,7 @@ static int spi_qup_io_prep(struct spi_device *spi, struct spi_transfer *xfer)
                return -EIO;
        }
 
-       ret = clk_set_rate(controller->cclk, xfer->speed_hz);
+       ret = dev_pm_opp_set_rate(controller->dev, xfer->speed_hz);
        if (ret) {
                dev_err(controller->dev, "fail to set frequency %d",
                        xfer->speed_hz);
@@ -1027,6 +1028,15 @@ static int spi_qup_probe(struct platform_device *pdev)
                return -ENXIO;
        }
 
+       ret = devm_pm_opp_set_clkname(dev, "core");
+       if (ret)
+               return ret;
+
+       /* OPP table is optional */
+       ret = devm_pm_opp_of_add_table(dev);
+       if (ret && ret != -ENODEV)
+               return dev_err_probe(dev, ret, "invalid OPP table\n");
+
        host = spi_alloc_host(dev, sizeof(struct spi_qup));
        if (!host) {
                dev_err(dev, "cannot allocate host\n");