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 <chandanu@codeaurora.org>
This commit is contained in:
Chandan Uddaraju
2020-04-02 21:34:27 -07:00
parent d4566743e0
commit fa8f623802
2 changed files with 40 additions and 11 deletions

View File

@@ -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 */ /* register te irq handler */
dsi_display_register_te_irq(display); dsi_display_register_te_irq(display);
@@ -5167,6 +5178,24 @@ static int dsi_display_init(struct dsi_display *display)
goto end; 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); rc = component_add(&pdev->dev, &dsi_display_comp_ops);
if (rc) if (rc)
DSI_ERR("component add failed, rc=%d\n", rc); DSI_ERR("component add failed, rc=%d\n", rc);

View File

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