diff options
author | Shinya Kuribayashi <shinya.kuribayashi.px@renesas.com> | 2012-05-17 20:10:16 +0900 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-05-17 11:20:34 -0700 |
commit | c8240c1b810ac4adc13e04244781db6d2ff272be (patch) | |
tree | 8057659c4d4221ceb705255b5f05a1b18bd4d484 /drivers/usb | |
parent | da020b49fa6ee7eaf9fe359bc6089dd1848bb7d0 (diff) | |
download | linux-stable-c8240c1b810ac4adc13e04244781db6d2ff272be.tar.gz linux-stable-c8240c1b810ac4adc13e04244781db6d2ff272be.tar.bz2 linux-stable-c8240c1b810ac4adc13e04244781db6d2ff272be.zip |
USB: gpio_vbus: handle IRQ flags properly
Currently, 'res->flags' handlings are wrong in three respects:
* the driver _modifies_ the contents of platform data
* res->flags is set up, but not used anywhere in the driver
* request_irq() always takes VBUS_IRQ_FLAGS, regardless of refs->flags
This patch tries to fix this with a policy: If a platform IRQ resource
is available, give preference to its IRQ flag(s) over a default one
(VBUS_IRQ_FLAGS).
Signed-off-by: Shinya Kuribayashi <shinya.kuribayashi.px@renesas.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/otg/gpio_vbus.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/usb/otg/gpio_vbus.c b/drivers/usb/otg/gpio_vbus.c index 4e393ef2f254..00e763ecb55a 100644 --- a/drivers/usb/otg/gpio_vbus.c +++ b/drivers/usb/otg/gpio_vbus.c @@ -242,6 +242,7 @@ static int __init gpio_vbus_probe(struct platform_device *pdev) struct gpio_vbus_data *gpio_vbus; struct resource *res; int err, gpio, irq; + unsigned long irqflags; if (!pdata || !gpio_is_valid(pdata->gpio_vbus)) return -EINVAL; @@ -278,10 +279,11 @@ static int __init gpio_vbus_probe(struct platform_device *pdev) res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (res) { irq = res->start; - res->flags &= IRQF_TRIGGER_MASK; - res->flags |= IRQF_SHARED; - } else + irqflags = (res->flags & IRQF_TRIGGER_MASK) | IRQF_SHARED; + } else { irq = gpio_to_irq(gpio); + irqflags = VBUS_IRQ_FLAGS; + } gpio_vbus->irq = irq; @@ -299,8 +301,7 @@ static int __init gpio_vbus_probe(struct platform_device *pdev) gpio_direction_output(gpio, pdata->gpio_pullup_inverted); } - err = request_irq(irq, gpio_vbus_irq, VBUS_IRQ_FLAGS, - "vbus_detect", pdev); + err = request_irq(irq, gpio_vbus_irq, irqflags, "vbus_detect", pdev); if (err) { dev_err(&pdev->dev, "can't request irq %i, err: %d\n", irq, err); |