Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'gpio-v3.12-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio

Pull gpio fixes from Linus Walleij:
"Three GPIO fixes for the v3.12 series:
- A fix to the Lynxpoint IRQ handler
- Two late fixes to fallout from the gpiod refactoring"

* tag 'gpio-v3.12-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio:
gpiolib: let gpiod_request() return -EPROBE_DEFER
gpiolib: safer implementation of desc_to_gpio()
gpio/lynxpoint: check if the interrupt is enabled in IRQ handler

+7 -4
+3 -2
drivers/gpio/gpio-lynxpoint.c
··· 248 248 struct lp_gpio *lg = irq_data_get_irq_handler_data(data); 249 249 struct irq_chip *chip = irq_data_get_irq_chip(data); 250 250 u32 base, pin, mask; 251 - unsigned long reg, pending; 251 + unsigned long reg, ena, pending; 252 252 unsigned virq; 253 253 254 254 /* check from GPIO controller which pin triggered the interrupt */ 255 255 for (base = 0; base < lg->chip.ngpio; base += 32) { 256 256 reg = lp_gpio_reg(&lg->chip, base, LP_INT_STAT); 257 + ena = lp_gpio_reg(&lg->chip, base, LP_INT_ENABLE); 257 258 258 - while ((pending = inl(reg))) { 259 + while ((pending = (inl(reg) & inl(ena)))) { 259 260 pin = __ffs(pending); 260 261 mask = BIT(pin); 261 262 /* Clear before handling so we don't lose an edge */
+4 -2
drivers/gpio/gpiolib.c
··· 136 136 */ 137 137 static int desc_to_gpio(const struct gpio_desc *desc) 138 138 { 139 - return desc->chip->base + gpio_chip_hwgpio(desc); 139 + return desc - &gpio_desc[0]; 140 140 } 141 141 142 142 ··· 1398 1398 int status = -EPROBE_DEFER; 1399 1399 unsigned long flags; 1400 1400 1401 - if (!desc || !desc->chip) { 1401 + if (!desc) { 1402 1402 pr_warn("%s: invalid GPIO\n", __func__); 1403 1403 return -EINVAL; 1404 1404 } ··· 1406 1406 spin_lock_irqsave(&gpio_lock, flags); 1407 1407 1408 1408 chip = desc->chip; 1409 + if (chip == NULL) 1410 + goto done; 1409 1411 1410 1412 if (!try_module_get(chip->owner)) 1411 1413 goto done;