Procházet zdrojové kódy

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 <[email protected]>
[[email protected]: fixed static analysis error]
Signed-off-by: Steve Cohen <[email protected]>
Ritesh Kumar před 5 roky
rodič
revize
755686a110
3 změnil soubory, kde provedl 20 přidání a 24 odebrání
  1. 1 19
      msm/dsi/dsi_clk_manager.c
  2. 17 2
      msm/dsi/dsi_ctrl.c
  3. 2 3
      msm/dsi/dsi_display.c

+ 1 - 19
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;
 }

+ 17 - 2
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;
 }

+ 2 - 3
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) {