Commit 386aa05192eb2b0e8c2efb31b7dc958550217d40

Authored by Linus Torvalds

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

Showing 2 changed files Side-by-side Diff

drivers/gpio/gpio-lynxpoint.c
... ... @@ -248,14 +248,15 @@
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 */
drivers/gpio/gpiolib.c
... ... @@ -136,7 +136,7 @@
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,7 +1398,7 @@
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,6 +1406,8 @@
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;