disp: msm: dsi: Handle GDSC PM in pre/post clk on/off
Currently, power_state variable does not reflect the GDSC status. Due to this, there are scenarios where ctrl_power_on is not happening leading to clock failures. This change updates power_state based on current status of all the regulators. GDSC enable is moved to pre_clkon and GDSC disable is moved to post_clkoff. Change-Id: I6d9508d5dffda0c94bd3b3bd9b5feb4724dc9dc7 Signed-off-by: Ritesh Kumar <riteshk@codeaurora.org> [cohens@codeaurora.org: fixed static analysis error] Signed-off-by: Steve Cohen <cohens@codeaurora.org>
This commit is contained in:

committed by
Steve Cohen

parent
6d59f959d3
commit
755686a110
@@ -584,16 +584,10 @@ static int dsi_display_core_clk_enable(struct dsi_core_clks *clks,
|
|||||||
|
|
||||||
m_clks = &clks[master_ndx];
|
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);
|
rc = dsi_core_clk_start(m_clks);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
DSI_ERR("failed to turn on master clocks, rc=%d\n", 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 */
|
/* 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))
|
if (!clk || (clk == m_clks))
|
||||||
continue;
|
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);
|
rc = dsi_core_clk_start(clk);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
DSI_ERR("failed to turn on clocks, rc=%d\n", 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;
|
goto error_disable_master;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -619,8 +606,6 @@ static int dsi_display_core_clk_enable(struct dsi_core_clks *clks,
|
|||||||
error_disable_master:
|
error_disable_master:
|
||||||
(void)dsi_core_clk_stop(m_clks);
|
(void)dsi_core_clk_stop(m_clks);
|
||||||
|
|
||||||
error_disable_master_resource:
|
|
||||||
pm_runtime_put_sync(m_clks->clks.drm->dev);
|
|
||||||
error:
|
error:
|
||||||
return rc;
|
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);
|
DSI_DEBUG("failed to turn off clocks, rc=%d\n", rc);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
pm_runtime_put_sync(m_clks->clks.drm->dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = dsi_core_clk_stop(m_clks);
|
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;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
pm_runtime_put_sync(m_clks->clks.drm->dev);
|
|
||||||
error:
|
error:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@@ -1039,12 +1039,19 @@ static int dsi_ctrl_enable_supplies(struct dsi_ctrl *dsi_ctrl, bool enable)
|
|||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
if (enable) {
|
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) {
|
if (!dsi_ctrl->current_state.host_initialized) {
|
||||||
rc = dsi_pwr_enable_regulator(
|
rc = dsi_pwr_enable_regulator(
|
||||||
&dsi_ctrl->pwr_info.host_pwr, true);
|
&dsi_ctrl->pwr_info.host_pwr, true);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
DSI_CTRL_ERR(dsi_ctrl, "failed to enable host power regs\n");
|
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,
|
&dsi_ctrl->pwr_info.host_pwr,
|
||||||
false
|
false
|
||||||
);
|
);
|
||||||
goto error;
|
goto error_get_sync;
|
||||||
}
|
}
|
||||||
|
return rc;
|
||||||
} else {
|
} else {
|
||||||
rc = dsi_pwr_enable_regulator(&dsi_ctrl->pwr_info.digital,
|
rc = dsi_pwr_enable_regulator(&dsi_ctrl->pwr_info.digital,
|
||||||
false);
|
false);
|
||||||
@@ -1076,7 +1084,14 @@ static int dsi_ctrl_enable_supplies(struct dsi_ctrl *dsi_ctrl, bool enable)
|
|||||||
goto error;
|
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:
|
error:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@@ -3767,8 +3767,7 @@ int dsi_pre_clkon_cb(void *priv,
|
|||||||
* Enable DSI core power
|
* Enable DSI core power
|
||||||
* 1.> PANEL_PM are controlled as part of
|
* 1.> PANEL_PM are controlled as part of
|
||||||
* panel_power_ctrl. Needed not be handled here.
|
* panel_power_ctrl. Needed not be handled here.
|
||||||
* 2.> CORE_PM are controlled by dsi clk manager.
|
* 2.> CTRL_PM need to be enabled/disabled
|
||||||
* 3.> CTRL_PM need to be enabled/disabled
|
|
||||||
* only during unblank/blank. Their state should
|
* only during unblank/blank. Their state should
|
||||||
* not be changed during static screen.
|
* 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_for_each_ctrl(i, display) {
|
||||||
display_ctrl = &display->ctrl[i];
|
display_ctrl = &display->ctrl[i];
|
||||||
|
|
||||||
if (!display_ctrl->phy || !display_ctrl->ctrl)
|
if (!display_ctrl->phy || !display_ctrl->ctrl)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
display_ctrl->ctrl->drm_dev = drm;
|
||||||
rc = dsi_phy_set_clk_freq(display_ctrl->phy,
|
rc = dsi_phy_set_clk_freq(display_ctrl->phy,
|
||||||
&display_ctrl->ctrl->clk_freq);
|
&display_ctrl->ctrl->clk_freq);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
|
Reference in New Issue
Block a user