Linux GPIO subsystem development
 help / color / mirror / Atom feed
* [PATCH] Record interrupt status when an IRQ is masked
@ 2019-07-20 11:31 Tomasz Kazimierz Motyl
  2019-07-20 19:42 ` Linus Walleij
  0 siblings, 1 reply; 3+ messages in thread
From: Tomasz Kazimierz Motyl @ 2019-07-20 11:31 UTC (permalink / raw)
  To: linus.walleij, bgolaszewski, linux-gpio
  Cc: butterfly_tm666, Tomasz Kazimierz Motyl

 When one changes the state of any input pins of a PCA9555 chip before
 setting up the IRQ mask through i.e. SysFS e.g. echo "both" >
 /sys/class/gpio/gpioXYZ/edge the epoll_wait shall not exit on the subsequent
 change of the GPIO state. The reason behind it is that the IRQ status is not
 being saved when the IRQ is masked.

---
 drivers/gpio/gpio-pca953x.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
index 7e76830b3368..088bef902156 100644
--- a/drivers/gpio/gpio-pca953x.c
+++ b/drivers/gpio/gpio-pca953x.c
@@ -716,13 +716,16 @@ static bool pca953x_irq_pending(struct pca953x_chip *chip, u8 *pending)
 		trigger[i] = (cur_stat[i] ^ old_stat[i]) & chip->irq_mask[i];
 		if (trigger[i])
 			trigger_seen = true;
+
+    /* We want the current status recorded in the chip->irq stat regardless the
+     * chip->irq_mask setting in order to have a change detected when the interrupt
+     * mask gets changed i.e. echo "both" > /sys/class/gpioXYZ/edge */
+    chip->irq_stat[i] = cur_stat[i];
 	}
 
 	if (!trigger_seen)
 		return false;
 
-	memcpy(chip->irq_stat, cur_stat, NBANK(chip));
-
 	for (i = 0; i < NBANK(chip); i++) {
 		pending[i] = (old_stat[i] & chip->irq_trig_fall[i]) |
 			(cur_stat[i] & chip->irq_trig_raise[i]);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-10-18  9:18 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-07-20 11:31 [PATCH] Record interrupt status when an IRQ is masked Tomasz Kazimierz Motyl
2019-07-20 19:42 ` Linus Walleij
2019-10-18  9:18   ` Andy Shevchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox