USB: gpio_vbus: handle IRQ flags properly
authorShinya Kuribayashi <shinya.kuribayashi.px@renesas.com>
Thu, 17 May 2012 11:10:16 +0000 (20:10 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 May 2012 18:20:34 +0000 (11:20 -0700)
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>
drivers/usb/otg/gpio_vbus.c

index 4e393ef2f2548a582f78186df5edfb203a91edeb..00e763ecb55aa73bf55d9e79128ca715c5c8b9a6 100644 (file)
@@ -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);