BACKPORT: gpio: Fix potential NULL handler data in chained irqchip handler

There is possibility with misconfigured pins that interrupt occurs instantly
after setting irq_set_chained_handler() in gpiochip_set_chained_irqchip().
Now if handler gets called before irq_set_handler_data() the handler gets
NULL handler data.

Fix this by moving irq_set_handler_data() call before
irq_set_chained_handler() in gpiochip_set_chained_irqchip().

Cc: Stable <stable@vger.kernel.org> # 3.15+
Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
(cherry picked from commit 324b039878)
[abrestic: resolved merge conflict as was done upstream]
Signed-off-by: Andrew Bresticker <abrestic@chromium.org>

BUG=chrome-os-partner:30840
TEST=builds

Change-Id: I9adcff381bf164082776aa7aed81f34f24dc4e38
Reviewed-on: https://chromium-review.googlesource.com/238917
Reviewed-by: Olof Johansson <olofj@chromium.org>
Commit-Queue: Andrew Bresticker <abrestic@chromium.org>
Tested-by: Andrew Bresticker <abrestic@chromium.org>
This commit is contained in:
Jarkko Nikula
2014-09-16 16:23:15 +03:00
committed by ChromeOS Commit Bot
parent fe3a652adf
commit 7664e843e3

View File

@@ -1379,12 +1379,12 @@ void gpiochip_set_chained_irqchip(struct gpio_chip *gpiochip,
"chip that may sleep\n");
return;
}
irq_set_chained_handler(parent_irq, parent_handler);
/*
* The parent irqchip is already using the chip_data for this
* irqchip, so our callbacks simply use the handler_data.
*/
irq_set_handler_data(parent_irq, gpiochip);
irq_set_chained_handler(parent_irq, parent_handler);
}
/* Set the parent IRQ for all affected IRQs */