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

Commit 64f8184a authored by Jishnu Prakash's avatar Jishnu Prakash
Browse files

backlight: qcom-spmi-wled: Add support to configure slew ramp time



Add support to configure slew ramp time for brightness change for
PM7325B by adding a DT property named "qcom,slew-ramp-time".
Also set slew rate to lowest value when enabling or disabling WLED
to ensure fast turning on/off of display and restore it to the
specified value when display is turned on.

Change-Id: I63ae34702b934f45ffab39d521a6ecc0a6c8ccd5
Signed-off-by: default avatarJishnu Prakash <jprakash@codeaurora.org>
parent 601026c7
Loading
Loading
Loading
Loading
+51 −0
Original line number Diff line number Diff line
@@ -183,6 +183,7 @@
#define WLED5_SINK_BRIGHTNESS_SLEW_RATE_CTL_REG	0xb8
#define WLED5_EN_SLEW_CTL	BIT(7)
#define WLED5_EN_EXP_LUT	BIT(6)
#define WLED5_SLEW_RAMP_TIME_SEL	GENMASK(3, 0)

#define WLED5_SINK_DIMMING_EXP_LUT0_LSB_REG	0xc0
#define WLED5_SINK_DIMMING_EXP_LUT0_MSB_REG	0xc1
@@ -223,6 +224,7 @@ struct wled_config {
	int string_cfg;
	int mod_sel;
	int cabc_sel;
	int slew_ramp_time;
	bool en_cabc;
	bool ext_pfet_sc_pro_en;
	bool auto_calib_enabled;
@@ -558,6 +560,17 @@ static int wled_update_status(struct backlight_device *bl)
				pr_err("wled enable failed rc:%d\n", rc);
				goto unlock_mutex;
			}

			if (*wled->version == WLED_PM7325B) {
				rc = regmap_update_bits(wled->regmap,
					wled->sink_addr + WLED5_SINK_BRIGHTNESS_SLEW_RATE_CTL_REG,
					WLED5_SLEW_RAMP_TIME_SEL,
					wled->cfg.slew_ramp_time);
				if (rc < 0) {
					pr_err("Failed to write to SLEW_RATE_REGISTER rc:%d\n", rc);
					goto unlock_mutex;
				}
			}
		}

		if (is_wled5(wled)) {
@@ -569,6 +582,16 @@ static int wled_update_status(struct backlight_device *bl)
			}
		}
	} else {
		if (*wled->version == WLED_PM7325B) {
			rc = regmap_update_bits(wled->regmap,
					wled->sink_addr + WLED5_SINK_BRIGHTNESS_SLEW_RATE_CTL_REG,
					WLED5_SLEW_RAMP_TIME_SEL, 0);
			if (rc < 0) {
				pr_err("Failed to write to SLEW_RATE_REGISTER rc:%d\n", rc);
				goto unlock_mutex;
			}
		}

		rc = wled_module_enable(wled, brightness);
		if (rc < 0) {
			pr_err("wled disable failed rc:%d\n", rc);
@@ -1305,6 +1328,16 @@ static int wled5_setup(struct wled *wled)
	if (rc < 0)
		return rc;

	if (*wled->version == WLED_PM7325B) {
		val = WLED5_EN_SLEW_CTL | wled->cfg.slew_ramp_time;
		rc = regmap_update_bits(wled->regmap,
			wled->sink_addr + WLED5_SINK_BRIGHTNESS_SLEW_RATE_CTL_REG,
			WLED5_EN_SLEW_CTL | WLED5_SLEW_RAMP_TIME_SEL,
			val);
		if (rc < 0)
			return rc;
	}

	if (wled->cfg.use_exp_dimming) {
		rc = wled_program_exp_dimming(wled);
		if (rc < 0) {
@@ -1485,6 +1518,7 @@ static const struct wled_config wled4_config_defaults = {
	.string_cfg = 0xf,
	.mod_sel = -EINVAL,
	.cabc_sel = -EINVAL,
	.slew_ramp_time = -EINVAL,
	.en_cabc = 0,
	.ext_pfet_sc_pro_en = 0,
	.auto_calib_enabled = 0,
@@ -1499,6 +1533,7 @@ static const struct wled_config wled5_config_defaults = {
	.string_cfg = 0xf,
	.mod_sel = 0,
	.cabc_sel = 0,
	.slew_ramp_time = 6,	/* 256 ms */
	.en_cabc = 0,
	.ext_pfet_sc_pro_en = 0,
	.auto_calib_enabled = 0,
@@ -1586,6 +1621,17 @@ static const struct wled_var_cfg wled5_cabc_sel_cfg = {
	.size = 4,
};

/* Applicable only for PM7325B */
static const u32 wled5_slew_ramp_time_values[] = {
	2, 4, 8, 64, 128, 192, 256, 320, 384, 448, 512, 704,
	896, 1024, 2048, 4096,
};

static const struct wled_var_cfg wled5_slew_ramp_time_cfg = {
	.values = wled5_slew_ramp_time_values,
	.size = ARRAY_SIZE(wled5_slew_ramp_time_values),
};

static u32 wled_values(const struct wled_var_cfg *cfg, u32 idx)
{
	if (!cfg)
@@ -2359,6 +2405,11 @@ static int wled_configure(struct wled *wled, struct device *dev)
			.val_ptr = &cfg->cabc_sel,
			.cfg = &wled5_cabc_sel_cfg,
		},
		{
			.name = "qcom,slew-ramp-time",
			.val_ptr = &cfg->slew_ramp_time,
			.cfg = &wled5_slew_ramp_time_cfg,
		},
	};

	const struct {