From 38425972754927230361151a90acd7db27d953cd Mon Sep 17 00:00:00 2001 From: Lei Chen Date: Thu, 19 Dec 2019 14:34:38 +0800 Subject: [PATCH] disp: msm: dsi: disallow backlight update during panel mode switch DSI controller and clock will be disabled/enabled during panel mode switch, so disallow backlight update during panel mode switch to avoiding DSI exception. Change-Id: I37e2f3c9aa929555593ffb53950521150ee7698f Signed-off-by: Lei Chen Signed-off-by: Satya Rama Aditya Pinapala --- msm/dsi/dsi_drm.c | 17 +++++++---------- msm/sde/sde_connector.c | 27 ++++++++++++++++----------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/msm/dsi/dsi_drm.c b/msm/dsi/dsi_drm.c index ac8282305d..fbb8aa7a92 100644 --- a/msm/dsi/dsi_drm.c +++ b/msm/dsi/dsi_drm.c @@ -253,6 +253,7 @@ static void dsi_bridge_enable(struct drm_bridge *bridge) static void dsi_bridge_disable(struct drm_bridge *bridge) { int rc = 0; + int private_flags; struct dsi_display *display; struct dsi_bridge *c_bridge = to_dsi_bridge(bridge); @@ -261,18 +262,14 @@ static void dsi_bridge_disable(struct drm_bridge *bridge) return; } display = c_bridge->display; + private_flags = + bridge->encoder->crtc->state->adjusted_mode.private_flags; if (display && display->drm_conn) { - if (bridge->encoder->crtc->state->adjusted_mode.private_flags & - MSM_MODE_FLAG_SEAMLESS_POMS) { - display->poms_pending = true; - /* Disable ESD thread, during panel mode switch */ - sde_connector_schedule_status_work(display->drm_conn, - false); - } else { - display->poms_pending = false; - sde_connector_helper_bridge_disable(display->drm_conn); - } + display->poms_pending = + private_flags & MSM_MODE_FLAG_SEAMLESS_POMS; + + sde_connector_helper_bridge_disable(display->drm_conn); } rc = dsi_display_pre_disable(c_bridge->display); diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index 240381582e..4720d6cfaf 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -94,8 +94,7 @@ static int sde_backlight_device_update_status(struct backlight_device *bd) if (!bl_lvl && brightness) bl_lvl = 1; - if (display->panel->bl_config.bl_update == - BL_UPDATE_DELAY_UNTIL_FIRST_FRAME && !c_conn->allow_bl_update) { + if (!c_conn->allow_bl_update) { c_conn->unset_bl_level = bl_lvl; return 0; } @@ -532,9 +531,7 @@ static int _sde_connector_update_bl_scale(struct sde_connector *c_conn) bl_config = &dsi_display->panel->bl_config; - if (dsi_display->panel->bl_config.bl_update == - BL_UPDATE_DELAY_UNTIL_FIRST_FRAME && - !c_conn->allow_bl_update) { + if (!c_conn->allow_bl_update) { c_conn->unset_bl_level = bl_config->bl_level; return 0; } @@ -797,21 +794,29 @@ void sde_connector_helper_bridge_disable(struct drm_connector *connector) { int rc; struct sde_connector *c_conn = NULL; + struct dsi_display *display; + bool poms_pending = false; if (!connector) return; - rc = _sde_connector_update_dirty_properties(connector); - if (rc) { - SDE_ERROR("conn %d final pre kickoff failed %d\n", - connector->base.id, rc); - SDE_EVT32(connector->base.id, SDE_EVTLOG_ERROR); + c_conn = to_sde_connector(connector); + if (c_conn->connector_type == DRM_MODE_CONNECTOR_DSI) { + display = (struct dsi_display *) c_conn->display; + poms_pending = display->poms_pending; } + if (!poms_pending) { + rc = _sde_connector_update_dirty_properties(connector); + if (rc) { + SDE_ERROR("conn %d final pre kickoff failed %d\n", + connector->base.id, rc); + SDE_EVT32(connector->base.id, SDE_EVTLOG_ERROR); + } + } /* Disable ESD thread */ sde_connector_schedule_status_work(connector, false); - c_conn = to_sde_connector(connector); if (c_conn->bl_device) { c_conn->bl_device->props.power = FB_BLANK_POWERDOWN; c_conn->bl_device->props.state |= BL_CORE_FBBLANK;