drm/msm/dsi: Set up runtime PM for DSI
authorArchit Taneja <architt@codeaurora.org>
Fri, 28 Jul 2017 10:47:03 +0000 (16:17 +0530)
committerRob Clark <robdclark@gmail.com>
Wed, 2 Aug 2017 11:53:46 +0000 (07:53 -0400)
Call the pm_runtime_get/put API where we need the clocks enabled.

The main entry/exit points are 1) enabling/disabling the DSI bridge
and 2) Sending commands from the DSI host to the device.

Signed-off-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/dsi/dsi_host.c
drivers/gpu/drm/msm/dsi/phy/dsi_phy.c

index c7b612c3d7717a02d8d64be21dea68f183163917..da0913a33ca07a290d3e7c6de507a81ecbf31320 100644 (file)
@@ -221,6 +221,8 @@ static const struct msm_dsi_cfg_handler *dsi_get_config(
                goto put_gdsc;
        }
 
+       pm_runtime_get_sync(dev);
+
        ret = regulator_enable(gdsc_reg);
        if (ret) {
                pr_err("%s: unable to enable gdsc\n", __func__);
@@ -247,6 +249,7 @@ disable_clks:
        clk_disable_unprepare(ahb_clk);
 disable_gdsc:
        regulator_disable(gdsc_reg);
+       pm_runtime_put_autosuspend(dev);
 put_clk:
        clk_put(ahb_clk);
 put_gdsc:
@@ -1713,6 +1716,8 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)
                goto fail;
        }
 
+       pm_runtime_enable(&pdev->dev);
+
        msm_host->cfg_hnd = dsi_get_config(msm_host);
        if (!msm_host->cfg_hnd) {
                ret = -EINVAL;
@@ -1786,6 +1791,8 @@ void msm_dsi_host_destroy(struct mipi_dsi_host *host)
        mutex_destroy(&msm_host->clk_mutex);
        mutex_destroy(&msm_host->cmd_mutex);
        mutex_destroy(&msm_host->dev_mutex);
+
+       pm_runtime_disable(&msm_host->pdev->dev);
 }
 
 int msm_dsi_host_modeset_init(struct mipi_dsi_host *host,
@@ -1881,6 +1888,7 @@ int msm_dsi_host_xfer_prepare(struct mipi_dsi_host *host,
         * mdss interrupt is generated in mdp core clock domain
         * mdp clock need to be enabled to receive dsi interrupt
         */
+       pm_runtime_get_sync(&msm_host->pdev->dev);
        dsi_clk_ctrl(msm_host, 1);
 
        /* TODO: vote for bus bandwidth */
@@ -1912,6 +1920,7 @@ void msm_dsi_host_xfer_restore(struct mipi_dsi_host *host,
        /* TODO: unvote for bus bandwidth */
 
        dsi_clk_ctrl(msm_host, 0);
+       pm_runtime_put_autosuspend(&msm_host->pdev->dev);
 }
 
 int msm_dsi_host_cmd_tx(struct mipi_dsi_host *host,
@@ -2217,6 +2226,7 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host,
                goto unlock_ret;
        }
 
+       pm_runtime_get_sync(&msm_host->pdev->dev);
        ret = dsi_clk_ctrl(msm_host, 1);
        if (ret) {
                pr_err("%s: failed to enable clocks. ret=%d\n", __func__, ret);
@@ -2269,6 +2279,7 @@ int msm_dsi_host_power_off(struct mipi_dsi_host *host)
        pinctrl_pm_select_sleep_state(&msm_host->pdev->dev);
 
        dsi_clk_ctrl(msm_host, 0);
+       pm_runtime_put_autosuspend(&msm_host->pdev->dev);
 
        dsi_host_regulator_disable(msm_host);
 
index 0c2eb9c9a1fca070964c8f7fe66f21240148a5ad..7c9bf91bc22b6dd20615cb9181bec1446e3f72be 100644 (file)
@@ -373,7 +373,7 @@ static int dsi_phy_enable_resource(struct msm_dsi_phy *phy)
 static void dsi_phy_disable_resource(struct msm_dsi_phy *phy)
 {
        clk_disable_unprepare(phy->ahb_clk);
-       pm_runtime_put_sync(&phy->pdev->dev);
+       pm_runtime_put_autosuspend(&phy->pdev->dev);
 }
 
 static const struct of_device_id dsi_phy_dt_match[] = {