]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00242214 IMX PWM:Correct duty cycle calculation
authorLiu Ying <Ying.liu@freescale.com>
Wed, 30 Jan 2013 04:31:55 +0000 (12:31 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:35:53 +0000 (08:35 +0200)
Since we've already reduced 2 cycles before writing PWMPR
register, the real period cycle on PWMO is the value of
period_cycles (before reducing 2). So, the following commit
message of ENGR00170342, which changes the duty cycle
calculation wrongly, is not reasonable:
===================================================
The chip document says the counter counts up to period_cycles + 1
and then is reset to 0, so the actual period of the PWM wave is
period_cycles + 2
===================================================

Revert "ENGR00170342 PWM: fix pwm output can't be set to 100% full duty"

This reverts commit ac3711f7f24b94db9f78fd7e9bf134c2ecd025ab.

Signed-off-by: Liu Ying <Ying.Liu@freescale.com>
(cherry picked from commit b42be77aa7842834f0fb50924546701b668d7ab9)

arch/arm/plat-mxc/pwm.c

index b683d2eb62619423a5ad0e7733fc252911f69398..eb49057116f193f524bb99f905f2ad0223811ba0 100755 (executable)
@@ -6,7 +6,7 @@
  * published by the Free Software Foundation.
  *
  * Derived from pxa PWM driver by eric miao <eric.miao@marvell.com>
- * Copyright 2009-2012 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2009-2013 Freescale Semiconductor, Inc. All Rights Reserved.
  */
 
 #include <linux/module.h>
@@ -87,11 +87,7 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
                prescale = period_cycles / 0x10000 + 1;
 
                period_cycles /= prescale;
-               /* the chip document says the counter counts up to
-                * period_cycles + 1 and then is reset to 0, so the
-                *  actual period of the PWM wave is period_cycles + 2
-                */
-               c = (unsigned long long)(period_cycles + 2) * duty_ns;
+               c = (unsigned long long)period_cycles * duty_ns;
                do_div(c, period_ns);
                duty_cycles = c;