diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2012-10-30 14:52:25 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2012-10-31 09:22:03 -0400 |
commit | af5ec14d40e0da1de17fcca2b41c76fae5c2cb9d (patch) | |
tree | 0bdfddd642e2455e34ece3a5551038a470db61f1 /drivers/usb/musb/musb_gadget.c | |
parent | 515ba29cd7b571da45365e4db80c1b6905869ef3 (diff) |
usb: musb: Perform only write access on MUSB_INTRRXE
This is part of the workaround for AM35x advisory Advisory 1.1.20.
The advisory says that the IPSS bridge can't handle 8 & 16 bit read
access. An 16bit read access to MUSB_INTRRXE results in an 32bit read
access which also reads INTRUSB and therefore may lose interrupts.
This patch uses a shadow register of MUSB_INTRRXE so we only perform
write access to it.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/musb/musb_gadget.c')
-rw-r--r-- | drivers/usb/musb/musb_gadget.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index b430f158e668..bb684f0f790d 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
@@ -1108,7 +1108,6 @@ static int musb_gadget_enable(struct usb_ep *ep, | |||
1108 | musb_writew(regs, MUSB_TXCSR, csr); | 1108 | musb_writew(regs, MUSB_TXCSR, csr); |
1109 | 1109 | ||
1110 | } else { | 1110 | } else { |
1111 | u16 int_rxe = musb_readw(mbase, MUSB_INTRRXE); | ||
1112 | 1111 | ||
1113 | if (hw_ep->is_shared_fifo) | 1112 | if (hw_ep->is_shared_fifo) |
1114 | musb_ep->is_in = 0; | 1113 | musb_ep->is_in = 0; |
@@ -1120,8 +1119,8 @@ static int musb_gadget_enable(struct usb_ep *ep, | |||
1120 | goto fail; | 1119 | goto fail; |
1121 | } | 1120 | } |
1122 | 1121 | ||
1123 | int_rxe |= (1 << epnum); | 1122 | musb->intrrxe |= (1 << epnum); |
1124 | musb_writew(mbase, MUSB_INTRRXE, int_rxe); | 1123 | musb_writew(mbase, MUSB_INTRRXE, musb->intrrxe); |
1125 | 1124 | ||
1126 | /* REVISIT if can_bulk_combine() use by updating "tmp" | 1125 | /* REVISIT if can_bulk_combine() use by updating "tmp" |
1127 | * likewise high bandwidth periodic rx | 1126 | * likewise high bandwidth periodic rx |
@@ -1214,9 +1213,8 @@ static int musb_gadget_disable(struct usb_ep *ep) | |||
1214 | musb_writew(musb->mregs, MUSB_INTRTXE, int_txe); | 1213 | musb_writew(musb->mregs, MUSB_INTRTXE, int_txe); |
1215 | musb_writew(epio, MUSB_TXMAXP, 0); | 1214 | musb_writew(epio, MUSB_TXMAXP, 0); |
1216 | } else { | 1215 | } else { |
1217 | u16 int_rxe = musb_readw(musb->mregs, MUSB_INTRRXE); | 1216 | musb->intrrxe &= ~(1 << epnum); |
1218 | int_rxe &= ~(1 << epnum); | 1217 | musb_writew(musb->mregs, MUSB_INTRRXE, musb->intrrxe); |
1219 | musb_writew(musb->mregs, MUSB_INTRRXE, int_rxe); | ||
1220 | musb_writew(epio, MUSB_RXMAXP, 0); | 1218 | musb_writew(epio, MUSB_RXMAXP, 0); |
1221 | } | 1219 | } |
1222 | 1220 | ||