Message ID | 20250512095441.31645-1-francesco@dolcini.it |
---|---|
State | New |
Headers | show |
Series | [v3] gpio: pca953x: fix IRQ storm on system wake up | expand |
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> On Mon, 12 May 2025 11:54:41 +0200, Francesco Dolcini wrote: > If an input changes state during wake-up and is used as an interrupt > source, the IRQ handler reads the volatile input register to clear the > interrupt mask and deassert the IRQ line. However, the IRQ handler is > triggered before access to the register is granted, causing the read > operation to fail. > > As a result, the IRQ handler enters a loop, repeatedly printing the > "failed reading register" message, until `pca953x_resume()` is eventually > called, which restores the driver context and enables access to > registers. > > [...] Applied, thanks! [1/1] gpio: pca953x: fix IRQ storm on system wake up https://git.kernel.org/brgl/linux/c/3e38f946062b4845961ab86b726651b4457b2af8 Best regards,
diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c index ab2c0fd428fb..b852e4997629 100644 --- a/drivers/gpio/gpio-pca953x.c +++ b/drivers/gpio/gpio-pca953x.c @@ -1226,6 +1226,8 @@ static int pca953x_restore_context(struct pca953x_chip *chip) guard(mutex)(&chip->i2c_lock); + if (chip->client->irq > 0) + enable_irq(chip->client->irq); regcache_cache_only(chip->regmap, false); regcache_mark_dirty(chip->regmap); ret = pca953x_regcache_sync(chip); @@ -1238,6 +1240,10 @@ static int pca953x_restore_context(struct pca953x_chip *chip) static void pca953x_save_context(struct pca953x_chip *chip) { guard(mutex)(&chip->i2c_lock); + + /* Disable IRQ to prevent early triggering while regmap "cache only" is on */ + if (chip->client->irq > 0) + disable_irq(chip->client->irq); regcache_cache_only(chip->regmap, true); }