···171171 }172172173173 /* Start sampling ID pin, when plug is removed from MUSB */174174- if (is_otg_enabled(musb) && (musb->xceiv->state == OTG_STATE_B_IDLE175175- || musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {174174+ if ((is_otg_enabled(musb) && (musb->xceiv->state == OTG_STATE_B_IDLE175175+ || musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) ||176176+ (musb->int_usb & MUSB_INTR_DISCONNECT && is_host_active(musb))) {176177 mod_timer(&musb_conn_timer, jiffies + TIMER_DELAY);177178 musb->a_wait_bcon = TIMER_DELAY;178179 }···324323 return -EIO;325324}326325327327-int __init musb_platform_init(struct musb *musb, void *board_data)326326+static void musb_platform_reg_init(struct musb *musb)328327{329329-330330- /*331331- * Rev 1.0 BF549 EZ-KITs require PE7 to be high for both DEVICE332332- * and OTG HOST modes, while rev 1.1 and greater require PE7 to333333- * be low for DEVICE mode and high for HOST mode. We set it high334334- * here because we are in host mode335335- */336336-337337- if (gpio_request(musb->config->gpio_vrsel, "USB_VRSEL")) {338338- printk(KERN_ERR "Failed ro request USB_VRSEL GPIO_%d \n",339339- musb->config->gpio_vrsel);340340- return -ENODEV;341341- }342342- gpio_direction_output(musb->config->gpio_vrsel, 0);343343-344344- usb_nop_xceiv_register();345345- musb->xceiv = otg_get_transceiver();346346- if (!musb->xceiv) {347347- gpio_free(musb->config->gpio_vrsel);348348- return -ENODEV;349349- }350350-351328 if (ANOMALY_05000346) {352329 bfin_write_USB_APHY_CALIB(ANOMALY_05000346_value);353330 SSYNC();···337358 }338359339360 /* Configure PLL oscillator register */340340- bfin_write_USB_PLLOSC_CTRL(0x30a8);361361+ bfin_write_USB_PLLOSC_CTRL(0x3080 |362362+ ((480/musb->config->clkin) << 1));341363 SSYNC();342364343365 bfin_write_USB_SRP_CLKDIV((get_sclk()/1000) / 32 - 1);···360380 EP2_RX_ENA | EP3_RX_ENA | EP4_RX_ENA |361381 EP5_RX_ENA | EP6_RX_ENA | EP7_RX_ENA);362382 SSYNC();383383+}384384+385385+int __init musb_platform_init(struct musb *musb, void *board_data)386386+{387387+388388+ /*389389+ * Rev 1.0 BF549 EZ-KITs require PE7 to be high for both DEVICE390390+ * and OTG HOST modes, while rev 1.1 and greater require PE7 to391391+ * be low for DEVICE mode and high for HOST mode. We set it high392392+ * here because we are in host mode393393+ */394394+395395+ if (gpio_request(musb->config->gpio_vrsel, "USB_VRSEL")) {396396+ printk(KERN_ERR "Failed ro request USB_VRSEL GPIO_%d\n",397397+ musb->config->gpio_vrsel);398398+ return -ENODEV;399399+ }400400+ gpio_direction_output(musb->config->gpio_vrsel, 0);401401+402402+ usb_nop_xceiv_register();403403+ musb->xceiv = otg_get_transceiver();404404+ if (!musb->xceiv) {405405+ gpio_free(musb->config->gpio_vrsel);406406+ return -ENODEV;407407+ }408408+409409+ musb_platform_reg_init(musb);363410364411 if (is_host_enabled(musb)) {365412 musb->board_set_vbus = bfin_set_vbus;···400393401394 return 0;402395}396396+397397+#ifdef CONFIG_PM398398+void musb_platform_save_context(struct musb *musb,399399+ struct musb_context_registers *musb_context)400400+{401401+ if (is_host_active(musb))402402+ /*403403+ * During hibernate gpio_vrsel will change from high to low404404+ * low which will generate wakeup event resume the system405405+ * immediately. Set it to 0 before hibernate to avoid this406406+ * wakeup event.407407+ */408408+ gpio_set_value(musb->config->gpio_vrsel, 0);409409+}410410+411411+void musb_platform_restore_context(struct musb *musb,412412+ struct musb_context_registers *musb_context)413413+{414414+ musb_platform_reg_init(musb);415415+}416416+#endif403417404418int musb_platform_exit(struct musb *musb)405419{
+19-22
drivers/usb/musb/musb_core.c
···552552 if (int_usb & MUSB_INTR_SESSREQ) {553553 void __iomem *mbase = musb->mregs;554554555555- if (devctl & MUSB_DEVCTL_BDEVICE) {555555+ if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS556556+ && (devctl & MUSB_DEVCTL_BDEVICE)) {556557 DBG(3, "SessReq while on B state\n");557558 return IRQ_HANDLED;558559 }···10521051 if (musb->clock)10531052 clk_put(musb->clock);10541053 spin_unlock_irqrestore(&musb->lock, flags);10541054+10551055+ if (!is_otg_enabled(musb) && is_host_enabled(musb))10561056+ usb_remove_hcd(musb_to_hcd(musb));10571057+ musb_writeb(musb->mregs, MUSB_DEVCTL, 0);10581058+ musb_platform_exit(musb);1055105910561060 /* FIXME power down */10571061}···22502244 */22512245 musb_exit_debugfs(musb);22522246 musb_shutdown(pdev);22532253-#ifdef CONFIG_USB_MUSB_HDRC_HCD22542254- if (musb->board_mode == MUSB_HOST)22552255- usb_remove_hcd(musb_to_hcd(musb));22562256-#endif22572257- musb_writeb(musb->mregs, MUSB_DEVCTL, 0);22582258- musb_platform_exit(musb);22592259- musb_writeb(musb->mregs, MUSB_DEVCTL, 0);2260224722612248 musb_free(musb);22622249 iounmap(ctrl_base);···24102411 unsigned long flags;24112412 struct musb *musb = dev_to_musb(&pdev->dev);2412241324132413- if (!musb->clock)24142414- return 0;24152415-24162414 spin_lock_irqsave(&musb->lock, flags);2417241524182416 if (is_peripheral_active(musb)) {···2424242824252429 musb_save_context(musb);2426243024272427- if (musb->set_clock)24282428- musb->set_clock(musb->clock, 0);24292429- else24302430- clk_disable(musb->clock);24312431+ if (musb->clock) {24322432+ if (musb->set_clock)24332433+ musb->set_clock(musb->clock, 0);24342434+ else24352435+ clk_disable(musb->clock);24362436+ }24312437 spin_unlock_irqrestore(&musb->lock, flags);24322438 return 0;24332439}···24392441 struct platform_device *pdev = to_platform_device(dev);24402442 struct musb *musb = dev_to_musb(&pdev->dev);2441244324422442- if (!musb->clock)24432443- return 0;24442444-24452445- if (musb->set_clock)24462446- musb->set_clock(musb->clock, 1);24472447- else24482448- clk_enable(musb->clock);24442444+ if (musb->clock) {24452445+ if (musb->set_clock)24462446+ musb->set_clock(musb->clock, 1);24472447+ else24482448+ clk_enable(musb->clock);24492449+ }2449245024502451 musb_restore_context(musb);24512452
···158158 dma_addr_t dma_addr, u32 len)159159{160160 struct musb_dma_channel *musb_channel = channel->private_data;161161+ struct musb_dma_controller *controller = musb_channel->controller;162162+ struct musb *musb = controller->private_data;161163162164 DBG(2, "ep%d-%s pkt_sz %d, dma_addr 0x%x length %d, mode %d\n",163165 musb_channel->epnum,···168166169167 BUG_ON(channel->status == MUSB_DMA_STATUS_UNKNOWN ||170168 channel->status == MUSB_DMA_STATUS_BUSY);169169+170170+ /*171171+ * The DMA engine in RTL1.8 and above cannot handle172172+ * DMA addresses that are not aligned to a 4 byte boundary.173173+ * It ends up masking the last two bits of the address174174+ * programmed in DMA_ADDR.175175+ *176176+ * Fail such DMA transfers, so that the backup PIO mode177177+ * can carry out the transfer178178+ */179179+ if ((musb->hwvers >= MUSB_HWVERS_1800) && (dma_addr % 4))180180+ return false;171181172182 channel->actual_len = 0;173183 musb_channel->start_addr = dma_addr;
+2
include/linux/usb/musb.h
···8989 /* A GPIO controlling VRSEL in Blackfin */9090 unsigned int gpio_vrsel;9191 unsigned int gpio_vrsel_active;9292+ /* musb CLKIN in Blackfin in MHZ */9393+ unsigned char clkin;9294#endif93959496};