diff options
| author | Abhijeet Dharmapurikar <adharmap@codeaurora.org> | 2016-01-18 11:25:01 -0800 |
|---|---|---|
| committer | Rohit Vaswani <rvaswani@codeaurora.org> | 2016-03-01 12:22:45 -0800 |
| commit | 60402227ec71f254367526393b032ed974952d42 (patch) | |
| tree | ccfdf9f63128ddd3e5c8af390b815ae4e0fd57fa /drivers/platform | |
| parent | 8ee0110ce34e4cb4ce24754682afba2293f8557c (diff) | |
gpio-usbdetect: use gpio instead of irq
The current driver uses irq_read_line api which is not standard.
Instead use a gpio and register for an interrupt when it changes
states. And upon a change in state interrupt is received, read the
gpio state to determine whether it is high or low.
Change-Id: Ie4b1226cedfb44e65a84349da4b3eef5fe988dff
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Diffstat (limited to 'drivers/platform')
| -rw-r--r-- | drivers/platform/msm/gpio-usbdetect.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/platform/msm/gpio-usbdetect.c b/drivers/platform/msm/gpio-usbdetect.c index af546eed5117..80e16573e0aa 100644 --- a/drivers/platform/msm/gpio-usbdetect.c +++ b/drivers/platform/msm/gpio-usbdetect.c @@ -18,6 +18,8 @@ #include <linux/slab.h> #include <linux/of_platform.h> #include <linux/interrupt.h> +#include <linux/of_gpio.h> +#include <linux/gpio.h> #include <linux/power_supply.h> #include <linux/regulator/consumer.h> @@ -26,6 +28,7 @@ struct gpio_usbdetect { struct regulator *vin; struct power_supply *usb_psy; int vbus_det_irq; + int gpio; }; static irqreturn_t gpio_usbdetect_vbus_irq(int irq, void *data) @@ -34,7 +37,7 @@ static irqreturn_t gpio_usbdetect_vbus_irq(int irq, void *data) int vbus; union power_supply_propval pval = {0,}; - vbus = !!irq_read_line(irq); + vbus = gpio_get_value(usb->gpio); if (vbus) pval.intval = POWER_SUPPLY_TYPE_USB; else @@ -87,7 +90,20 @@ static int gpio_usbdetect_probe(struct platform_device *pdev) } } - usb->vbus_det_irq = platform_get_irq_byname(pdev, "vbus_det_irq"); + usb->gpio = of_get_named_gpio(pdev->dev.of_node, + "qcom,vbus-det-gpio", 0); + if (usb->gpio < 0) { + dev_err(&pdev->dev, "Failed to get gpio: %d\n", usb->gpio); + return usb->gpio; + } + + rc = gpio_request(usb->gpio, "vbus-det-gpio"); + if (rc < 0) { + dev_err(&pdev->dev, "Failed to request gpio: %d\n", rc); + return rc; + } + + usb->vbus_det_irq = gpio_to_irq(usb->gpio); if (usb->vbus_det_irq < 0) { if (usb->vin) regulator_disable(usb->vin); |
