Răsfoiți Sursa

disp: msm: dsi: move panel regulator votes from bind to probe

Add vote for panel regulators in dsi probe to make sure
panel regulators are ON until dsi bind is completed
for cont-splash enabled usecase. Remove this panel regulator
vote when dsi component bind is done.

Change-Id: I0b1d43fa1b16385712abc1d8aaa0e778f31ba634
Signed-off-by: Chandan Uddaraju <[email protected]>
Chandan Uddaraju 5 ani în urmă
părinte
comite
fa8f623802
2 a modificat fișierele cu 40 adăugiri și 11 ștergeri
  1. 29 0
      msm/dsi/dsi_display.c
  2. 11 11
      msm/dsi/dsi_panel.c

+ 29 - 0
msm/dsi/dsi_display.c

@@ -5057,6 +5057,17 @@ static int dsi_display_bind(struct device *dev,
 		}
 	}
 
+	/* Remove the panel vote that was added during dsi display probe */
+	if (display->panel) {
+		rc = dsi_pwr_enable_regulator(&display->panel->power_info,
+								false);
+		if (rc) {
+			DSI_ERR("[%s] failed to disable vregs, rc=%d\n",
+					display->panel->name, rc);
+			goto error_host_deinit;
+		}
+	}
+
 	/* register te irq handler */
 	dsi_display_register_te_irq(display);
 
@@ -5167,6 +5178,24 @@ static int dsi_display_init(struct dsi_display *display)
 		goto end;
 	}
 
+	/*
+	 * Vote on panel regulator is added to make sure panel regulators
+	 * are ON until dsi bind is completed for cont-splash enabled usecase.
+	 * This panel regulator vote will be removed after bind is done.
+	 * For GKI, adding this vote will make sure that sync_state
+	 * kernel driver doesn't disable the panel regulators before
+	 * splash_config() function adds vote for these regulators.
+	 */
+	if (display->panel) {
+		rc = dsi_pwr_enable_regulator(&display->panel->power_info,
+								true);
+		if (rc) {
+			DSI_ERR("[%s] failed to enable vregs, rc=%d\n",
+					display->panel->name, rc);
+			return rc;
+		}
+	}
+
 	rc = component_add(&pdev->dev, &dsi_display_comp_ops);
 	if (rc)
 		DSI_ERR("component add failed, rc=%d\n", rc);

+ 11 - 11
msm/dsi/dsi_panel.c

@@ -3280,6 +3280,13 @@ struct dsi_panel *dsi_panel_get(struct device *parent,
 	if (rc)
 		DSI_DEBUG("failed to parse esd config, rc=%d\n", rc);
 
+	rc = dsi_panel_vreg_get(panel);
+	if (rc) {
+		DSI_ERR("[%s] failed to get panel regulators, rc=%d\n",
+		       panel->name, rc);
+		goto error;
+	}
+
 	panel->power_mode = SDE_MODE_DPMS_OFF;
 	drm_panel_init(&panel->drm_panel);
 	panel->drm_panel.dev = &panel->mipi_device.dev;
@@ -3287,11 +3294,13 @@ struct dsi_panel *dsi_panel_get(struct device *parent,
 
 	rc = drm_panel_add(&panel->drm_panel);
 	if (rc)
-		goto error;
+		goto error_vreg_put;
 
 	mutex_init(&panel->panel_lock);
 
 	return panel;
+error_vreg_put:
+	(void)dsi_panel_vreg_put(panel);
 error:
 	kfree(panel);
 	return ERR_PTR(rc);
@@ -3332,18 +3341,11 @@ int dsi_panel_drv_init(struct dsi_panel *panel,
 	dev->lanes = 4;
 
 	panel->host = host;
-	rc = dsi_panel_vreg_get(panel);
-	if (rc) {
-		DSI_ERR("[%s] failed to get panel regulators, rc=%d\n",
-		       panel->name, rc);
-		goto exit;
-	}
-
 	rc = dsi_panel_pinctrl_init(panel);
 	if (rc) {
 		DSI_ERR("[%s] failed to init pinctrl, rc=%d\n",
 				panel->name, rc);
-		goto error_vreg_put;
+		goto exit;
 	}
 
 	rc = dsi_panel_gpio_request(panel);
@@ -3367,8 +3369,6 @@ error_gpio_release:
 	(void)dsi_panel_gpio_release(panel);
 error_pinctrl_deinit:
 	(void)dsi_panel_pinctrl_deinit(panel);
-error_vreg_put:
-	(void)dsi_panel_vreg_put(panel);
 exit:
 	mutex_unlock(&panel->panel_lock);
 	return rc;