diff options
Diffstat (limited to 'drivers/gpio/gpiolib.c')
-rw-r--r-- | drivers/gpio/gpiolib.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 24f60d28f0c0..570771ed19e6 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -449,7 +449,6 @@ static void gpiodevice_release(struct device *dev) | |||
449 | { | 449 | { |
450 | struct gpio_device *gdev = dev_get_drvdata(dev); | 450 | struct gpio_device *gdev = dev_get_drvdata(dev); |
451 | 451 | ||
452 | cdev_del(&gdev->chrdev); | ||
453 | list_del(&gdev->list); | 452 | list_del(&gdev->list); |
454 | ida_simple_remove(&gpio_ida, gdev->id); | 453 | ida_simple_remove(&gpio_ida, gdev->id); |
455 | kfree(gdev->label); | 454 | kfree(gdev->label); |
@@ -482,7 +481,6 @@ static int gpiochip_setup_dev(struct gpio_device *gdev) | |||
482 | 481 | ||
483 | /* From this point, the .release() function cleans up gpio_device */ | 482 | /* From this point, the .release() function cleans up gpio_device */ |
484 | gdev->dev.release = gpiodevice_release; | 483 | gdev->dev.release = gpiodevice_release; |
485 | get_device(&gdev->dev); | ||
486 | pr_debug("%s: registered GPIOs %d to %d on device: %s (%s)\n", | 484 | pr_debug("%s: registered GPIOs %d to %d on device: %s (%s)\n", |
487 | __func__, gdev->base, gdev->base + gdev->ngpio - 1, | 485 | __func__, gdev->base, gdev->base + gdev->ngpio - 1, |
488 | dev_name(&gdev->dev), gdev->chip->label ? : "generic"); | 486 | dev_name(&gdev->dev), gdev->chip->label ? : "generic"); |
@@ -770,6 +768,8 @@ void gpiochip_remove(struct gpio_chip *chip) | |||
770 | * be removed, else it will be dangling until the last user is | 768 | * be removed, else it will be dangling until the last user is |
771 | * gone. | 769 | * gone. |
772 | */ | 770 | */ |
771 | cdev_del(&gdev->chrdev); | ||
772 | device_del(&gdev->dev); | ||
773 | put_device(&gdev->dev); | 773 | put_device(&gdev->dev); |
774 | } | 774 | } |
775 | EXPORT_SYMBOL_GPL(gpiochip_remove); | 775 | EXPORT_SYMBOL_GPL(gpiochip_remove); |
@@ -869,7 +869,7 @@ struct gpio_chip *gpiochip_find(void *data, | |||
869 | 869 | ||
870 | spin_lock_irqsave(&gpio_lock, flags); | 870 | spin_lock_irqsave(&gpio_lock, flags); |
871 | list_for_each_entry(gdev, &gpio_devices, list) | 871 | list_for_each_entry(gdev, &gpio_devices, list) |
872 | if (match(gdev->chip, data)) | 872 | if (gdev->chip && match(gdev->chip, data)) |
873 | break; | 873 | break; |
874 | 874 | ||
875 | /* No match? */ | 875 | /* No match? */ |
@@ -1373,8 +1373,12 @@ done: | |||
1373 | #define VALIDATE_DESC(desc) do { \ | 1373 | #define VALIDATE_DESC(desc) do { \ |
1374 | if (!desc) \ | 1374 | if (!desc) \ |
1375 | return 0; \ | 1375 | return 0; \ |
1376 | if (IS_ERR(desc)) { \ | ||
1377 | pr_warn("%s: invalid GPIO (errorpointer)\n", __func__); \ | ||
1378 | return PTR_ERR(desc); \ | ||
1379 | } \ | ||
1376 | if (!desc->gdev) { \ | 1380 | if (!desc->gdev) { \ |
1377 | pr_warn("%s: invalid GPIO\n", __func__); \ | 1381 | pr_warn("%s: invalid GPIO (no device)\n", __func__); \ |
1378 | return -EINVAL; \ | 1382 | return -EINVAL; \ |
1379 | } \ | 1383 | } \ |
1380 | if ( !desc->gdev->chip ) { \ | 1384 | if ( !desc->gdev->chip ) { \ |
@@ -1386,8 +1390,12 @@ done: | |||
1386 | #define VALIDATE_DESC_VOID(desc) do { \ | 1390 | #define VALIDATE_DESC_VOID(desc) do { \ |
1387 | if (!desc) \ | 1391 | if (!desc) \ |
1388 | return; \ | 1392 | return; \ |
1393 | if (IS_ERR(desc)) { \ | ||
1394 | pr_warn("%s: invalid GPIO (errorpointer)\n", __func__); \ | ||
1395 | return; \ | ||
1396 | } \ | ||
1389 | if (!desc->gdev) { \ | 1397 | if (!desc->gdev) { \ |
1390 | pr_warn("%s: invalid GPIO\n", __func__); \ | 1398 | pr_warn("%s: invalid GPIO (no device)\n", __func__); \ |
1391 | return; \ | 1399 | return; \ |
1392 | } \ | 1400 | } \ |
1393 | if (!desc->gdev->chip) { \ | 1401 | if (!desc->gdev->chip) { \ |
@@ -2056,7 +2064,14 @@ int gpiod_to_irq(const struct gpio_desc *desc) | |||
2056 | struct gpio_chip *chip; | 2064 | struct gpio_chip *chip; |
2057 | int offset; | 2065 | int offset; |
2058 | 2066 | ||
2059 | VALIDATE_DESC(desc); | 2067 | /* |
2068 | * Cannot VALIDATE_DESC() here as gpiod_to_irq() consumer semantics | ||
2069 | * requires this function to not return zero on an invalid descriptor | ||
2070 | * but rather a negative error number. | ||
2071 | */ | ||
2072 | if (!desc || IS_ERR(desc) || !desc->gdev || !desc->gdev->chip) | ||
2073 | return -EINVAL; | ||
2074 | |||
2060 | chip = desc->gdev->chip; | 2075 | chip = desc->gdev->chip; |
2061 | offset = gpio_chip_hwgpio(desc); | 2076 | offset = gpio_chip_hwgpio(desc); |
2062 | if (chip->to_irq) { | 2077 | if (chip->to_irq) { |