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

Commit 69ea18df authored by Fenglin Wu's avatar Fenglin Wu Committed by Gerrit - the friendly Code Review server
Browse files

led: qti-tri-led: Use u64 to support longer on/off duration



Use u64 data type for PWM period/duty setting so that the PWM
interfaces can accept bigger values to set longer on/off blinking
duration.

Change-Id: I9b0d4af431336f8dd4098057f1af91c45486c2cf
Signed-off-by: default avatarFenglin Wu <fenglinw@codeaurora.org>
parent 5e5dd276
Loading
Loading
Loading
Loading
+12 −21
Original line number Diff line number Diff line
@@ -44,14 +44,14 @@
#define PWM_PERIOD_DEFAULT_NS		1000000

struct pwm_setting {
	u32	pre_period_ns;
	u32	period_ns;
	u32	duty_ns;
	u64	pre_period_ns;
	u64	period_ns;
	u64	duty_ns;
};

struct led_setting {
	u32			on_ms;
	u32			off_ms;
	u64			on_ms;
	u64			off_ms;
	enum led_brightness	brightness;
	bool			blink;
	bool			breath;
@@ -218,24 +218,16 @@ static int __tri_led_set(struct qpnp_led_dev *led)

static int qpnp_tri_led_set(struct qpnp_led_dev *led)
{
	u32 on_ms, off_ms, period_ns, duty_ns;
	u64 on_ms, off_ms, period_ns, duty_ns;
	enum led_brightness brightness = led->led_setting.brightness;
	int rc = 0;

	if (led->led_setting.blink) {
		on_ms = led->led_setting.on_ms;
		off_ms = led->led_setting.off_ms;
		if (on_ms > INT_MAX / NSEC_PER_MSEC)
			duty_ns = INT_MAX - 1;
		else
			duty_ns = on_ms * NSEC_PER_MSEC;

		if (on_ms + off_ms > INT_MAX / NSEC_PER_MSEC) {
			period_ns = INT_MAX;
			duty_ns = (period_ns / (on_ms + off_ms)) * on_ms;
		} else {
		duty_ns = on_ms * NSEC_PER_MSEC;
		period_ns = (on_ms + off_ms) * NSEC_PER_MSEC;
		}

		if (period_ns < duty_ns && duty_ns != 0)
			period_ns = duty_ns + 1;
@@ -245,15 +237,14 @@ static int qpnp_tri_led_set(struct qpnp_led_dev *led)

		if (brightness == LED_OFF)
			duty_ns = 0;
		else if (period_ns > INT_MAX / brightness)
			duty_ns = (period_ns / LED_FULL) * brightness;
		else
			duty_ns = (period_ns * brightness) / LED_FULL;

		duty_ns = period_ns * brightness;
		do_div(duty_ns, LED_FULL);

		if (period_ns < duty_ns && duty_ns != 0)
			period_ns = duty_ns + 1;
	}
	dev_dbg(led->chip->dev, "PWM settings for %s led: period = %dns, duty = %dns\n",
	dev_dbg(led->chip->dev, "PWM settings for %s led: period = %lluns, duty = %lluns\n",
				led->cdev.name, period_ns, duty_ns);

	led->pwm_setting.duty_ns = duty_ns;