aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/musb/musb_core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/musb/musb_core.c')
-rw-r--r--drivers/usb/musb/musb_core.c57
1 files changed, 29 insertions, 28 deletions
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 540c766c4f86..c9f9024c5515 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -272,6 +272,7 @@ void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src)
}
}
+#if !defined(CONFIG_USB_MUSB_AM35X)
/*
* Unload an endpoint's FIFO
*/
@@ -309,6 +310,7 @@ void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
readsb(fifo, dst, len);
}
}
+#endif
#endif /* normal PIO */
@@ -550,6 +552,11 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
if (int_usb & MUSB_INTR_SESSREQ) {
void __iomem *mbase = musb->mregs;
+ if (devctl & MUSB_DEVCTL_BDEVICE) {
+ DBG(3, "SessReq while on B state\n");
+ return IRQ_HANDLED;
+ }
+
DBG(1, "SESSION_REQUEST (%s)\n", otg_state_string(musb));
/* IRQ arrives from ID pin sense or (later, if VBUS power
@@ -1921,10 +1928,6 @@ static void musb_free(struct musb *musb)
dma_controller_destroy(c);
}
-#ifdef CONFIG_USB_MUSB_OTG
- put_device(musb->xceiv->dev);
-#endif
-
#ifdef CONFIG_USB_MUSB_HDRC_HCD
usb_put_hcd(musb_to_hcd(musb));
#else
@@ -2266,6 +2269,7 @@ void musb_save_context(struct musb *musb)
{
int i;
void __iomem *musb_base = musb->mregs;
+ void __iomem *epio;
if (is_host_enabled(musb)) {
musb_context.frame = musb_readw(musb_base, MUSB_FRAME);
@@ -2279,16 +2283,16 @@ void musb_save_context(struct musb *musb)
musb_context.index = musb_readb(musb_base, MUSB_INDEX);
musb_context.devctl = musb_readb(musb_base, MUSB_DEVCTL);
- for (i = 0; i < MUSB_C_NUM_EPS; ++i) {
- musb_writeb(musb_base, MUSB_INDEX, i);
+ for (i = 0; i < musb->config->num_eps; ++i) {
+ epio = musb->endpoints[i].regs;
musb_context.index_regs[i].txmaxp =
- musb_readw(musb_base, 0x10 + MUSB_TXMAXP);
+ musb_readw(epio, MUSB_TXMAXP);
musb_context.index_regs[i].txcsr =
- musb_readw(musb_base, 0x10 + MUSB_TXCSR);
+ musb_readw(epio, MUSB_TXCSR);
musb_context.index_regs[i].rxmaxp =
- musb_readw(musb_base, 0x10 + MUSB_RXMAXP);
+ musb_readw(epio, MUSB_RXMAXP);
musb_context.index_regs[i].rxcsr =
- musb_readw(musb_base, 0x10 + MUSB_RXCSR);
+ musb_readw(epio, MUSB_RXCSR);
if (musb->dyn_fifo) {
musb_context.index_regs[i].txfifoadd =
@@ -2302,13 +2306,13 @@ void musb_save_context(struct musb *musb)
}
if (is_host_enabled(musb)) {
musb_context.index_regs[i].txtype =
- musb_readb(musb_base, 0x10 + MUSB_TXTYPE);
+ musb_readb(epio, MUSB_TXTYPE);
musb_context.index_regs[i].txinterval =
- musb_readb(musb_base, 0x10 + MUSB_TXINTERVAL);
+ musb_readb(epio, MUSB_TXINTERVAL);
musb_context.index_regs[i].rxtype =
- musb_readb(musb_base, 0x10 + MUSB_RXTYPE);
+ musb_readb(epio, MUSB_RXTYPE);
musb_context.index_regs[i].rxinterval =
- musb_readb(musb_base, 0x10 + MUSB_RXINTERVAL);
+ musb_readb(epio, MUSB_RXINTERVAL);
musb_context.index_regs[i].txfunaddr =
musb_read_txfunaddr(musb_base, i);
@@ -2326,8 +2330,6 @@ void musb_save_context(struct musb *musb)
}
}
- musb_writeb(musb_base, MUSB_INDEX, musb_context.index);
-
musb_platform_save_context(musb, &musb_context);
}
@@ -2336,6 +2338,7 @@ void musb_restore_context(struct musb *musb)
int i;
void __iomem *musb_base = musb->mregs;
void __iomem *ep_target_regs;
+ void __iomem *epio;
musb_platform_restore_context(musb, &musb_context);
@@ -2350,15 +2353,15 @@ void musb_restore_context(struct musb *musb)
musb_writeb(musb_base, MUSB_INTRUSBE, musb_context.intrusbe);
musb_writeb(musb_base, MUSB_DEVCTL, musb_context.devctl);
- for (i = 0; i < MUSB_C_NUM_EPS; ++i) {
- musb_writeb(musb_base, MUSB_INDEX, i);
- musb_writew(musb_base, 0x10 + MUSB_TXMAXP,
+ for (i = 0; i < musb->config->num_eps; ++i) {
+ epio = musb->endpoints[i].regs;
+ musb_writew(epio, MUSB_TXMAXP,
musb_context.index_regs[i].txmaxp);
- musb_writew(musb_base, 0x10 + MUSB_TXCSR,
+ musb_writew(epio, MUSB_TXCSR,
musb_context.index_regs[i].txcsr);
- musb_writew(musb_base, 0x10 + MUSB_RXMAXP,
+ musb_writew(epio, MUSB_RXMAXP,
musb_context.index_regs[i].rxmaxp);
- musb_writew(musb_base, 0x10 + MUSB_RXCSR,
+ musb_writew(epio, MUSB_RXCSR,
musb_context.index_regs[i].rxcsr);
if (musb->dyn_fifo) {
@@ -2373,13 +2376,13 @@ void musb_restore_context(struct musb *musb)
}
if (is_host_enabled(musb)) {
- musb_writeb(musb_base, 0x10 + MUSB_TXTYPE,
+ musb_writeb(epio, MUSB_TXTYPE,
musb_context.index_regs[i].txtype);
- musb_writeb(musb_base, 0x10 + MUSB_TXINTERVAL,
+ musb_writeb(epio, MUSB_TXINTERVAL,
musb_context.index_regs[i].txinterval);
- musb_writeb(musb_base, 0x10 + MUSB_RXTYPE,
+ musb_writeb(epio, MUSB_RXTYPE,
musb_context.index_regs[i].rxtype);
- musb_writeb(musb_base, 0x10 + MUSB_RXINTERVAL,
+ musb_writeb(epio, MUSB_RXINTERVAL,
musb_context.index_regs[i].rxinterval);
musb_write_txfunaddr(musb_base, i,
@@ -2400,8 +2403,6 @@ void musb_restore_context(struct musb *musb)
musb_context.index_regs[i].rxhubport);
}
}
-
- musb_writeb(musb_base, MUSB_INDEX, musb_context.index);
}
static int musb_suspend(struct device *dev)