aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/otg/gpio_vbus.c
diff options
context:
space:
mode:
authorShinya Kuribayashi <shinya.kuribayashi.px@renesas.com>2012-05-17 07:09:32 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-05-17 14:20:34 -0400
commit123bbceebeb1174e385eab1fc2b2535dcdcc9ec3 (patch)
treeda536562050c623182c4fbc8d5fe02b3140f78c5 /drivers/usb/otg/gpio_vbus.c
parent8f9d973a0daee49e0b9b924c724b18b0170ec9cb (diff)
USB: gpio_vbus: use cached IRQ number for consistency with the probed one
gpio_vbus is designed to be able to get an IRQ number for VBUS change interrupt either (1) through platform_get_resource(IORESOURCE_IRQ) or (2) by processing gpio_to_irq(pdata->gpio_vbus), in probe() function. On the other hand, gpio_vbus_set_peripheral() and gpio_vbus_remove() are always doing gpio_to_irq(pdata->gpio_vbus) to get an IRQ number. This is not just inconsistent, but also broken. There is no guarantee that an IRQ number obtained by platform_get_resource() is equal to gpio_to_irq(pdata->gpio_vbus). Cache an IRQ number in probe() function, and use it where necessary. Signed-off-by: Shinya Kuribayashi <shinya.kuribayashi.px@renesas.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/otg/gpio_vbus.c')
-rw-r--r--drivers/usb/otg/gpio_vbus.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/usb/otg/gpio_vbus.c b/drivers/usb/otg/gpio_vbus.c
index bd6e755dd3d8..8853cb1fd9d7 100644
--- a/drivers/usb/otg/gpio_vbus.c
+++ b/drivers/usb/otg/gpio_vbus.c
@@ -39,6 +39,7 @@ struct gpio_vbus_data {
39 unsigned mA; 39 unsigned mA;
40 struct delayed_work work; 40 struct delayed_work work;
41 int vbus; 41 int vbus;
42 int irq;
42}; 43};
43 44
44 45
@@ -173,12 +174,11 @@ static int gpio_vbus_set_peripheral(struct usb_otg *otg,
173 struct gpio_vbus_data *gpio_vbus; 174 struct gpio_vbus_data *gpio_vbus;
174 struct gpio_vbus_mach_info *pdata; 175 struct gpio_vbus_mach_info *pdata;
175 struct platform_device *pdev; 176 struct platform_device *pdev;
176 int gpio, irq; 177 int gpio;
177 178
178 gpio_vbus = container_of(otg->phy, struct gpio_vbus_data, phy); 179 gpio_vbus = container_of(otg->phy, struct gpio_vbus_data, phy);
179 pdev = to_platform_device(gpio_vbus->dev); 180 pdev = to_platform_device(gpio_vbus->dev);
180 pdata = gpio_vbus->dev->platform_data; 181 pdata = gpio_vbus->dev->platform_data;
181 irq = gpio_to_irq(pdata->gpio_vbus);
182 gpio = pdata->gpio_pullup; 182 gpio = pdata->gpio_pullup;
183 183
184 if (!gadget) { 184 if (!gadget) {
@@ -203,7 +203,7 @@ static int gpio_vbus_set_peripheral(struct usb_otg *otg,
203 203
204 /* initialize connection state */ 204 /* initialize connection state */
205 gpio_vbus->vbus = 0; /* start with disconnected */ 205 gpio_vbus->vbus = 0; /* start with disconnected */
206 gpio_vbus_irq(irq, pdev); 206 gpio_vbus_irq(gpio_vbus->irq, pdev);
207 return 0; 207 return 0;
208} 208}
209 209
@@ -284,6 +284,8 @@ static int __init gpio_vbus_probe(struct platform_device *pdev)
284 } else 284 } else
285 irq = gpio_to_irq(gpio); 285 irq = gpio_to_irq(gpio);
286 286
287 gpio_vbus->irq = irq;
288
287 /* if data line pullup is in use, initialize it to "not pulling up" */ 289 /* if data line pullup is in use, initialize it to "not pulling up" */
288 gpio = pdata->gpio_pullup; 290 gpio = pdata->gpio_pullup;
289 if (gpio_is_valid(gpio)) { 291 if (gpio_is_valid(gpio)) {
@@ -350,7 +352,7 @@ static int __exit gpio_vbus_remove(struct platform_device *pdev)
350 352
351 usb_set_transceiver(NULL); 353 usb_set_transceiver(NULL);
352 354
353 free_irq(gpio_to_irq(gpio), pdev); 355 free_irq(gpio_vbus->irq, pdev);
354 if (gpio_is_valid(pdata->gpio_pullup)) 356 if (gpio_is_valid(pdata->gpio_pullup))
355 gpio_free(pdata->gpio_pullup); 357 gpio_free(pdata->gpio_pullup);
356 gpio_free(gpio); 358 gpio_free(gpio);