• Linus Walleij's avatar
    gpiolib: Fix irq_disable() semantics · 8959b304
    Linus Walleij authored
    The implementation if .irq_disable() which kicks in between
    the gpiolib and the driver is not properly mimicking the
    expected semantics of the irqchip core: the irqchip will
    call .irq_disable() if that exists, else it will call
    mask_irq() which first checks if .irq_mask() is defined
    before calling it.
    
    Since we are calling it unconditionally, we get this bug
    from drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c, as it only
    defines .irq_mask_ack and not .irq_mask:
    
      Unable to handle kernel NULL pointer dereference at virtual address 00000000
      pgd = (ptrval)
      (...)
      PC is at 0x0
      LR is at gpiochip_irq_disable+0x20/0x30
    
    Fix this by only calling .irq_mask() if it exists.
    
    Cc: Brian Masney <masneyb@onstation.org>
    Cc: Hans Verkuil <hans.verkuil@cisco.com>
    Cc: stable@vger.kernel.org
    Reviewed-by: default avatarBartosz Golaszewski <bgolaszewski@baylibre.com>
    Fixes: 461c1a7d ("gpiolib: override irq_enable/disable")
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Link: https://lore.kernel.org/r/20200306132326.1329640-1-linus.walleij@linaro.org
    8959b304
gpiolib.c 141 KB