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

Commit d566d226 authored by Xu Yang's avatar Xu Yang
Browse files

drm/msm/sde: add connector support for bl scale



Create backlight scale properties for AD and ABA in connector,
and scale backlight when set DSI backlight level.

Change-Id: I2d1b157d63938c1c1fc6e396b37b142edf6a1e22
Signed-off-by: default avatarXu Yang <yangxu@codeaurora.org>
Signed-off-by: default avatarPing Li <pingli@codeaurora.org>
parent d9089f47
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -76,14 +76,26 @@ int dsi_display_set_backlight(void *display, u32 bl_lvl)
{
	struct dsi_display *dsi_display = display;
	struct dsi_panel *panel;
	u32 bl_scale, bl_scale_ad;
	u64 bl_temp;
	int rc = 0;

	if (dsi_display == NULL)
	if (dsi_display == NULL || dsi_display->panel == NULL)
		return -EINVAL;

	panel = dsi_display->panel;
	panel->bl_config.bl_level = bl_lvl;

	rc = dsi_panel_set_backlight(panel, bl_lvl);
	/* scale backlight */
	bl_scale = panel->bl_config.bl_scale;
	bl_temp = bl_lvl * bl_scale / MAX_BL_SCALE_LEVEL;

	bl_scale_ad = panel->bl_config.bl_scale_ad;
	bl_temp = (u32)bl_temp * bl_scale_ad / MAX_AD_BL_SCALE_LEVEL;

	pr_debug("bl_scale = %u, bl_scale_ad = %u, bl_lvl = %u\n",
		bl_scale, bl_scale_ad, (u32)bl_temp);
	rc = dsi_panel_set_backlight(panel, (u32)bl_temp);
	if (rc)
		pr_err("unable to set backlight\n");

+3 −0
Original line number Diff line number Diff line
@@ -1838,6 +1838,9 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel,
		panel->bl_config.type = DSI_BACKLIGHT_UNKNOWN;
	}

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

	rc = of_property_read_u32(of_node, "qcom,mdss-dsi-bl-min-level", &val);
	if (rc) {
		pr_debug("[%s] bl-min-level unspecified, defaulting to zero\n",
+5 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@
#include "msm_drv.h"

#define MAX_BL_LEVEL 4096
#define MAX_BL_SCALE_LEVEL 1024
#define MAX_AD_BL_SCALE_LEVEL 65535
#define DSI_CMD_PPS_SIZE 135

#define DSI_MODE_MAX 5
@@ -87,6 +89,9 @@ struct dsi_backlight_config {
	u32 bl_min_level;
	u32 bl_max_level;
	u32 brightness_max_level;
	u32 bl_level;
	u32 bl_scale;
	u32 bl_scale_ad;

	int en_gpio;
	/* PWM params */
+2 −0
Original line number Diff line number Diff line
@@ -169,6 +169,8 @@ enum msm_mdp_conn_property {
	CONNECTOR_PROP_DST_W,
	CONNECTOR_PROP_DST_H,
	CONNECTOR_PROP_ROI_V1,
	CONNECTOR_PROP_BL_SCALE,
	CONNECTOR_PROP_AD_BL_SCALE,

	/* enum/bitmask properties */
	CONNECTOR_PROP_TOPOLOGY_NAME,
+48 −0
Original line number Diff line number Diff line
@@ -751,6 +751,42 @@ static int _sde_connector_set_roi_v1(
	return 0;
}

static int _sde_connector_update_bl_scale(struct sde_connector *c_conn,
		int idx,
		uint64_t value)
{
	struct dsi_display *dsi_display = c_conn->display;
	struct dsi_backlight_config *bl_config;
	int rc = 0;

	if (!dsi_display || !dsi_display->panel) {
		pr_err("Invalid params(s) dsi_display %pK, panel %pK\n",
			dsi_display,
			((dsi_display) ? dsi_display->panel : NULL));
		return -EINVAL;
	}

	bl_config = &dsi_display->panel->bl_config;
	if (idx == CONNECTOR_PROP_BL_SCALE) {
		bl_config->bl_scale = value;
		if (value > MAX_BL_SCALE_LEVEL)
			bl_config->bl_scale = MAX_BL_SCALE_LEVEL;
		SDE_DEBUG("set to panel: bl_scale = %u, bl_level = %u\n",
			bl_config->bl_scale, bl_config->bl_level);
		rc = c_conn->ops.set_backlight(dsi_display,
					       bl_config->bl_level);
	} else if (idx == CONNECTOR_PROP_AD_BL_SCALE) {
		bl_config->bl_scale_ad = value;
		if (value > MAX_AD_BL_SCALE_LEVEL)
			bl_config->bl_scale_ad = MAX_AD_BL_SCALE_LEVEL;
		SDE_DEBUG("set to panel: bl_scale_ad = %u, bl_level = %u\n",
			bl_config->bl_scale_ad, bl_config->bl_level);
		rc = c_conn->ops.set_backlight(dsi_display,
					       bl_config->bl_level);
	}
	return rc;
}

static int sde_connector_atomic_set_property(struct drm_connector *connector,
		struct drm_connector_state *state,
		struct drm_property *property,
@@ -809,6 +845,10 @@ static int sde_connector_atomic_set_property(struct drm_connector *connector,
				SDE_ERROR("prep fb failed, %d\n", rc);
		}
		break;
	case CONNECTOR_PROP_BL_SCALE:
	case CONNECTOR_PROP_AD_BL_SCALE:
		rc = _sde_connector_update_bl_scale(c_conn, idx, val);
		break;
	default:
		break;
	}
@@ -1265,6 +1305,14 @@ struct drm_connector *sde_connector_init(struct drm_device *dev,
			0x0, 0, AUTOREFRESH_MAX_FRAME_CNT, 0,
			CONNECTOR_PROP_AUTOREFRESH);

	msm_property_install_range(&c_conn->property_info, "bl_scale",
		0x0, 0, MAX_BL_SCALE_LEVEL, MAX_BL_SCALE_LEVEL,
		CONNECTOR_PROP_BL_SCALE);

	msm_property_install_range(&c_conn->property_info, "ad_bl_scale",
		0x0, 0, MAX_AD_BL_SCALE_LEVEL, MAX_AD_BL_SCALE_LEVEL,
		CONNECTOR_PROP_AD_BL_SCALE);

	/* enum/bitmask properties */
	msm_property_install_enum(&c_conn->property_info, "topology_name",
			DRM_MODE_PROP_IMMUTABLE, 0, e_topology_name,