diff options
| author | Rosen Penev <rosenp@gmail.com> | 2026-09-14 17:44:06 -0700 |
|---|---|---|
| committer | Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> | 2026-09-17 11:52:21 +0200 |
| commit | 02af7eac17bc62a72335c1fc8c4af4471654f6cc (patch) | |
| tree | dc386f45fcd6884506f362730e66d0aacdd69541 /tools/perf/scripts/python | |
| parent | e9d810279f84b30738f7790c0ed15f8dd5b9024a (diff) | |
| download | linux-next-02af7eac17bc62a72335c1fc8c4af4471654f6cc.tar.gz linux-next-02af7eac17bc62a72335c1fc8c4af4471654f6cc.zip | |
gpio: mvebu: keep resume masks within the irqchip cache
mvebu_gpio_resume() writes the edge/level mask registers saved at
suspend time straight back to hardware, bypassing the irqchip's
mask_cache_priv. genirq skips mask_irq() for a line it already
considers masked, so restoring a bit in hardware that genirq thinks
is still masked leaves that line unmasked behind genirq's back. An
asserted level line then has nobody to ack it, and the moment
interrupts are re-enabled the chained handler storms, hanging resume.
AND the restored mask values with the matching irqchip mask cache so
only lines genirq currently considers unmasked are unmasked again.
Read the caches under gc->lock to keep them consistent with the
mask/unmask handlers.
Tested on Helios4 (armhf): 5 suspend cycles woken by magic packet,
no hang; mvebu_gpio_resume() returns in 6 usecs.
Assisted-by: LLM
Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://patch.msgid.link/20260915004406.115230-1-rosenp@gmail.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Diffstat (limited to 'tools/perf/scripts/python')
0 files changed, 0 insertions, 0 deletions
