aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/musb/omap2430.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/musb/omap2430.c')
-rw-r--r--drivers/usb/musb/omap2430.c53
1 files changed, 48 insertions, 5 deletions
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
index bb6e6cd330da..64cf2431c05e 100644
--- a/drivers/usb/musb/omap2430.c
+++ b/drivers/usb/musb/omap2430.c
@@ -328,16 +328,56 @@ static int omap2430_musb_init(struct musb *musb)
328 if (status) 328 if (status)
329 DBG(1, "notification register failed\n"); 329 DBG(1, "notification register failed\n");
330 330
331 /* check whether cable is already connected */
332 if (musb->xceiv->state ==OTG_STATE_B_IDLE)
333 musb_otg_notifications(&musb->nb, 1,
334 musb->xceiv->gadget);
335
336 setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb); 331 setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb);
337 332
338 return 0; 333 return 0;
339} 334}
340 335
336static void omap2430_musb_enable(struct musb *musb)
337{
338 u8 devctl;
339 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
340 struct device *dev = musb->controller;
341 struct musb_hdrc_platform_data *pdata = dev->platform_data;
342 struct omap_musb_board_data *data = pdata->board_data;
343
344 switch (musb->xceiv->last_event) {
345
346 case USB_EVENT_ID:
347 otg_init(musb->xceiv);
348 if (data->interface_type == MUSB_INTERFACE_UTMI) {
349 devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
350 /* start the session */
351 devctl |= MUSB_DEVCTL_SESSION;
352 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
353 while (musb_readb(musb->mregs, MUSB_DEVCTL) &
354 MUSB_DEVCTL_BDEVICE) {
355 cpu_relax();
356
357 if (time_after(jiffies, timeout)) {
358 dev_err(musb->controller,
359 "configured as A device timeout");
360 break;
361 }
362 }
363 }
364 break;
365
366 case USB_EVENT_VBUS:
367 otg_init(musb->xceiv);
368 break;
369
370 default:
371 break;
372 }
373}
374
375static void omap2430_musb_disable(struct musb *musb)
376{
377 if (musb->xceiv->last_event)
378 otg_shutdown(musb->xceiv);
379}
380
341static int omap2430_musb_exit(struct musb *musb) 381static int omap2430_musb_exit(struct musb *musb)
342{ 382{
343 383
@@ -355,6 +395,9 @@ static const struct musb_platform_ops omap2430_ops = {
355 .try_idle = omap2430_musb_try_idle, 395 .try_idle = omap2430_musb_try_idle,
356 396
357 .set_vbus = omap2430_musb_set_vbus, 397 .set_vbus = omap2430_musb_set_vbus,
398
399 .enable = omap2430_musb_enable,
400 .disable = omap2430_musb_disable,
358}; 401};
359 402
360static u64 omap2430_dmamask = DMA_BIT_MASK(32); 403static u64 omap2430_dmamask = DMA_BIT_MASK(32);