diff options
Diffstat (limited to 'drivers/usb/otg')
-rw-r--r-- | drivers/usb/otg/isp1301_omap.c | 4 | ||||
-rw-r--r-- | drivers/usb/otg/otg_fsm.c | 1 | ||||
-rw-r--r-- | drivers/usb/otg/twl4030-usb.c | 2 | ||||
-rw-r--r-- | drivers/usb/otg/twl6030-usb.c | 30 |
4 files changed, 27 insertions, 10 deletions
diff --git a/drivers/usb/otg/isp1301_omap.c b/drivers/usb/otg/isp1301_omap.c index 8c282258e1bd..ca9b690a7e40 100644 --- a/drivers/usb/otg/isp1301_omap.c +++ b/drivers/usb/otg/isp1301_omap.c @@ -660,7 +660,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp) int ret = IRQ_NONE; struct isp1301 *isp = _isp; - /* update ISP1301 transciever from OTG controller */ + /* update ISP1301 transceiver from OTG controller */ if (otg_irq & OPRT_CHG) { omap_writew(OPRT_CHG, OTG_IRQ_SRC); isp1301_defer_work(isp, WORK_UPDATE_ISP); @@ -755,7 +755,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp) omap_writew(A_VBUS_ERR, OTG_IRQ_SRC); ret = IRQ_HANDLED; - /* switch driver; the transciever code activates it, + /* switch driver; the transceiver code activates it, * ungating the udc clock or resuming OHCI. */ } else if (otg_irq & DRIVER_SWITCH) { diff --git a/drivers/usb/otg/otg_fsm.c b/drivers/usb/otg/otg_fsm.c index b0cc422f2ff9..09117387d2a4 100644 --- a/drivers/usb/otg/otg_fsm.c +++ b/drivers/usb/otg/otg_fsm.c @@ -28,7 +28,6 @@ #include <linux/usb.h> #include <linux/usb/gadget.h> #include <linux/usb/otg.h> -#include <linux/types.h> #include "otg_fsm.h" diff --git a/drivers/usb/otg/twl4030-usb.c b/drivers/usb/otg/twl4030-usb.c index efeb4d1517ff..14f66c358629 100644 --- a/drivers/usb/otg/twl4030-usb.c +++ b/drivers/usb/otg/twl4030-usb.c @@ -166,7 +166,7 @@ struct twl4030_usb { }; /* internal define on top of container_of */ -#define xceiv_to_twl(x) container_of((x), struct twl4030_usb, otg); +#define xceiv_to_twl(x) container_of((x), struct twl4030_usb, otg) /*-------------------------------------------------------------------------*/ diff --git a/drivers/usb/otg/twl6030-usb.c b/drivers/usb/otg/twl6030-usb.c index cfb5aa72b196..b4d2c0972b3d 100644 --- a/drivers/usb/otg/twl6030-usb.c +++ b/drivers/usb/otg/twl6030-usb.c @@ -95,11 +95,15 @@ struct twl6030_usb { struct regulator *usb3v3; + /* used to set vbus, in atomic path */ + struct work_struct set_vbus_work; + int irq1; int irq2; u8 linkstat; u8 asleep; bool irq_enabled; + bool vbus_enable; unsigned long features; }; @@ -370,20 +374,31 @@ static int twl6030_enable_irq(struct otg_transceiver *x) return 0; } -static int twl6030_set_vbus(struct otg_transceiver *x, bool enabled) +static void otg_set_vbus_work(struct work_struct *data) { - struct twl6030_usb *twl = xceiv_to_twl(x); + struct twl6030_usb *twl = container_of(data, struct twl6030_usb, + set_vbus_work); /* * Start driving VBUS. Set OPA_MODE bit in CHARGERUSB_CTRL1 * register. This enables boost mode. */ - if (enabled) + + if (twl->vbus_enable) twl6030_writeb(twl, TWL_MODULE_MAIN_CHARGE , 0x40, - CHARGERUSB_CTRL1); - else + CHARGERUSB_CTRL1); + else twl6030_writeb(twl, TWL_MODULE_MAIN_CHARGE , 0x00, - CHARGERUSB_CTRL1); + CHARGERUSB_CTRL1); +} + +static int twl6030_set_vbus(struct otg_transceiver *x, bool enabled) +{ + struct twl6030_usb *twl = xceiv_to_twl(x); + + twl->vbus_enable = enabled; + schedule_work(&twl->set_vbus_work); + return 0; } @@ -444,6 +459,8 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) ATOMIC_INIT_NOTIFIER_HEAD(&twl->otg.notifier); + INIT_WORK(&twl->set_vbus_work, otg_set_vbus_work); + twl->irq_enabled = true; status = request_threaded_irq(twl->irq1, NULL, twl6030_usbotg_irq, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, @@ -494,6 +511,7 @@ static int __exit twl6030_usb_remove(struct platform_device *pdev) regulator_put(twl->usb3v3); pdata->phy_exit(twl->dev); device_remove_file(twl->dev, &dev_attr_vbus); + cancel_work_sync(&twl->set_vbus_work); kfree(twl); return 0; |