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 <chenlei@codeaurora.org>
Signed-off-by: Satya Rama Aditya Pinapala <psraditya30@codeaurora.org>
This commit is contained in:
Lei Chen 2019-12-19 14:34:38 +08:00 committed by Satya Rama Aditya Pinapala
parent 7d33aeb87e
commit 3842597275
2 changed files with 23 additions and 21 deletions

View File

@ -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);

View File

@ -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;