11 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/slab.h>
55 #define VBUS_IRQ_FLAGS \
56 (IRQF_SHARED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)
60 static void set_vbus_draw(
struct gpio_vbus_data *gpio_vbus,
unsigned mA)
102 if (!gpio_vbus->
phy.otg->gadget)
105 vbus = is_vbus_powered(pdata);
106 if ((vbus ^ gpio_vbus->
vbus) == 0)
108 gpio_vbus->
vbus = vbus;
121 usb_gadget_vbus_connect(gpio_vbus->
phy.otg->gadget);
124 set_vbus_draw(gpio_vbus, 100);
127 if (gpio_is_valid(gpio))
131 status, gpio_vbus->
phy.otg->gadget);
134 if (gpio_is_valid(gpio))
137 set_vbus_draw(gpio_vbus, 0);
139 usb_gadget_vbus_disconnect(gpio_vbus->
phy.otg->gadget);
145 status, gpio_vbus->
phy.otg->gadget);
158 is_vbus_powered(pdata) ?
"supplied" :
"inactive",
170 static int gpio_vbus_set_peripheral(
struct usb_otg *otg,
180 pdata = gpio_vbus->
dev->platform_data;
184 dev_dbg(&pdev->
dev,
"unregistering gadget '%s'\n",
188 if (gpio_is_valid(gpio))
191 set_vbus_draw(gpio_vbus, 0);
193 usb_gadget_vbus_disconnect(otg->
gadget);
205 gpio_vbus_irq(gpio_vbus->
irq, pdev);
210 static int gpio_vbus_set_power(
struct usb_phy *
phy,
unsigned mA)
217 set_vbus_draw(gpio_vbus, mA);
222 static int gpio_vbus_set_suspend(
struct usb_phy *phy,
int suspend)
234 return gpio_vbus_set_power(phy, suspend ? 0 : gpio_vbus->
mA);
245 unsigned long irqflags;
247 if (!pdata || !gpio_is_valid(pdata->
gpio_vbus))
256 if (!gpio_vbus->
phy.otg) {
261 platform_set_drvdata(pdev, gpio_vbus);
262 gpio_vbus->
dev = &pdev->
dev;
263 gpio_vbus->
phy.label =
"gpio-vbus";
264 gpio_vbus->
phy.set_power = gpio_vbus_set_power;
265 gpio_vbus->
phy.set_suspend = gpio_vbus_set_suspend;
268 gpio_vbus->
phy.otg->phy = &gpio_vbus->
phy;
269 gpio_vbus->
phy.otg->set_peripheral = gpio_vbus_set_peripheral;
273 dev_err(&pdev->
dev,
"can't request vbus gpio %d, err: %d\n",
288 gpio_vbus->
irq = irq;
292 if (gpio_is_valid(gpio)) {
296 "can't request pullup gpio %d, err: %d\n",
304 err =
request_irq(irq, gpio_vbus_irq, irqflags,
"vbus_detect", pdev);
306 dev_err(&pdev->
dev,
"can't request irq %i, err: %d\n",
317 dev_dbg(&pdev->
dev,
"can't get vbus_draw regulator, err: %ld\n",
325 dev_err(&pdev->
dev,
"can't register transceiver, err: %d\n",
341 platform_set_drvdata(pdev,
NULL);
363 platform_set_drvdata(pdev,
NULL);
371 static int gpio_vbus_pm_suspend(
struct device *
dev)
375 if (device_may_wakeup(dev))
376 enable_irq_wake(gpio_vbus->
irq);
381 static int gpio_vbus_pm_resume(
struct device *dev)
385 if (device_may_wakeup(dev))
386 disable_irq_wake(gpio_vbus->
irq);
391 static const struct dev_pm_ops gpio_vbus_dev_pm_ops = {
392 .
suspend = gpio_vbus_pm_suspend,
393 .resume = gpio_vbus_pm_resume,
406 .pm = &gpio_vbus_dev_pm_ops,
409 .remove =
__exit_p(gpio_vbus_remove),
412 static int __init gpio_vbus_init(
void)
418 static void __exit gpio_vbus_exit(
void)