|
@@ -921,6 +921,52 @@ static void musb_generic_disable(struct musb *musb)
|
|
|
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Program the HDRC to start (enable interrupts, dma, etc.).
|
|
|
+ */
|
|
|
+void musb_start(struct musb *musb)
|
|
|
+{
|
|
|
+ void __iomem *regs = musb->mregs;
|
|
|
+ u8 devctl = musb_readb(regs, MUSB_DEVCTL);
|
|
|
+
|
|
|
+ dev_dbg(musb->controller, "<== devctl %02x\n", devctl);
|
|
|
+
|
|
|
+ /* Set INT enable registers, enable interrupts */
|
|
|
+ musb->intrtxe = musb->epmask;
|
|
|
+ musb_writew(regs, MUSB_INTRTXE, musb->intrtxe);
|
|
|
+ musb->intrrxe = musb->epmask & 0xfffe;
|
|
|
+ musb_writew(regs, MUSB_INTRRXE, musb->intrrxe);
|
|
|
+ musb_writeb(regs, MUSB_INTRUSBE, 0xf7);
|
|
|
+
|
|
|
+ musb_writeb(regs, MUSB_TESTMODE, 0);
|
|
|
+
|
|
|
+ /* put into basic highspeed mode and start session */
|
|
|
+ musb_writeb(regs, MUSB_POWER, MUSB_POWER_ISOUPDATE
|
|
|
+ | MUSB_POWER_HSENAB
|
|
|
+ /* ENSUSPEND wedges tusb */
|
|
|
+ /* | MUSB_POWER_ENSUSPEND */
|
|
|
+ );
|
|
|
+
|
|
|
+ musb->is_active = 0;
|
|
|
+ devctl = musb_readb(regs, MUSB_DEVCTL);
|
|
|
+ devctl &= ~MUSB_DEVCTL_SESSION;
|
|
|
+
|
|
|
+ /* session started after:
|
|
|
+ * (a) ID-grounded irq, host mode;
|
|
|
+ * (b) vbus present/connect IRQ, peripheral mode;
|
|
|
+ * (c) peripheral initiates, using SRP
|
|
|
+ */
|
|
|
+ if (musb->port_mode != MUSB_PORT_MODE_HOST &&
|
|
|
+ (devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) {
|
|
|
+ musb->is_active = 1;
|
|
|
+ } else {
|
|
|
+ devctl |= MUSB_DEVCTL_SESSION;
|
|
|
+ }
|
|
|
+
|
|
|
+ musb_platform_enable(musb);
|
|
|
+ musb_writeb(regs, MUSB_DEVCTL, devctl);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Make the HDRC stop (disable interrupts, etc.);
|
|
|
* reversible by musb_start
|