• Asmaa Mnebhi's avatar
    gpio: mlxbf3: Support shutdown() function · aad41832
    Asmaa Mnebhi authored
    During Linux graceful reboot, the GPIO interrupts are not disabled.
    Since the drivers are not removed during graceful reboot,
    the logic to call mlxbf3_gpio_irq_disable() is not triggered.
    Interrupts that remain enabled can cause issues on subsequent boots.
    
    For example, the mlxbf-gige driver contains PHY logic to bring up the link.
    If the gpio-mlxbf3 driver loads first, the mlxbf-gige driver
    will use a GPIO interrupt to bring up the link.
    Otherwise, it will use polling.
    The next time Linux boots and loads the drivers in this order, we encounter the issue:
    - mlxbf-gige loads first and uses polling while the GPIO10
      interrupt is still enabled from the previous boot. So if
      the interrupt triggers, there is nothing to clear it.
    - gpio-mlxbf3 loads.
    - i2c-mlxbf loads. The interrupt doesn't trigger for I2C
      because it is shared with the GPIO interrupt line which
      was not cleared.
    
    The solution is to add a shutdown function to the GPIO driver to clear and disable
    all interrupts. Also clear the interrupt after disabling it in mlxbf3_gpio_irq_disable().
    
    Fixes: 38a700ef ("gpio: mlxbf3: Add gpio driver support")
    Signed-off-by: default avatarAsmaa Mnebhi <asmaa@nvidia.com>
    Reviewed-by: default avatarDavid Thompson <davthompson@nvidia.com>
    Reviewed-by: default avatarAndy Shevchenko <andy@kernel.org>
    Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Link: https://lore.kernel.org/r/20240611171509.22151-1-asmaa@nvidia.comSigned-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
    aad41832
gpio-mlxbf3.c 7.97 KB