• Mika Westerberg's avatar
    pinctrl: cherryview: Prevent possible interrupt storm on resume · d2cdf5dc
    Mika Westerberg authored
    When the system is suspended to S3 the BIOS might re-initialize certain
    GPIO pins back to their original state or it may re-program interrupt mask
    of others. For example Acer TravelMate B116-M had BIOS bug where certain
    GPIO pin (MF_ISH_GPIO_5) was programmed to trigger on high level, and the
    pin state was high once the BIOS gave control to the OS on resume.
    
    This triggers lots of messages like:
    
     irq 117, desc: ffff88017a61e600, depth: 1, count: 0, unhandled: 0
     ->handle_irq():  ffffffff8109b613, handle_bad_irq+0x0/0x1e0
     ->irq_data.chip(): ffffffffa0020180, chv_pinctrl_exit+0x2d84/0x12 [pinctrl_cherryview]
     ->action():           (null)
        IRQ_NOPROBE set
    
    We reset the mask back to known state in chv_pinctrl_resume() but that is
    called only after device interrupts have already been enabled.
    
    Now, this particular issue was fixed by upgrading the BIOS to the latest
    (v1.23) but not everybody upgrades their BIOSes so we fix it up in the
    driver as well.
    
    Prevent the possible interrupt storm by moving suspend and resume hooks to
    be called at _noirq time instead. Since device interrupts are still
    disabled we can restore the mask back to known state before interrupt storm
    happens.
    
    Cc: stable@vger.kernel.org
    Reported-by: default avatarChristian Steiner <christian.steiner@outlook.de>
    Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    d2cdf5dc
pinctrl-cherryview.c 48.7 KB