1. Use devm_pm_opp_* to simplif code and avoid mem leak.
2. Remove opp_table from dpu_kms, dp_ctrl_private and msm_dsi_host,
since it does not need a global scope.
3. Remove dp_ctrl_put.

Signed-off-by: Yangtao Li <tiny.win...@gmail.com>
---
 drivers/gpu/drm/msm/adreno/a5xx_gpu.c   |  2 +-
 drivers/gpu/drm/msm/adreno/a6xx_gmu.c   |  2 +-
 drivers/gpu/drm/msm/adreno/adreno_gpu.c |  2 +-
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 23 ++++++++------------
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h |  2 --
 drivers/gpu/drm/msm/dp/dp_ctrl.c        | 29 ++++++-------------------
 drivers/gpu/drm/msm/dp/dp_ctrl.h        |  1 -
 drivers/gpu/drm/msm/dp/dp_display.c     |  5 +----
 drivers/gpu/drm/msm/dsi/dsi_host.c      | 15 +++++--------
 9 files changed, 26 insertions(+), 55 deletions(-)

diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c 
b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
index a5af223eaf50..47e51c632209 100644
--- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
@@ -1560,7 +1560,7 @@ static void check_speed_bin(struct device *dev)
                nvmem_cell_put(cell);
        }
 
-       dev_pm_opp_set_supported_hw(dev, &val, 1);
+       devm_pm_opp_set_supported_hw(dev, &val, 1);
 }
 
 struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c 
b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index e6703ae98760..bd159e6fac5a 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -1321,7 +1321,7 @@ static int a6xx_gmu_pwrlevels_probe(struct a6xx_gmu *gmu)
         * The GMU handles its own frequency switching so build a list of
         * available frequencies to send during initialization
         */
-       ret = dev_pm_opp_of_add_table(gmu->dev);
+       ret = devm_pm_opp_of_add_table(gmu->dev);
        if (ret) {
                DRM_DEV_ERROR(gmu->dev, "Unable to set the OPP table for the 
GMU\n");
                return ret;
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c 
b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index 6cf9975e951e..e6c446c436e3 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -845,7 +845,7 @@ static void adreno_get_pwrlevels(struct device *dev,
        if (!of_find_property(dev->of_node, "operating-points-v2", NULL))
                ret = adreno_get_legacy_pwrlevels(dev);
        else {
-               ret = dev_pm_opp_of_add_table(dev);
+               ret = devm_pm_opp_of_add_table(dev);
                if (ret)
                        DRM_DEV_ERROR(dev, "Unable to set the OPP table\n");
        }
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 6f19dfcb4965..cb7e4fddf268 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -1082,19 +1082,20 @@ static int dpu_bind(struct device *dev, struct device 
*master, void *data)
        struct msm_drm_private *priv = ddev->dev_private;
        struct dpu_kms *dpu_kms;
        struct dss_module_power *mp;
+       struct opp_table *opp_table;
        int ret = 0;
 
        dpu_kms = devm_kzalloc(&pdev->dev, sizeof(*dpu_kms), GFP_KERNEL);
        if (!dpu_kms)
                return -ENOMEM;
 
-       dpu_kms->opp_table = dev_pm_opp_set_clkname(dev, "core");
-       if (IS_ERR(dpu_kms->opp_table))
-               return PTR_ERR(dpu_kms->opp_table);
+       opp_table = devm_pm_opp_set_clkname(dev, "core");
+       if (IS_ERR(opp_table))
+               return PTR_ERR(opp_table);
        /* OPP table is optional */
-       ret = dev_pm_opp_of_add_table(dev);
+       ret = devm_pm_opp_of_add_table(dev);
        if (ret) {
-               dev_pm_opp_put_clkname(dpu_kms->opp_table);
+               devm_pm_opp_put_clkname(dev, opp_table);
                if (ret != -ENODEV) {
                        dev_err(dev, "invalid OPP table in device tree\n");
                        return ret;
@@ -1105,7 +1106,7 @@ static int dpu_bind(struct device *dev, struct device 
*master, void *data)
        ret = msm_dss_parse_clock(pdev, mp);
        if (ret) {
                DPU_ERROR("failed to parse clocks, ret=%d\n", ret);
-               goto err;
+               return ret;
        }
 
        platform_set_drvdata(pdev, dpu_kms);
@@ -1113,7 +1114,7 @@ static int dpu_bind(struct device *dev, struct device 
*master, void *data)
        ret = msm_kms_init(&dpu_kms->base, &kms_funcs);
        if (ret) {
                DPU_ERROR("failed to init kms, ret=%d\n", ret);
-               goto err;
+               return ret;
        }
        dpu_kms->dev = ddev;
        dpu_kms->pdev = pdev;
@@ -1122,10 +1123,7 @@ static int dpu_bind(struct device *dev, struct device 
*master, void *data)
        dpu_kms->rpm_enabled = true;
 
        priv->kms = &dpu_kms->base;
-       return ret;
-err:
-       dev_pm_opp_of_remove_table(dev);
-       dev_pm_opp_put_clkname(dpu_kms->opp_table);
+
        return ret;
 }
 
@@ -1141,9 +1139,6 @@ static void dpu_unbind(struct device *dev, struct device 
*master, void *data)
 
        if (dpu_kms->rpm_enabled)
                pm_runtime_disable(&pdev->dev);
-
-       dev_pm_opp_of_remove_table(dev);
-       dev_pm_opp_put_clkname(dpu_kms->opp_table);
 }
 
 static const struct component_ops dpu_ops = {
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
index d6717d6672f7..1483995a94d9 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
@@ -130,8 +130,6 @@ struct dpu_kms {
        struct platform_device *pdev;
        bool rpm_enabled;
 
-       struct opp_table *opp_table;
-
        struct dss_module_power mp;
 
        /* reference count bandwidth requests, so we know when we can
diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c
index e3462f5d96d7..fdb696ec9d9a 100644
--- a/drivers/gpu/drm/msm/dp/dp_ctrl.c
+++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c
@@ -77,8 +77,6 @@ struct dp_ctrl_private {
        struct dp_parser *parser;
        struct dp_catalog *catalog;
 
-       struct opp_table *opp_table;
-
        struct completion idle_comp;
        struct completion video_comp;
 };
@@ -1873,6 +1871,7 @@ struct dp_ctrl *dp_ctrl_get(struct device *dev, struct 
dp_link *link,
                        struct dp_parser *parser)
 {
        struct dp_ctrl_private *ctrl;
+       struct opp_table *opp_table;
        int ret;
 
        if (!dev || !panel || !aux ||
@@ -1887,19 +1886,18 @@ struct dp_ctrl *dp_ctrl_get(struct device *dev, struct 
dp_link *link,
                return ERR_PTR(-ENOMEM);
        }
 
-       ctrl->opp_table = dev_pm_opp_set_clkname(dev, "ctrl_link");
-       if (IS_ERR(ctrl->opp_table)) {
+       opp_table = devm_pm_opp_set_clkname(dev, "ctrl_link");
+       if (IS_ERR(opp_table)) {
                dev_err(dev, "invalid DP OPP table in device tree\n");
-               /* caller do PTR_ERR(ctrl->opp_table) */
-               return (struct dp_ctrl *)ctrl->opp_table;
+               /* caller do PTR_ERR(opp_table) */
+               return (struct dp_ctrl *)opp_table;
        }
 
        /* OPP table is optional */
-       ret = dev_pm_opp_of_add_table(dev);
+       ret = devm_pm_opp_of_add_table(dev);
        if (ret) {
                dev_err(dev, "failed to add DP OPP table\n");
-               dev_pm_opp_put_clkname(ctrl->opp_table);
-               ctrl->opp_table = NULL;
+               devm_pm_opp_put_clkname(dev, opp_table);
        }
 
        init_completion(&ctrl->idle_comp);
@@ -1916,16 +1914,3 @@ struct dp_ctrl *dp_ctrl_get(struct device *dev, struct 
dp_link *link,
 
        return &ctrl->dp_ctrl;
 }
-
-void dp_ctrl_put(struct dp_ctrl *dp_ctrl)
-{
-       struct dp_ctrl_private *ctrl;
-
-       ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl);
-
-       if (ctrl->opp_table) {
-               dev_pm_opp_of_remove_table(ctrl->dev);
-               dev_pm_opp_put_clkname(ctrl->opp_table);
-               ctrl->opp_table = NULL;
-       }
-}
diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.h b/drivers/gpu/drm/msm/dp/dp_ctrl.h
index f60ba93c8678..dcd6bde2b23d 100644
--- a/drivers/gpu/drm/msm/dp/dp_ctrl.h
+++ b/drivers/gpu/drm/msm/dp/dp_ctrl.h
@@ -31,6 +31,5 @@ struct dp_ctrl *dp_ctrl_get(struct device *dev, struct 
dp_link *link,
                        struct dp_panel *panel, struct drm_dp_aux *aux,
                        struct dp_power *power, struct dp_catalog *catalog,
                        struct dp_parser *parser);
-void dp_ctrl_put(struct dp_ctrl *dp_ctrl);
 
 #endif /* _DP_CTRL_H_ */
diff --git a/drivers/gpu/drm/msm/dp/dp_display.c 
b/drivers/gpu/drm/msm/dp/dp_display.c
index 6e971d552911..44c1572e7005 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -706,7 +706,6 @@ static int dp_irq_hpd_handle(struct dp_display_private *dp, 
u32 data)
 static void dp_display_deinit_sub_modules(struct dp_display_private *dp)
 {
        dp_debug_put(dp->debug);
-       dp_ctrl_put(dp->ctrl);
        dp_panel_put(dp->panel);
        dp_aux_put(dp->aux);
        dp_audio_put(dp->audio);
@@ -800,13 +799,11 @@ static int dp_init_sub_modules(struct dp_display_private 
*dp)
                rc = PTR_ERR(dp->audio);
                pr_err("failed to initialize audio, rc = %d\n", rc);
                dp->audio = NULL;
-               goto error_audio;
+               goto error_ctrl;
        }
 
        return rc;
 
-error_audio:
-       dp_ctrl_put(dp->ctrl);
 error_ctrl:
        dp_panel_put(dp->panel);
 error_link:
diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c 
b/drivers/gpu/drm/msm/dsi/dsi_host.c
index a282307f2799..30c89dd448b9 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_host.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
@@ -113,8 +113,6 @@ struct msm_dsi_host {
        struct clk *pixel_clk_src;
        struct clk *byte_intf_clk;
 
-       struct opp_table *opp_table;
-
        u32 byte_clk_rate;
        u32 pixel_clk_rate;
        u32 esc_clk_rate;
@@ -1822,6 +1820,7 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)
 {
        struct msm_dsi_host *msm_host = NULL;
        struct platform_device *pdev = msm_dsi->pdev;
+       struct opp_table *opp_table;
        int ret;
 
        msm_host = devm_kzalloc(&pdev->dev, sizeof(*msm_host), GFP_KERNEL);
@@ -1886,13 +1885,13 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)
                goto fail;
        }
 
-       msm_host->opp_table = dev_pm_opp_set_clkname(&pdev->dev, "byte");
-       if (IS_ERR(msm_host->opp_table))
-               return PTR_ERR(msm_host->opp_table);
+       opp_table = devm_pm_opp_set_clkname(&pdev->dev, "byte");
+       if (IS_ERR(opp_table))
+               return PTR_ERR(opp_table);
        /* OPP table is optional */
-       ret = dev_pm_opp_of_add_table(&pdev->dev);
+       ret = devm_pm_opp_of_add_table(&pdev->dev);
        if (ret) {
-               dev_pm_opp_put_clkname(msm_host->opp_table);
+               devm_pm_opp_put_clkname(&pdev->dev, opp_table);
                if (ret != -ENODEV) {
                        dev_err(&pdev->dev, "invalid OPP table in device 
tree\n");
                        return ret;
@@ -1934,8 +1933,6 @@ void msm_dsi_host_destroy(struct mipi_dsi_host *host)
        mutex_destroy(&msm_host->cmd_mutex);
        mutex_destroy(&msm_host->dev_mutex);
 
-       dev_pm_opp_of_remove_table(&msm_host->pdev->dev);
-       dev_pm_opp_put_clkname(msm_host->opp_table);
        pm_runtime_disable(&msm_host->pdev->dev);
 }
 
-- 
2.25.1

Reply via email to