| From 95fdeab19d3782f1316e54786b596bf45eb06973 Mon Sep 17 00:00:00 2001 |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Date: Tue, 5 Nov 2019 20:06:54 +0200 |
| Subject: [PATCH] gpiolib: No need to call gpiochip_remove_pin_ranges() twice |
| |
| commit 2f4133bb5f14f49a99acf0cc55b84996dbfb4dff upstream. |
| |
| of_gpiochip_add(), when fails, calls gpiochip_remove_pin_ranges(). |
| |
| ADD: |
| gpiochip_add_data_with_key() -> |
| of_gpiochip_add() -> (ERROR path) |
| gpiochip_remove_pin_ranges() |
| |
| At the same time of_gpiochip_remove() calls exactly the above mentioned |
| function unconditionally and so does gpiochip_remove(). |
| |
| REMOVE: |
| gpiochip_remove() -> |
| gpiochip_remove_pin_ranges() |
| of_gpiochip_remove() -> |
| gpiochip_remove_pin_ranges() |
| |
| Since gpiochip_remove() calls gpiochip_remove_pin_ranges() unconditionally, |
| we have duplicate call to the same function when it's not necessary. |
| |
| Move gpiochip_remove_pin_ranges() from of_gpiochip_add() to gpiochip_add() |
| to avoid duplicate calls and be consistent with the explicit call in |
| gpiochip_remove(). |
| |
| Fixes: e93fa3f24353 ("gpiolib: remove duplicate pin range code") |
| Depends-on: f7299d441a4d ("gpio: of: Fix of_gpiochip_add() error path") |
| Cc: Geert Uytterhoeven <geert+renesas@glider.be> |
| Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Signed-off-by: Linus Walleij <linus.walleij@linaro.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c |
| index c9325efc1783..45bfa17403f2 100644 |
| --- a/drivers/gpio/gpiolib-of.c |
| +++ b/drivers/gpio/gpiolib-of.c |
| @@ -718,16 +718,13 @@ int of_gpiochip_add(struct gpio_chip *chip) |
| of_node_get(chip->of_node); |
| |
| status = of_gpiochip_scan_gpios(chip); |
| - if (status) { |
| + if (status) |
| of_node_put(chip->of_node); |
| - gpiochip_remove_pin_ranges(chip); |
| - } |
| |
| return status; |
| } |
| |
| void of_gpiochip_remove(struct gpio_chip *chip) |
| { |
| - gpiochip_remove_pin_ranges(chip); |
| of_node_put(chip->of_node); |
| } |
| diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c |
| index c3e9d069384a..e64059f10542 100644 |
| --- a/drivers/gpio/gpiolib.c |
| +++ b/drivers/gpio/gpiolib.c |
| @@ -1452,6 +1452,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data, |
| gpiochip_free_hogs(chip); |
| of_gpiochip_remove(chip); |
| err_free_gpiochip_mask: |
| + gpiochip_remove_pin_ranges(chip); |
| gpiochip_free_valid_mask(chip); |
| err_remove_from_list: |
| spin_lock_irqsave(&gpio_lock, flags); |
| @@ -1507,8 +1508,8 @@ void gpiochip_remove(struct gpio_chip *chip) |
| gdev->chip = NULL; |
| gpiochip_irqchip_remove(chip); |
| acpi_gpiochip_remove(chip); |
| - gpiochip_remove_pin_ranges(chip); |
| of_gpiochip_remove(chip); |
| + gpiochip_remove_pin_ranges(chip); |
| gpiochip_free_valid_mask(chip); |
| /* |
| * We accept no more calls into the driver from this point, so |
| -- |
| 2.7.4 |
| |