diff options
author | maheswarudu <v.maheswarudu@stericsson.com> | 2011-11-02 19:40:10 +0530 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@linaro.org> | 2011-12-21 09:49:16 +0100 |
commit | 5c9937262533c4789db34bde6ac5594bcc941626 (patch) | |
tree | 47735c072de6e0ff790655101f689bf27022dbed | |
parent | 04c7099e21e6c44d1f1e785dc9846d584c4245ee (diff) |
ux500: USB : Save/Restore musb registers correctly
In suspended state the registers are not saved and restored
properly hence back ported.
(http://git.kernel.org/?p=linux/kernel/git/gregkh/usb.git;
a=commit;h=e4e5b136eb6f2d3aa10dca108a1b787dc92d67df)
Also the code is aligned as per the latest linux-next.
ST-Ericsson ID: 366298, 368370
ST-Ericsson Linux next: NA
ST-Ericsson FOSS-OUT ID: NA
Change-Id: I97ae0b055f6f1300a11190e1083349a6583f0377
Signed-off-by: maheswarudu <v.maheswarudu@stericsson.com>
-rw-r--r-- | drivers/usb/musb/ux500.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/drivers/usb/musb/ux500.c b/drivers/usb/musb/ux500.c index d0bfd2ffdc9..9eaa8b1a8df 100644 --- a/drivers/usb/musb/ux500.c +++ b/drivers/usb/musb/ux500.c @@ -59,6 +59,7 @@ void ux500_store_context(struct musb *musb) if (is_host_enabled(musb)) { context.frame = musb_readw(musb_base, MUSB_FRAME); context.testmode = musb_readb(musb_base, MUSB_TESTMODE); + context.busctl = musb_read_ulpi_buscontrol(musb->mregs); } context.power = musb_readb(musb_base, MUSB_POWER); context.intrtxe = musb_readw(musb_base, MUSB_INTRTXE); @@ -66,8 +67,19 @@ void ux500_store_context(struct musb *musb) context.intrusbe = musb_readb(musb_base, MUSB_INTRUSBE); context.index = musb_readb(musb_base, MUSB_INDEX); context.devctl = DEFAULT_DEVCTL; + for (i = 0; i < musb->config->num_eps; ++i) { - epio = musb->endpoints[i].regs; + struct musb_hw_ep *hw_ep; + + musb_writeb(musb_base, MUSB_INDEX, i); + hw_ep = &musb->endpoints[i]; + if (!hw_ep) + continue; + + epio = hw_ep->regs; + if (!epio) + continue; + context.index_regs[i].txmaxp = musb_readw(epio, MUSB_TXMAXP); context.index_regs[i].txcsr = @@ -132,6 +144,7 @@ void ux500_restore_context(void) if (is_host_enabled(musb)) { musb_writew(musb_base, MUSB_FRAME, context.frame); musb_writeb(musb_base, MUSB_TESTMODE, context.testmode); + musb_write_ulpi_buscontrol(musb->mregs, context.busctl); } musb_writeb(musb_base, MUSB_POWER, context.power); musb_writew(musb_base, MUSB_INTRTXE, context.intrtxe); @@ -140,7 +153,17 @@ void ux500_restore_context(void) musb_writeb(musb_base, MUSB_DEVCTL, context.devctl); for (i = 0; i < musb->config->num_eps; ++i) { - epio = musb->endpoints[i].regs; + struct musb_hw_ep *hw_ep; + + musb_writeb(musb_base, MUSB_INDEX, i); + hw_ep = &musb->endpoints[i]; + if (!hw_ep) + continue; + + epio = hw_ep->regs; + if (!epio) + continue; + musb_writew(epio, MUSB_TXMAXP, context.index_regs[i].txmaxp); musb_writew(epio, MUSB_TXCSR, |