[PATCH 1/2] pwm: vt8500: Register write busy test performed incorrectly
From: Thierry Reding <hidden>
Date: 2013-01-02 13:55:32
Also in:
lkml
On Mon, Dec 31, 2012 at 09:23:24AM +1300, Tony Prisk wrote:
quoted hunk ↗ jump to hunk
Correct operation for register writes is to perform a busy-wait after writing the register. Currently the busy wait it performed before, meaning subsequent register writes to bitfields may occur before the previous field has been updated. Also, all registers are defined as 32-bit read/write. Change pwm_busy_wait() to use readl rather than readb. Improve readability of code with defines for registers and bitfields. Signed-off-by: Tony Prisk <redacted> --- Thierry, This patch is a fix but it can go to 3.9 rather than 3.8 (if you prefer) as the incorrect behaviour doesn't seem to cause a problem on current hardware. drivers/pwm/pwm-vt8500.c | 62 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 14 deletions(-)diff --git a/drivers/pwm/pwm-vt8500.c b/drivers/pwm/pwm-vt8500.c index b0ba2d4..27ed0f4 100644 --- a/drivers/pwm/pwm-vt8500.c +++ b/drivers/pwm/pwm-vt8500.c@@ -36,6 +36,25 @@ */ #define VT8500_NR_PWMS 2 +#define REG_CTRL(pwm) (pwm << 4) + 0x00 +#define REG_SCALAR(pwm) (pwm << 4) + 0x04 +#define REG_PERIOD(pwm) (pwm << 4) + 0x08 +#define REG_DUTY(pwm) (pwm << 4) + 0x0C
To be on the safe side, I think these should be: (((pwm) << 4) + offset)
-static inline void pwm_busy_wait(void __iomem *reg, u8 bitmask)
+static inline void pwm_busy_wait(struct vt8500_chip *vt8500, int nr, u8 bitmask)
{
int loops = msecs_to_loops(10);
- while ((readb(reg) & bitmask) && --loops)
+ u32 mask = bitmask << (nr << 8);
+
+ while ((readl(vt8500->base + REG_STATUS) & mask) && --loops)
cpu_relax();
if (unlikely(!loops))
pr_warn("Waiting for status bits 0x%x to clear timed out\n",
- bitmask);
+ mask);
}Now that you're passing a struct vt8500_chip, couldn't you use dev_warn() instead? Thierry -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 836 bytes Desc: not available URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20130102/e247497b/attachment.sig>