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

Commit 4c027f7b authored by Alexandre Belloni's avatar Alexandre Belloni Committed by Thierry Reding
Browse files

pwm: atmel: Fix incorrect CDTY value after enabling



CUPD is not flushed before enabling the channel so it will update
CDTY/CPRD just after one period. So we always set CUPD, even when the
channel is not enabled.

Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@free-electrons.com>
Acked-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
parent cccb9454
Loading
Loading
Loading
Loading
+18 −17
Original line number Diff line number Diff line
@@ -155,25 +155,26 @@ static void atmel_pwm_config_v1(struct pwm_chip *chip, struct pwm_device *pwm,
	struct atmel_pwm_chip *atmel_pwm = to_atmel_pwm_chip(chip);
	unsigned int val;

	if (test_bit(PWMF_ENABLED, &pwm->flags)) {
		/*
		 * If the PWM channel is enabled, using the update register,
		 * it needs to set bit 10 of CMR to 0
		 */

	atmel_pwm_ch_writel(atmel_pwm, pwm->hwpwm, PWMV1_CUPD, dty);

	val = atmel_pwm_ch_readl(atmel_pwm, pwm->hwpwm, PWM_CMR);
	val &= ~PWM_CMR_UPD_CDTY;
	atmel_pwm_ch_writel(atmel_pwm, pwm->hwpwm, PWM_CMR, val);
	} else {

	/*
		 * If the PWM channel is disabled, write value to duty and
		 * period registers directly.
	 * If the PWM channel is enabled, only update CDTY by using the update
	 * register, it needs to set bit 10 of CMR to 0
	 */
	if (test_bit(PWMF_ENABLED, &pwm->flags))
		return;
	/*
	 * If the PWM channel is disabled, write value to duty and period
	 * registers directly.
	 */
	atmel_pwm_ch_writel(atmel_pwm, pwm->hwpwm, PWMV1_CDTY, dty);
	atmel_pwm_ch_writel(atmel_pwm, pwm->hwpwm, PWMV1_CPRD, prd);
}
}

static void atmel_pwm_config_v2(struct pwm_chip *chip, struct pwm_device *pwm,
				unsigned long dty, unsigned long prd)