diff options
author | Harro Haan <hrhaan@gmail.com> | 2010-03-01 11:54:55 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-05-05 04:15:05 -0400 |
commit | 762253741942d8ddbaca1c1ee62d7ed57544332b (patch) | |
tree | 752b1aa44843cafbbdf953e3d72ab46a88e032cc /drivers | |
parent | e8faff7330a3501eafc9bfe5f4f15af444be29f5 (diff) |
ARM: 5966/1: at91_udc HW glitch
Add some delay to avoid reading CSR TXCOUNT too early after
updating it.
For more info about this HW glitch see:
http://lists.arm.linux.org.uk/lurker/message/20090325.150843.f515c02f.en.html
http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20100129/10ba0f8b/attachment.el
http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20100203/09cdb3b4/attachment.el
http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20100203/08b5b249/attachment.el
First applied: "Fix soft lockup in at91 udc driver"
http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=5965
Signed-off-by: Anti Sullin <anti.sullin@artecdesign.ee>
Signed-off-by: Harro Haan <hrhaan@gmail.com>
Acked-by: Remy Bohmer <linux@bohmer.net>
Acked-by: Andrew Victor <linux@maxim.org.za>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/gadget/at91_udc.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 12ac9cd32a07..b3bd22ef82ba 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
@@ -366,6 +366,13 @@ rescan: | |||
366 | if (is_done) | 366 | if (is_done) |
367 | done(ep, req, 0); | 367 | done(ep, req, 0); |
368 | else if (ep->is_pingpong) { | 368 | else if (ep->is_pingpong) { |
369 | /* | ||
370 | * One dummy read to delay the code because of a HW glitch: | ||
371 | * CSR returns bad RXCOUNT when read too soon after updating | ||
372 | * RX_DATA_BK flags. | ||
373 | */ | ||
374 | csr = __raw_readl(creg); | ||
375 | |||
369 | bufferspace -= count; | 376 | bufferspace -= count; |
370 | buf += count; | 377 | buf += count; |
371 | goto rescan; | 378 | goto rescan; |