On SoCs where the GPU's power-domain is in charge of setting performance
levels, the OPP table of the GPU node will have already been populated
during said power-domain's attach_dev operation.

To avoid initialising an OPP table twice, only set the OPP regulator and
the OPPs from DT if there's no OPP table present.

Signed-off-by: Nicolas Frattaroli <[email protected]>
---
 drivers/gpu/drm/panthor/panthor_devfreq.c | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/panthor/panthor_devfreq.c 
b/drivers/gpu/drm/panthor/panthor_devfreq.c
index 
8903f60c0a3f06313ac2008791c210ff32b6bd52..4ec46a67db7d4331ac31a249e41ee19378cd411e
 100644
--- a/drivers/gpu/drm/panthor/panthor_devfreq.c
+++ b/drivers/gpu/drm/panthor/panthor_devfreq.c
@@ -143,6 +143,7 @@ int panthor_devfreq_init(struct panthor_device *ptdev)
        struct panthor_devfreq *pdevfreq;
        struct dev_pm_opp *opp;
        unsigned long cur_freq;
+       struct opp_table *t;
        unsigned long freq = ULONG_MAX;
        int ret;
 
@@ -152,17 +153,22 @@ int panthor_devfreq_init(struct panthor_device *ptdev)
 
        ptdev->devfreq = pdevfreq;
 
-       ret = devm_pm_opp_set_regulators(dev, reg_names);
-       if (ret) {
-               if (ret != -EPROBE_DEFER)
-                       DRM_DEV_ERROR(dev, "Couldn't set OPP regulators\n");
+       t = dev_pm_opp_get_opp_table(dev);
+       if (IS_ERR_OR_NULL(t)) {
+               ret = devm_pm_opp_set_regulators(dev, reg_names);
+               if (ret) {
+                       if (ret != -EPROBE_DEFER)
+                               DRM_DEV_ERROR(dev, "Couldn't set OPP 
regulators\n");
 
-               return ret;
-       }
+                       return ret;
+               }
 
-       ret = devm_pm_opp_of_add_table(dev);
-       if (ret)
-               return ret;
+               ret = devm_pm_opp_of_add_table(dev);
+               if (ret)
+                       return ret;
+       } else {
+               dev_pm_opp_put_opp_table(t);
+       }
 
        spin_lock_init(&pdevfreq->lock);
 

-- 
2.51.0

Reply via email to