summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 4d531d5)
raw | patch | inline | side by side (parent: 4d531d5)
author | Ajay Kumar Gupta <ajay.gupta@ti.com> | |
Sat, 10 Mar 2012 06:44:36 +0000 (12:14 +0530) | ||
committer | Ajay Kumar Gupta <ajay.gupta@ti.com> | |
Sat, 10 Mar 2012 09:26:43 +0000 (14:56 +0530) |
Fixes control transfer timeout and followed by re-enumeration of usb
devices after resume.
We need to switch off the session before DEVCTL register context save
and switch on the session before restoring POWER register context.
devices after resume.
We need to switch off the session before DEVCTL register context save
and switch on the session before restoring POWER register context.
drivers/usb/musb/musb_core.c | patch | blob | history | |
drivers/usb/musb/ti81xx.c | patch | blob | history |
index db5afeb746565a9e3f42842419179f7ddd29bdb5..fe32b6d22ed0319efecb03ab8d48b3dbd2ee62e8 100644 (file)
int i;
void __iomem *musb_base = musb->mregs;
void __iomem *epio;
+ u8 devctl;
if (is_host_enabled(musb)) {
musb->context.frame = musb_readw(musb_base, MUSB_FRAME);
musb->context.intrrxe = musb_readw(musb_base, MUSB_INTRRXE);
musb->context.intrusbe = musb_readb(musb_base, MUSB_INTRUSBE);
musb->context.index = musb_readb(musb_base, MUSB_INDEX);
+
+ /* switch off the session */
+ devctl = musb_readb(musb_base, MUSB_DEVCTL);
+ devctl &= ~MUSB_DEVCTL_SESSION;
+ musb_writeb(musb_base, MUSB_DEVCTL, devctl);
+
musb->context.devctl = musb_readb(musb_base, MUSB_DEVCTL);
for (i = 0; i < musb->config->num_eps; ++i) {
void __iomem *musb_base = musb->mregs;
void __iomem *ep_target_regs;
void __iomem *epio;
+ u8 devctl;
if (is_host_enabled(musb)) {
musb_writew(musb_base, MUSB_FRAME, musb->context.frame);
musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode);
musb_write_ulpi_buscontrol(musb->mregs, musb->context.busctl);
}
+
+ /* switch on the session */
+ devctl = musb->context.devctl | MUSB_DEVCTL_SESSION;
+ musb_writeb(musb_base, MUSB_DEVCTL, devctl);
+
musb_writeb(musb_base, MUSB_POWER, musb->context.power);
musb_writew(musb_base, MUSB_INTRTXE, musb->context.intrtxe);
musb_writew(musb_base, MUSB_INTRRXE, musb->context.intrrxe);
musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe);
- musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl);
for (i = 0; i < musb->config->num_eps; ++i) {
struct musb_hw_ep *hw_ep;
index da6f5feb752dc51ca49b1017b749e36364427c59..60577a836f0ae3c05cd287af36275d97190123e9 100644 (file)
/* restore CPPI4.1 DMA register for dma block 0 */
cppi41_restore_context(0, dma_sched_table);
#endif
+ /* controller needs 200ms delay to resume */
+ msleep(200);
}
static int ti81xx_runtime_suspend(struct device *dev)
{