summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormaheswarudu <v.maheswarudu@stericsson.com>2011-11-02 19:40:10 +0530
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-01-04 09:56:02 +0100
commit35f12e519f40a55dcd4993f68df88735fe480117 (patch)
tree2206c44dfd2a7ad792dcd8d8a20e9fa3f8033b0c
parent5f962d619438946925c43ddbfc791beb3ebbae7a (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.c27
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,