diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 5c1eec5381..809294bf50 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -1060,10 +1060,22 @@ int dsi_display_set_power(struct drm_connector *connector, case SDE_MODE_DPMS_LP2: rc = dsi_panel_set_lp2(display->panel); break; - default: - rc = dsi_panel_set_nolp(display->panel); + case SDE_MODE_DPMS_ON: + if ((display->panel->power_mode == SDE_MODE_DPMS_LP1) || + (display->panel->power_mode == SDE_MODE_DPMS_LP2)) + rc = dsi_panel_set_nolp(display->panel); break; + case SDE_MODE_DPMS_OFF: + default: + return rc; } + + DSI_DEBUG("Power mode transition from %d to %d %s", + display->panel->power_mode, power_mode, + rc ? "failed" : "successful"); + if (!rc) + display->panel->power_mode = power_mode; + return rc; } diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index f2e3c72392..b19894f5bc 100644 --- a/msm/dsi/dsi_panel.c +++ b/msm/dsi/dsi_panel.c @@ -3306,6 +3306,7 @@ struct dsi_panel *dsi_panel_get(struct device *parent, if (rc) DSI_DEBUG("failed to parse esd config, rc=%d\n", rc); + panel->power_mode = SDE_MODE_DPMS_OFF; drm_panel_init(&panel->drm_panel); panel->drm_panel.dev = &panel->mipi_device.dev; panel->mipi_device.dev.of_node = of_node; diff --git a/msm/dsi/dsi_panel.h b/msm/dsi/dsi_panel.h index 40052b896d..2c1d62ece4 100644 --- a/msm/dsi/dsi_panel.h +++ b/msm/dsi/dsi_panel.h @@ -198,6 +198,7 @@ struct dsi_panel { bool sync_broadcast_en; int panel_test_gpio; + int power_mode; }; static inline bool dsi_panel_ulps_feature_enabled(struct dsi_panel *panel)