Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 280887
b: refs/heads/master
c: 487d54d
h: refs/heads/master
i:
  280885: c08cdbb
  280883: 9ff21c8
  280879: a89ea45
v: v3
  • Loading branch information
Neil Zhang authored and Felipe Balbi committed Dec 12, 2011
1 parent f0d1299 commit 6744eb0
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9823a52539adce658f2414e33f2838b896ea4971
refs/heads/master: 487d54d172b3afd3d2bf124b24eaf7f7e7b8a668
2 changes: 2 additions & 0 deletions trunk/drivers/usb/gadget/mv_udc.h
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,8 @@ struct mv_udc {
struct work_struct vbus_work;
struct workqueue_struct *qwork;

struct otg_transceiver *transceiver;

struct mv_usb_platform_data *pdata;

/* some SOC has mutiple clock sources for USB*/
Expand Down
33 changes: 30 additions & 3 deletions trunk/drivers/usb/gadget/mv_udc_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1407,6 +1407,20 @@ static int mv_udc_start(struct usb_gadget_driver *driver,
return retval;
}

if (udc->transceiver) {
retval = otg_set_peripheral(udc->transceiver, &udc->gadget);
if (retval) {
dev_err(&udc->dev->dev,
"unable to register peripheral to otg\n");
if (driver->unbind) {
driver->unbind(&udc->gadget);
udc->gadget.dev.driver = NULL;
udc->driver = NULL;
}
return retval;
}
}

/* pullup is always on */
mv_udc_pullup(&udc->gadget, 1);

Expand Down Expand Up @@ -2109,7 +2123,12 @@ static int __devexit mv_udc_remove(struct platform_device *dev)
destroy_workqueue(udc->qwork);
}

if (udc->pdata && udc->pdata->vbus && udc->clock_gating)
/*
* If we have transceiver inited,
* then vbus irq will not be requested in udc driver.
*/
if (udc->pdata && udc->pdata->vbus
&& udc->clock_gating && udc->transceiver == NULL)
free_irq(udc->pdata->vbus->irq, &dev->dev);

/* free memory allocated in probe */
Expand Down Expand Up @@ -2182,6 +2201,11 @@ static int __devinit mv_udc_probe(struct platform_device *dev)

udc->dev = dev;

#ifdef CONFIG_USB_OTG_UTILS
if (pdata->mode == MV_USB_MODE_OTG)
udc->transceiver = otg_get_transceiver();
#endif

udc->clknum = pdata->clknum;
for (clk_i = 0; clk_i < udc->clknum; clk_i++) {
udc->clk[clk_i] = clk_get(&dev->dev, pdata->clkname[clk_i]);
Expand Down Expand Up @@ -2328,7 +2352,9 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
eps_init(udc);

/* VBUS detect: we can disable/enable clock on demand.*/
if (pdata->vbus) {
if (udc->transceiver)
udc->clock_gating = 1;
else if (pdata->vbus) {
udc->clock_gating = 1;
retval = request_threaded_irq(pdata->vbus->irq, NULL,
mv_udc_vbus_irq, IRQF_ONESHOT, "vbus", udc);
Expand Down Expand Up @@ -2371,7 +2397,8 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
return 0;

err_unregister:
if (udc->pdata && udc->pdata->vbus && udc->clock_gating)
if (udc->pdata && udc->pdata->vbus
&& udc->clock_gating && udc->transceiver == NULL)
free_irq(pdata->vbus->irq, &dev->dev);
device_unregister(&udc->gadget.dev);
err_free_irq:
Expand Down

0 comments on commit 6744eb0

Please sign in to comment.