diff --git a/msm/dsi/dsi_clk_manager.c b/msm/dsi/dsi_clk_manager.c index 3e517e621a..b8b5bec682 100644 --- a/msm/dsi/dsi_clk_manager.c +++ b/msm/dsi/dsi_clk_manager.c @@ -584,16 +584,10 @@ static int dsi_display_core_clk_enable(struct dsi_core_clks *clks, m_clks = &clks[master_ndx]; - rc = pm_runtime_get_sync(m_clks->clks.drm->dev); - if (rc < 0) { - DSI_ERR("Power resource enable failed, rc=%d\n", rc); - goto error; - } - rc = dsi_core_clk_start(m_clks); if (rc) { DSI_ERR("failed to turn on master clocks, rc=%d\n", rc); - goto error_disable_master_resource; + goto error; } /* Turn on rest of the core clocks */ @@ -602,16 +596,9 @@ static int dsi_display_core_clk_enable(struct dsi_core_clks *clks, if (!clk || (clk == m_clks)) continue; - rc = pm_runtime_get_sync(m_clks->clks.drm->dev); - if (rc < 0) { - DSI_ERR("Power resource enable failed, rc=%d\n", rc); - goto error_disable_master; - } - rc = dsi_core_clk_start(clk); if (rc) { DSI_ERR("failed to turn on clocks, rc=%d\n", rc); - pm_runtime_put_sync(m_clks->clks.drm->dev); goto error_disable_master; } } @@ -619,8 +606,6 @@ static int dsi_display_core_clk_enable(struct dsi_core_clks *clks, error_disable_master: (void)dsi_core_clk_stop(m_clks); -error_disable_master_resource: - pm_runtime_put_sync(m_clks->clks.drm->dev); error: return rc; } @@ -721,8 +706,6 @@ static int dsi_display_core_clk_disable(struct dsi_core_clks *clks, DSI_DEBUG("failed to turn off clocks, rc=%d\n", rc); goto error; } - - pm_runtime_put_sync(m_clks->clks.drm->dev); } rc = dsi_core_clk_stop(m_clks); @@ -731,7 +714,6 @@ static int dsi_display_core_clk_disable(struct dsi_core_clks *clks, goto error; } - pm_runtime_put_sync(m_clks->clks.drm->dev); error: return rc; } diff --git a/msm/dsi/dsi_ctrl.c b/msm/dsi/dsi_ctrl.c index 21cdcabb09..3dad7c9829 100644 --- a/msm/dsi/dsi_ctrl.c +++ b/msm/dsi/dsi_ctrl.c @@ -1039,12 +1039,19 @@ static int dsi_ctrl_enable_supplies(struct dsi_ctrl *dsi_ctrl, bool enable) int rc = 0; if (enable) { + rc = pm_runtime_get_sync(dsi_ctrl->drm_dev->dev); + if (rc < 0) { + DSI_CTRL_ERR(dsi_ctrl, + "Power resource enable failed, rc=%d\n", rc); + goto error; + } + if (!dsi_ctrl->current_state.host_initialized) { rc = dsi_pwr_enable_regulator( &dsi_ctrl->pwr_info.host_pwr, true); if (rc) { DSI_CTRL_ERR(dsi_ctrl, "failed to enable host power regs\n"); - goto error; + goto error_get_sync; } } @@ -1057,8 +1064,9 @@ static int dsi_ctrl_enable_supplies(struct dsi_ctrl *dsi_ctrl, bool enable) &dsi_ctrl->pwr_info.host_pwr, false ); - goto error; + goto error_get_sync; } + return rc; } else { rc = dsi_pwr_enable_regulator(&dsi_ctrl->pwr_info.digital, false); @@ -1076,7 +1084,14 @@ static int dsi_ctrl_enable_supplies(struct dsi_ctrl *dsi_ctrl, bool enable) goto error; } } + rc = pm_runtime_put_sync(dsi_ctrl->drm_dev->dev); + if (rc < 0) + DSI_CTRL_ERR(dsi_ctrl, + "Power resource disable failed, rc=%d\n", rc); + return rc; } +error_get_sync: + pm_runtime_put_sync(dsi_ctrl->drm_dev->dev); error: return rc; } diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 7f135fbb4d..b510109200 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -3767,8 +3767,7 @@ int dsi_pre_clkon_cb(void *priv, * Enable DSI core power * 1.> PANEL_PM are controlled as part of * panel_power_ctrl. Needed not be handled here. - * 2.> CORE_PM are controlled by dsi clk manager. - * 3.> CTRL_PM need to be enabled/disabled + * 2.> CTRL_PM need to be enabled/disabled * only during unblank/blank. Their state should * not be changed during static screen. */ @@ -5524,10 +5523,10 @@ static int dsi_display_bind(struct device *dev, display_for_each_ctrl(i, display) { display_ctrl = &display->ctrl[i]; - if (!display_ctrl->phy || !display_ctrl->ctrl) continue; + display_ctrl->ctrl->drm_dev = drm; rc = dsi_phy_set_clk_freq(display_ctrl->phy, &display_ctrl->ctrl->clk_freq); if (rc) {