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

Commit def62666 authored by Shantanu Jain's avatar Shantanu Jain
Browse files

leds: qpnp-wled: Add sync register writes in WLED driver probe



Add consecutive sync register writes in WLED driver probe.
This is needed for properly reflecting the configuration values
written for the WLED strings.

Change-Id: I252d3ee69ef3b0b67a3b137230a0b2a67f3e90d1
Signed-off-by: default avatarShantanu Jain <shjain@codeaurora.org>
parent a660e4d0
Loading
Loading
Loading
Loading
+40 −31
Original line number Original line Diff line number Diff line
/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
 *
 *
 * This program is free software; you can redistribute it and/or modify
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * it under the terms of the GNU General Public License version 2 and
@@ -349,6 +349,31 @@ static int qpnp_wled_sec_access(struct qpnp_wled *wled, u16 base_addr)
	return 0;
	return 0;
}
}


static int qpnp_wled_sync_reg_toggle(struct qpnp_wled *wled)
{
	int rc;
	u8 reg;

	/* sync */
	reg = QPNP_WLED_SYNC;
	rc = qpnp_wled_write_reg(wled, &reg,
		QPNP_WLED_SYNC_REG(wled->sink_base));
	if (rc < 0)
		return rc;

	if (wled->cons_sync_write_delay_us)
		usleep_range(wled->cons_sync_write_delay_us,
				wled->cons_sync_write_delay_us + 1);

	reg = QPNP_WLED_SYNC_RESET;
	rc = qpnp_wled_write_reg(wled, &reg,
		QPNP_WLED_SYNC_REG(wled->sink_base));
	if (rc < 0)
		return rc;

	return 0;
}

/* set wled to a level of brightness */
/* set wled to a level of brightness */
static int qpnp_wled_set_level(struct qpnp_wled *wled, int level)
static int qpnp_wled_set_level(struct qpnp_wled *wled, int level)
{
{
@@ -373,22 +398,11 @@ static int qpnp_wled_set_level(struct qpnp_wled *wled, int level)
			return rc;
			return rc;
	}
	}


	/* sync */
	rc = qpnp_wled_sync_reg_toggle(wled);
	reg = QPNP_WLED_SYNC;
	if (rc < 0) {
	rc = qpnp_wled_write_reg(wled, &reg,
		dev_err(&wled->spmi->dev, "Failed to toggle sync reg %d\n", rc);
		QPNP_WLED_SYNC_REG(wled->sink_base));
	if (rc < 0)
		return rc;

	if (wled->cons_sync_write_delay_us)
		usleep_range(wled->cons_sync_write_delay_us,
				wled->cons_sync_write_delay_us + 1);

	reg = QPNP_WLED_SYNC_RESET;
	rc = qpnp_wled_write_reg(wled, &reg,
		QPNP_WLED_SYNC_REG(wled->sink_base));
	if (rc < 0)
		return rc;
		return rc;
	}


	return 0;
	return 0;
}
}
@@ -712,22 +726,11 @@ static ssize_t qpnp_wled_fs_curr_ua_store(struct device *dev,


	wled->fs_curr_ua = data;
	wled->fs_curr_ua = data;


	/* sync */
	rc = qpnp_wled_sync_reg_toggle(wled);
	reg = QPNP_WLED_SYNC;
	if (rc < 0) {
	rc = qpnp_wled_write_reg(wled, &reg,
		dev_err(&wled->spmi->dev, "Failed to toggle sync reg %d\n", rc);
		QPNP_WLED_SYNC_REG(wled->sink_base));
	if (rc < 0)
		return rc;

	if (wled->cons_sync_write_delay_us)
		usleep_range(wled->cons_sync_write_delay_us,
				wled->cons_sync_write_delay_us + 1);

	reg = QPNP_WLED_SYNC_RESET;
	rc = qpnp_wled_write_reg(wled, &reg,
		QPNP_WLED_SYNC_REG(wled->sink_base));
	if (rc < 0)
		return rc;
		return rc;
	}


	return count;
	return count;
}
}
@@ -1289,6 +1292,12 @@ static int qpnp_wled_config(struct qpnp_wled *wled)
			return rc;
			return rc;
	}
	}


	rc = qpnp_wled_sync_reg_toggle(wled);
	if (rc < 0) {
		dev_err(&wled->spmi->dev, "Failed to toggle sync reg %d\n", rc);
		return rc;
	}

	/* setup ovp and sc irqs */
	/* setup ovp and sc irqs */
	if (wled->ovp_irq >= 0) {
	if (wled->ovp_irq >= 0) {
		rc = devm_request_threaded_irq(&wled->spmi->dev, wled->ovp_irq,
		rc = devm_request_threaded_irq(&wled->spmi->dev, wled->ovp_irq,