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

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

Merge "leds: qpnp-leds-wled: configure AVDD TRIM voltage for AMOLED panels"

parents 1e75ce96 8356c929
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ Optional properties if 'qcom,disp-type-amoled' is mentioned in DT:
- qcom,loop-comp-res-kohm	: control to select the compensation resistor in kohm. default is 320.
- qcom,vref-psm-mv	: reference psm voltage in mv. default for amoled is 450.
- qcom,sc-deb-cycles	: debounce time for short circuit detection
- qcom,avdd-trim-steps-from-center : The number of steps to trim the OVP threshold voltage. The possible values can be between -7 to 8.

Example:
	qcom,leds@d800 {
+41 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@
#define QPNP_WLED_SC_PRO_REG(b)		(b + 0x5E)
#define QPNP_WLED_TEST1_REG(b)		(b + 0xE2)
#define QPNP_WLED_TEST4_REG(b)		(b + 0xE5)
#define QPNP_WLED_REF_7P7_TRIM_REG(b)	(b + 0xF2)

#define QPNP_WLED_EN_MASK		0x7F
#define QPNP_WLED_EN_SHIFT		7
@@ -74,6 +75,9 @@
#define QPNP_WLED_VREF_PSM_MAX_MV			750
#define QPNP_WLED_VREF_PSM_DFLT_AMOLED_MV		450
#define QPNP_WLED_PSM_CTRL_OVERWRITE			0x80
#define QPNP_WLED_AVDD_MIN_TRIM_VALUE			-7
#define QPNP_WLED_AVDD_MAX_TRIM_VALUE			8
#define QPNP_WLED_AVDD_TRIM_CENTER_VALUE		7

#define QPNP_WLED_ILIM_MASK		0xF8
#define QPNP_WLED_ILIM_MIN_MA		105
@@ -232,6 +236,7 @@ static u8 qpnp_wled_sink_dbg_regs[] = {
 *  @ ovp_irq - over voltage protection irq
 *  @ sc_irq - short circuit irq
 *  @ sc_cnt - short circuit irq count
 *  @ avdd_trim_steps_from_center - number of steps to trim from center value
 *  @ ctrl_base - base address for wled ctrl
 *  @ sink_base - base address for wled sink
 *  @ ibb_base - base address for IBB(Inverting Buck Boost)
@@ -272,6 +277,7 @@ struct qpnp_wled {
	int ovp_irq;
	int sc_irq;
	u32 sc_cnt;
	u32 avdd_trim_steps_from_center;
	u16 ctrl_base;
	u16 sink_base;
	u16 mod_freq_khz;
@@ -1083,6 +1089,31 @@ static int qpnp_wled_config(struct qpnp_wled *wled)
	if (rc)
		return rc;

	if (wled->disp_type_amoled) {
		/* Configure avdd trim register */
		rc = qpnp_wled_sec_access(wled, wled->ctrl_base);
		if (rc)
			return rc;

		/* Check if wled->avdd_trim_steps_from_center is negative */
		if ((s32)wled->avdd_trim_steps_from_center <
					QPNP_WLED_AVDD_MIN_TRIM_VALUE) {
			wled->avdd_trim_steps_from_center =
					QPNP_WLED_AVDD_MIN_TRIM_VALUE;
		} else if ((s32)wled->avdd_trim_steps_from_center >
						QPNP_WLED_AVDD_MAX_TRIM_VALUE) {
			wled->avdd_trim_steps_from_center =
					QPNP_WLED_AVDD_MAX_TRIM_VALUE;
		}
		reg = wled->avdd_trim_steps_from_center +
					QPNP_WLED_AVDD_TRIM_CENTER_VALUE;

		rc = qpnp_wled_write_reg(wled, &reg,
				QPNP_WLED_REF_7P7_TRIM_REG(wled->ctrl_base));
		if (rc)
			return rc;
	}

	/* Configure the MODULATION register */
	if (wled->mod_freq_khz <= QPNP_WLED_MOD_FREQ_1200_KHZ) {
		wled->mod_freq_khz = QPNP_WLED_MOD_FREQ_1200_KHZ;
@@ -1395,6 +1426,16 @@ static int qpnp_wled_parse_dt(struct qpnp_wled *wled)
			dev_err(&spmi->dev, "Unable to read sc debounce cycles\n");
			return rc;
		}

		wled->avdd_trim_steps_from_center = 0;
		rc = of_property_read_u32(spmi->dev.of_node,
				"qcom,avdd-trim-steps-from-center", &temp_val);
		if (!rc) {
			wled->avdd_trim_steps_from_center = temp_val;
		} else if (rc != -EINVAL) {
			dev_err(&spmi->dev, "Unable to read avdd trim steps from center value\n");
			return rc;
		}
	}

	wled->fdbk_op = QPNP_WLED_FDBK_AUTO;