ARM: S3C: PWM fix for low duty cycle
authorPeter Korsgaard <jacmet@sunsite.dk>
Wed, 1 Jul 2009 15:47:08 +0000 (17:47 +0200)
committerBen Dooks <ben-linux@fluff.org>
Thu, 30 Jul 2009 22:54:50 +0000 (23:54 +0100)
The pwm hardware only checks the compare register after a decrement,
so the pin never toggles if tcmp = tcnt.

This happens when a very low duty cycle is requested. Fix it by always
ensuring that tcmp < tcnt.

Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
arch/arm/plat-s3c24xx/pwm.c

index 0120b760315ba3a881fdf1829739b015829479a4..82a6d4de02a381ddfff417cf66b8c0425d107502 100644 (file)
@@ -246,6 +246,10 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
 
        tcmp = duty_ns / tin_ns;
        tcmp = tcnt - tcmp;
+       /* the pwm hw only checks the compare register after a decrement,
+          so the pin never toggles if tcmp = tcnt */
+       if (tcmp == tcnt)
+               tcmp--;
 
        pwm_dbg(pwm, "tin_ns=%lu, tcmp=%ld/%lu\n", tin_ns, tcmp, tcnt);