• Sander Vanheule's avatar
    gpio: realtek-otto: switch to 32-bit I/O · ee0175b3
    Sander Vanheule authored
    By using 16-bit I/O on the GPIO peripheral, which is apparently not safe
    on MIPS, the IMR can end up containing garbage. This then results in
    interrupt triggers for lines that don't have an interrupt handler
    associated. The irq_desc lookup fails, and the ISR will not be cleared,
    keeping the CPU busy until reboot, or until another IMR operation
    restores the correct value. This situation appears to happen very
    rarely, for < 0.5% of IMR writes.
    
    Instead of using 8-bit or 16-bit I/O operations on the 32-bit memory
    mapped peripheral registers, switch to using 32-bit I/O only, operating
    on the entire bank for all single bit line settings. For 2-bit line
    settings, with 16-bit port values, stick to manual (un)packing.
    
    This issue has been seen on RTL8382M (HPE 1920-16G), RTL8391M (Netgear
    GS728TP v2), and RTL8393M (D-Link DGS-1210-52 F3, Zyxel GS1900-48).
    
    Reported-by: Luiz Angelo Daros de Luca <luizluca@gmail.com> # DGS-1210-52
    Reported-by: Birger Koblitz <mail@birger-koblitz.de> # GS728TP
    Reported-by: Jan Hoffmann <jan@3e8.eu> # 1920-16G
    Fixes: 0d82fb11 ("gpio: Add Realtek Otto GPIO support")
    Signed-off-by: default avatarSander Vanheule <sander@svanheule.net>
    Cc: Paul Cercueil <paul@crapouillou.net>
    Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: default avatarBartosz Golaszewski <brgl@bgdev.pl>
    ee0175b3
gpio-realtek-otto.c 13 KB