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

Commit ebc6039d authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/dsi-staging: disallow backlight update during panel mode switch"

parents 105ab15c 026c827d
Loading
Loading
Loading
Loading
+8 −11
Original line number Diff line number Diff line
/*
 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -263,6 +263,7 @@ static void dsi_bridge_disable(struct drm_bridge *bridge)
	int rc = 0;
	struct dsi_display *display;
	struct dsi_bridge *c_bridge = to_dsi_bridge(bridge);
	int private_flags;

	if (!bridge) {
		pr_err("Invalid params\n");
@@ -270,18 +271,14 @@ static void dsi_bridge_disable(struct drm_bridge *bridge)
	}
	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;
		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);
	if (rc) {
+18 −10
Original line number Diff line number Diff line
@@ -92,8 +92,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;
	}
@@ -480,8 +479,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;
	}
@@ -666,21 +664,31 @@ 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;

	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;