diff options
Diffstat (limited to 'drivers/usb/musb/musb_core.c')
-rw-r--r-- | drivers/usb/musb/musb_core.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 18e877ffe7b7..cd70cc886171 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -922,6 +922,52 @@ static void musb_generic_disable(struct musb *musb) | |||
922 | } | 922 | } |
923 | 923 | ||
924 | /* | 924 | /* |
925 | * Program the HDRC to start (enable interrupts, dma, etc.). | ||
926 | */ | ||
927 | void musb_start(struct musb *musb) | ||
928 | { | ||
929 | void __iomem *regs = musb->mregs; | ||
930 | u8 devctl = musb_readb(regs, MUSB_DEVCTL); | ||
931 | |||
932 | dev_dbg(musb->controller, "<== devctl %02x\n", devctl); | ||
933 | |||
934 | /* Set INT enable registers, enable interrupts */ | ||
935 | musb->intrtxe = musb->epmask; | ||
936 | musb_writew(regs, MUSB_INTRTXE, musb->intrtxe); | ||
937 | musb->intrrxe = musb->epmask & 0xfffe; | ||
938 | musb_writew(regs, MUSB_INTRRXE, musb->intrrxe); | ||
939 | musb_writeb(regs, MUSB_INTRUSBE, 0xf7); | ||
940 | |||
941 | musb_writeb(regs, MUSB_TESTMODE, 0); | ||
942 | |||
943 | /* put into basic highspeed mode and start session */ | ||
944 | musb_writeb(regs, MUSB_POWER, MUSB_POWER_ISOUPDATE | ||
945 | | MUSB_POWER_HSENAB | ||
946 | /* ENSUSPEND wedges tusb */ | ||
947 | /* | MUSB_POWER_ENSUSPEND */ | ||
948 | ); | ||
949 | |||
950 | musb->is_active = 0; | ||
951 | devctl = musb_readb(regs, MUSB_DEVCTL); | ||
952 | devctl &= ~MUSB_DEVCTL_SESSION; | ||
953 | |||
954 | /* session started after: | ||
955 | * (a) ID-grounded irq, host mode; | ||
956 | * (b) vbus present/connect IRQ, peripheral mode; | ||
957 | * (c) peripheral initiates, using SRP | ||
958 | */ | ||
959 | if (musb->port_mode != MUSB_PORT_MODE_HOST && | ||
960 | (devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) { | ||
961 | musb->is_active = 1; | ||
962 | } else { | ||
963 | devctl |= MUSB_DEVCTL_SESSION; | ||
964 | } | ||
965 | |||
966 | musb_platform_enable(musb); | ||
967 | musb_writeb(regs, MUSB_DEVCTL, devctl); | ||
968 | } | ||
969 | |||
970 | /* | ||
925 | * Make the HDRC stop (disable interrupts, etc.); | 971 | * Make the HDRC stop (disable interrupts, etc.); |
926 | * reversible by musb_start | 972 | * reversible by musb_start |
927 | * called on gadget driver unregister | 973 | * called on gadget driver unregister |