diff options
author | Grygorii Strashko <grygorii.strashko@ti.com> | 2014-09-25 19:09:23 +0300 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2014-09-26 10:40:11 +0200 |
commit | e3893386b90500d7f26fec3170bf96f67d3e557e (patch) | |
tree | 9bac3eafceab98da205f601dedc405e5d7f5b1bf /drivers/gpio/gpiolib.c | |
parent | dcdc3018d6357c35eae7d80b323e10bd72253cb7 (diff) | |
download | op-kernel-dev-e3893386b90500d7f26fec3170bf96f67d3e557e.zip op-kernel-dev-e3893386b90500d7f26fec3170bf96f67d3e557e.tar.gz |
gpiolib: irqchip: use irq_find_mapping while removing irqchip
There is no guarantee that VIRQs will be allocated sequentially
for gpio irqchip in gpiochip_irqchip_add().
Therefore, it's unsafe to dispose VIRQ in gpiochip_irqchip_remove()
basing on index relatively to stored irq_base value.
Hence, use irq_find_mapping for VIRQ finding in gpiochip_irqchip_remove()
instead of irq_base + index.
Reported-by: Wang, Yalin <Yalin.Wang@sonymobile.com>
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/gpio/gpiolib.c')
-rw-r--r-- | drivers/gpio/gpiolib.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 6fdae78..550e575 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -514,7 +514,8 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip) /* Remove all IRQ mappings and delete the domain */ if (gpiochip->irqdomain) { for (offset = 0; offset < gpiochip->ngpio; offset++) - irq_dispose_mapping(gpiochip->irq_base + offset); + irq_dispose_mapping( + irq_find_mapping(gpiochip->irqdomain, offset)); irq_domain_remove(gpiochip->irqdomain); } |