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

Commit 75654f2c 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 aa590c3c 87208056
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -187,6 +187,9 @@ Optional properties:
					255 = default value.
					255 = default value.
- qcom,mdss-brightness-max-level:	Specifies the max brightness level supported.
- qcom,mdss-brightness-max-level:	Specifies the max brightness level supported.
					255 = default value.
					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.
- qcom,mdss-dsi-interleave-mode:	Specifies interleave mode.
					0 = default value.
					0 = default value.
- qcom,mdss-dsi-panel-type:		Specifies the panel operating mode.
- qcom,mdss-dsi-panel-type:		Specifies the panel operating mode.
@@ -599,6 +602,7 @@ Example:
		qcom,mdss-dsi-bl-min-level = <1>;
		qcom,mdss-dsi-bl-min-level = <1>;
		qcom,mdss-dsi-bl-max-level = < 15>;
		qcom,mdss-dsi-bl-max-level = < 15>;
		qcom,mdss-brightness-max-level = <255>;
		qcom,mdss-brightness-max-level = <255>;
		qcom,bl-update-flag = "delay_until_first_frame";
		qcom,mdss-dsi-interleave-mode = <0>;
		qcom,mdss-dsi-interleave-mode = <0>;
		qcom,mdss-dsi-panel-type = "dsi_video_mode";
		qcom,mdss-dsi-panel-type = "dsi_video_mode";
		qcom,mdss-dsi-te-check-enable;
		qcom,mdss-dsi-te-check-enable;
+12 −0
Original line number Original line Diff line number Diff line
@@ -1958,6 +1958,7 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel,
{
{
	int rc = 0;
	int rc = 0;
	const char *bl_type;
	const char *bl_type;
	const char *data;
	u32 val = 0;
	u32 val = 0;


	bl_type = of_get_property(of_node,
	bl_type = of_get_property(of_node,
@@ -1977,6 +1978,17 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel,
		panel->bl_config.type = DSI_BACKLIGHT_UNKNOWN;
		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 = MAX_BL_SCALE_LEVEL;
	panel->bl_config.bl_scale_ad = MAX_AD_BL_SCALE_LEVEL;
	panel->bl_config.bl_scale_ad = MAX_AD_BL_SCALE_LEVEL;


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


enum bl_update_flag {
	BL_UPDATE_DELAY_UNTIL_FIRST_FRAME,
	BL_UPDATE_NONE,
};

enum {
enum {
	MODE_GPIO_NOT_VALID = 0,
	MODE_GPIO_NOT_VALID = 0,
	MODE_SEL_DUAL_PORT,
	MODE_SEL_DUAL_PORT,
@@ -85,6 +90,7 @@ struct dsi_panel_phy_props {


struct dsi_backlight_config {
struct dsi_backlight_config {
	enum dsi_backlight_type type;
	enum dsi_backlight_type type;
	enum bl_update_flag bl_update;


	u32 bl_min_level;
	u32 bl_min_level;
	u32 bl_max_level;
	u32 bl_max_level;
+41 −6
Original line number Original line Diff line number Diff line
@@ -89,12 +89,19 @@ static int sde_backlight_device_update_status(struct backlight_device *bd)
	if (!bl_lvl && brightness)
	if (!bl_lvl && brightness)
		bl_lvl = 1;
		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) {
	if (c_conn->ops.set_backlight) {
		event.type = DRM_EVENT_SYS_BACKLIGHT;
		event.type = DRM_EVENT_SYS_BACKLIGHT;
		event.length = sizeof(u32);
		event.length = sizeof(u32);
		msm_mode_object_event_notify(&c_conn->base.base,
		msm_mode_object_event_notify(&c_conn->base.base,
				c_conn->base.dev, &event, (u8 *)&brightness);
				c_conn->base.dev, &event, (u8 *)&brightness);
		rc = c_conn->ops.set_backlight(c_conn->display, bl_lvl);
		rc = c_conn->ops.set_backlight(c_conn->display, bl_lvl);
		c_conn->unset_bl_level = 0;
	}
	}


	return rc;
	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;
	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)
	if (c_conn->bl_scale > MAX_BL_SCALE_LEVEL)
		bl_config->bl_scale = MAX_BL_SCALE_LEVEL;
		bl_config->bl_scale = MAX_BL_SCALE_LEVEL;
	else
	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_scale, bl_config->bl_scale_ad,
		bl_config->bl_level);
		bl_config->bl_level);
	rc = c_conn->ops.set_backlight(dsi_display, bl_config->bl_level);
	rc = c_conn->ops.set_backlight(dsi_display, bl_config->bl_level);
	c_conn->unset_bl_level = 0;


	return rc;
	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);
		_sde_connector_update_bl_scale(c_conn);
		c_conn->bl_scale_dirty = false;
		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);
	sde_connector_schedule_status_work(connector, false);


	c_conn = to_sde_connector(connector);
	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.power = FB_BLANK_POWERDOWN;
		c_conn->bl_device->props.state |= BL_CORE_FBBLANK;
		c_conn->bl_device->props.state |= BL_CORE_FBBLANK;
		backlight_update_status(c_conn->bl_device);
		backlight_update_status(c_conn->bl_device);
	}
	}

	c_conn->allow_bl_update = false;
}
}


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


	if (!connector)
	if (!connector)
		return;
		return;


	c_conn = to_sde_connector(connector);
	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->bl_device) {
	if (c_conn->panel_dead) {
		c_conn->bl_device->props.power = FB_BLANK_UNBLANK;
		c_conn->bl_device->props.power = FB_BLANK_UNBLANK;
		c_conn->bl_device->props.state &= ~BL_CORE_FBBLANK;
		c_conn->bl_device->props.state &= ~BL_CORE_FBBLANK;
		backlight_update_status(c_conn->bl_device);
		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)
int sde_connector_clk_ctrl(struct drm_connector *connector, bool enable)
+5 −1
Original line number Original line 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_dirty: Flag to indicate PP BL scale value(s) is changed
 * @bl_scale: BL scale value for ABA feature
 * @bl_scale: BL scale value for ABA feature
 * @bl_scale_ad: BL scale value for AD 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 sde_connector {
	struct drm_connector base;
	struct drm_connector base;
@@ -373,6 +375,8 @@ struct sde_connector {
	bool bl_scale_dirty;
	bool bl_scale_dirty;
	u32 bl_scale;
	u32 bl_scale;
	u32 bl_scale_ad;
	u32 bl_scale_ad;
	u32 unset_bl_level;
	bool allow_bl_update;


	bool last_cmd_tx_sts;
	bool last_cmd_tx_sts;
};
};