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

Commit 25c14325 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/sde: delay backlight update until the first commit"

parents d9abd30b 3d1a1448
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -184,6 +184,9 @@ Optional properties:
					255 = default value.
- qcom,mdss-brightness-max-level:	Specifies the max brightness level supported.
					255 = default value.
- qcom,bl-update-flag:			A string that specifies controls for backlight update of the panel.
					"delay_until_first_frame" = Delay backlight update of the panel
					until the first frame is received from the HW.
- qcom,mdss-dsi-interleave-mode:	Specifies interleave mode.
					0 = default value.
- qcom,mdss-dsi-panel-type:		Specifies the panel operating mode.
@@ -600,6 +603,7 @@ Example:
		qcom,mdss-dsi-bl-min-level = <1>;
		qcom,mdss-dsi-bl-max-level = < 15>;
		qcom,mdss-brightness-max-level = <255>;
		qcom,bl-update-flag = "delay_until_first_frame";
		qcom,mdss-dsi-interleave-mode = <0>;
		qcom,mdss-dsi-panel-type = "dsi_video_mode";
		qcom,mdss-dsi-te-check-enable;
+12 −0
Original line number Diff line number Diff line
@@ -1998,6 +1998,7 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel,
{
	int rc = 0;
	const char *bl_type;
	const char *data;
	u32 val = 0;

	bl_type = of_get_property(of_node,
@@ -2017,6 +2018,17 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel,
		panel->bl_config.type = DSI_BACKLIGHT_UNKNOWN;
	}

	data = of_get_property(of_node, "qcom,bl-update-flag", NULL);
	if (!data) {
		panel->bl_config.bl_update = BL_UPDATE_NONE;
	} else if (!strcmp(data, "delay_until_first_frame")) {
		panel->bl_config.bl_update = BL_UPDATE_DELAY_UNTIL_FIRST_FRAME;
	} else {
		pr_debug("[%s] No valid bl-update-flag: %s\n",
						panel->name, data);
		panel->bl_config.bl_update = BL_UPDATE_NONE;
	}

	panel->bl_config.bl_scale = MAX_BL_SCALE_LEVEL;
	panel->bl_config.bl_scale_ad = MAX_AD_BL_SCALE_LEVEL;

+6 −0
Original line number Diff line number Diff line
@@ -51,6 +51,11 @@ enum dsi_backlight_type {
	DSI_BACKLIGHT_MAX,
};

enum bl_update_flag {
	BL_UPDATE_DELAY_UNTIL_FIRST_FRAME,
	BL_UPDATE_NONE,
};

enum {
	MODE_GPIO_NOT_VALID = 0,
	MODE_SEL_DUAL_PORT,
@@ -93,6 +98,7 @@ struct dsi_panel_phy_props {

struct dsi_backlight_config {
	enum dsi_backlight_type type;
	enum bl_update_flag bl_update;

	u32 bl_min_level;
	u32 bl_max_level;
+41 −6
Original line number Diff line number Diff line
@@ -89,12 +89,19 @@ 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) {
		c_conn->unset_bl_level = bl_lvl;
		return 0;
	}

	if (c_conn->ops.set_backlight) {
		event.type = DRM_EVENT_SYS_BACKLIGHT;
		event.length = sizeof(u32);
		msm_mode_object_event_notify(&c_conn->base.base,
				c_conn->base.dev, &event, (u8 *)&brightness);
		rc = c_conn->ops.set_backlight(c_conn->display, bl_lvl);
		c_conn->unset_bl_level = 0;
	}

	return rc;
@@ -519,6 +526,15 @@ 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) {
		c_conn->unset_bl_level = bl_config->bl_level;
		return 0;
	}

	if (c_conn->unset_bl_level)
		bl_config->bl_level = c_conn->unset_bl_level;

	if (c_conn->bl_scale > MAX_BL_SCALE_LEVEL)
		bl_config->bl_scale = MAX_BL_SCALE_LEVEL;
	else
@@ -533,6 +549,7 @@ static int _sde_connector_update_bl_scale(struct sde_connector *c_conn)
		bl_config->bl_scale, bl_config->bl_scale_ad,
		bl_config->bl_level);
	rc = c_conn->ops.set_backlight(dsi_display, bl_config->bl_level);
	c_conn->unset_bl_level = 0;

	return rc;
}
@@ -572,8 +589,11 @@ static int _sde_connector_update_dirty_properties(
		}
	}

	/* Special handling for postproc properties */
	if (c_conn->bl_scale_dirty) {
	/*
	 * Special handling for postproc properties and
	 * for updating backlight if any unset backlight level is present
	 */
	if (c_conn->bl_scale_dirty || c_conn->unset_bl_level) {
		_sde_connector_update_bl_scale(c_conn);
		c_conn->bl_scale_dirty = false;
	}
@@ -639,29 +659,44 @@ void sde_connector_helper_bridge_disable(struct drm_connector *connector)
	sde_connector_schedule_status_work(connector, false);

	c_conn = to_sde_connector(connector);
	if (c_conn->panel_dead) {
	if (c_conn->bl_device) {
		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);
	}

	c_conn->allow_bl_update = false;
}

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

	if (!connector)
		return;

	c_conn = to_sde_connector(connector);
	display = (struct dsi_display *) c_conn->display;

	/*
	 * Special handling for some panels which need atleast
	 * one frame to be transferred to GRAM before enabling backlight.
	 * So delay backlight update to these panels until the
	 * first frame commit is received from the HW.
	 */
	if (display->panel->bl_config.bl_update ==
				BL_UPDATE_DELAY_UNTIL_FIRST_FRAME)
		sde_encoder_wait_for_event(c_conn->encoder,
				MSM_ENC_TX_COMPLETE);
	c_conn->allow_bl_update = true;

	/* Special handling for ESD recovery case */
	if (c_conn->panel_dead) {
	if (c_conn->bl_device) {
		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;
	}
	c_conn->panel_dead = false;
}

int sde_connector_clk_ctrl(struct drm_connector *connector, bool enable)
+5 −1
Original line number Diff line number Diff line
@@ -329,7 +329,9 @@ struct sde_connector_evt {
 * @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
 * last_cmd_tx_sts: status of the last command transfer
 * @unset_bl_level: BL level that needs to be set later
 * @allow_bl_update: Flag to indicate if BL update is allowed currently or not
 * @last_cmd_tx_sts: status of the last command transfer
 */
struct sde_connector {
	struct drm_connector base;
@@ -373,6 +375,8 @@ struct sde_connector {
	bool bl_scale_dirty;
	u32 bl_scale;
	u32 bl_scale_ad;
	u32 unset_bl_level;
	bool allow_bl_update;

	bool last_cmd_tx_sts;
};