Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9eee1933 authored by Sandeep Panda's avatar Sandeep Panda
Browse files

drm/msm/sde: enable backlight in ESD recovery case



In case of ESD recovery display disable/enable happens
without the knowledge of backlight framework. So backlight
does not change during this period. This causes issues
where panel used DCS backlight update method where backlight
is lost during ESD trigger and it is not set again after
recovery is complete. This change fixes the issue by
calling backlight update API during ESD recovery display
enable/disable case.

Change-Id: I157120688603dd0558b773bbf41996b6d7373d94
Signed-off-by: default avatarSandeep Panda <spanda@codeaurora.org>
parent a385b633
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -186,6 +186,7 @@ static void dsi_bridge_enable(struct drm_bridge *bridge)
{
	int rc = 0;
	struct dsi_bridge *c_bridge = to_dsi_bridge(bridge);
	struct dsi_display *display;

	if (!bridge) {
		pr_err("Invalid params\n");
@@ -197,11 +198,15 @@ static void dsi_bridge_enable(struct drm_bridge *bridge)
		pr_debug("[%d] seamless enable\n", c_bridge->id);
		return;
	}
	display = c_bridge->display;

	rc = dsi_display_post_enable(c_bridge->display);
	rc = dsi_display_post_enable(display);
	if (rc)
		pr_err("[%d] DSI display post enabled failed, rc=%d\n",
		       c_bridge->id, rc);

	if (display && display->drm_conn)
		sde_connector_helper_bridge_enable(display->drm_conn);
}

static void dsi_bridge_disable(struct drm_bridge *bridge)
+28 −2
Original line number Diff line number Diff line
@@ -623,6 +623,7 @@ int sde_connector_pre_kickoff(struct drm_connector *connector)
void sde_connector_helper_bridge_disable(struct drm_connector *connector)
{
	int rc;
	struct sde_connector *c_conn = NULL;

	if (!connector)
		return;
@@ -633,6 +634,31 @@ void sde_connector_helper_bridge_disable(struct drm_connector *connector)
				connector->base.id, rc);
		SDE_EVT32(connector->base.id, SDE_EVTLOG_ERROR);
	}

	c_conn = to_sde_connector(connector);
	if (c_conn->panel_dead) {
		c_conn->bl_device->props.power = FB_BLANK_POWERDOWN;
		c_conn->bl_device->props.state |= BL_CORE_FBBLANK;
		backlight_update_status(c_conn->bl_device);
	}
}

void sde_connector_helper_bridge_enable(struct drm_connector *connector)
{
	struct sde_connector *c_conn = NULL;

	if (!connector)
		return;

	c_conn = to_sde_connector(connector);

	/* Special handling for ESD recovery case */
	if (c_conn->panel_dead) {
		c_conn->bl_device->props.power = FB_BLANK_UNBLANK;
		c_conn->bl_device->props.state &= ~BL_CORE_FBBLANK;
		backlight_update_status(c_conn->bl_device);
		c_conn->panel_dead = false;
	}
}

int sde_connector_clk_ctrl(struct drm_connector *connector, bool enable)
@@ -1734,15 +1760,15 @@ sde_connector_best_encoder(struct drm_connector *connector)
static void _sde_connector_report_panel_dead(struct sde_connector *conn)
{
	struct drm_event event;
	bool panel_dead = true;

	if (!conn)
		return;

	conn->panel_dead = true;
	event.type = DRM_EVENT_PANEL_DEAD;
	event.length = sizeof(bool);
	msm_mode_object_event_notify(&conn->base.base,
		conn->base.dev, &event, (u8 *)&panel_dead);
		conn->base.dev, &event, (u8 *)&conn->panel_dead);
	sde_encoder_display_failure_notification(conn->encoder);
	SDE_EVT32(SDE_EVTLOG_ERROR);
	SDE_ERROR("esd check failed report PANEL_DEAD conn_id: %d enc_id: %d\n",
+9 −1
Original line number Diff line number Diff line
@@ -324,6 +324,8 @@ struct sde_connector_evt {
 * @status_work: work object to perform status checks
 * @force_panel_dead: variable to trigger forced ESD recovery
 * @esd_status_interval: variable to change ESD check interval in millisec
 * @panel_dead: Flag to indicate if panel has gone bad
 * @esd_status_check: Flag to indicate if ESD thread is scheduled or not
 * @bl_scale_dirty: Flag to indicate PP BL scale value(s) is changed
 * @bl_scale: BL scale value for ABA feature
 * @bl_scale_ad: BL scale value for AD feature
@@ -365,7 +367,7 @@ struct sde_connector {
	struct delayed_work status_work;
	u32 force_panel_dead;
	u32 esd_status_interval;

	bool panel_dead;
	bool esd_status_check;

	bool bl_scale_dirty;
@@ -762,6 +764,12 @@ void sde_conn_timeline_status(struct drm_connector *conn);
 */
void sde_connector_helper_bridge_disable(struct drm_connector *connector);

/**
 * sde_connector_helper_bridge_enable - helper function for drm bridge enable
 * @connector: Pointer to DRM connector object
 */
void sde_connector_helper_bridge_enable(struct drm_connector *connector);

/**
 * sde_connector_get_panel_vfp - helper to get panel vfp
 * @connector: pointer to drm connector