diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index b94d733cb6..64e1737baf 100644 --- a/msm/dsi/dsi_display.c +++ b/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); diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index a04e4ddef5..0680b600d2 100644 --- a/msm/dsi/dsi_panel.c +++ b/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;