diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-05-25 15:10:59 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-05-25 15:10:59 -0700 |
commit | e7db38a2ef9344d5f0b3df4c4808d638f81cfbd6 (patch) | |
tree | c863583ccf2e24bf275614fb878356d3161f42c3 | |
parent | ba155e2d21f6bf05de86a78dbe5bfd8757604a65 (diff) | |
parent | f230e8ffc03f17bd9d6b90ea890b8252a8cc1821 (diff) | |
download | op-kernel-dev-e7db38a2ef9344d5f0b3df4c4808d638f81cfbd6.zip op-kernel-dev-e7db38a2ef9344d5f0b3df4c4808d638f81cfbd6.tar.gz |
Merge tag 'gpio-v4.1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio
Pull GPIO fixes from Linus Walleij:
"Here are two GPIO fixes targeted for stable:
- a leak in gpiochip_add path destined for stable
- a kempld driver bug destined for stable"
* tag 'gpio-v4.1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio:
gpio: gpio-kempld: Fix get_direction return value
gpio: fix gpio leak in gpiochip_add error path
-rw-r--r-- | drivers/gpio/gpio-kempld.c | 2 | ||||
-rw-r--r-- | drivers/gpio/gpiolib.c | 10 |
2 files changed, 7 insertions, 5 deletions
diff --git a/drivers/gpio/gpio-kempld.c b/drivers/gpio/gpio-kempld.c index 6b8115f..83f281d 100644 --- a/drivers/gpio/gpio-kempld.c +++ b/drivers/gpio/gpio-kempld.c @@ -117,7 +117,7 @@ static int kempld_gpio_get_direction(struct gpio_chip *chip, unsigned offset) = container_of(chip, struct kempld_gpio_data, chip); struct kempld_device_data *pld = gpio->pld; - return kempld_gpio_get_bit(pld, KEMPLD_GPIO_DIR_NUM(offset), offset); + return !kempld_gpio_get_bit(pld, KEMPLD_GPIO_DIR_NUM(offset), offset); } static int kempld_gpio_pincount(struct kempld_device_data *pld) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 59eaa23..6bc612b 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -53,6 +53,11 @@ static DEFINE_MUTEX(gpio_lookup_lock); static LIST_HEAD(gpio_lookup_list); LIST_HEAD(gpio_chips); + +static void gpiochip_free_hogs(struct gpio_chip *chip); +static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip); + + static inline void desc_set_label(struct gpio_desc *d, const char *label) { d->label = label; @@ -297,6 +302,7 @@ int gpiochip_add(struct gpio_chip *chip) err_remove_chip: acpi_gpiochip_remove(chip); + gpiochip_free_hogs(chip); of_gpiochip_remove(chip); spin_lock_irqsave(&gpio_lock, flags); list_del(&chip->list); @@ -313,10 +319,6 @@ err_free_descs: } EXPORT_SYMBOL_GPL(gpiochip_add); -/* Forward-declaration */ -static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip); -static void gpiochip_free_hogs(struct gpio_chip *chip); - /** * gpiochip_remove() - unregister a gpio_chip * @chip: the chip to unregister |