From: neilb@suse.de (NeilBrown)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/3] IRQ: allow check_wakeup_irqs to notice level-triggered interrupts.
Date: Fri, 4 May 2012 15:12:21 +1000 [thread overview]
Message-ID: <20120504151221.6998d4e5@notabene.brown> (raw)
In-Reply-To: <alpine.LFD.2.02.1204251402360.2542@ionos>
On Wed, 25 Apr 2012 14:54:54 +0200 (CEST) Thomas Gleixner
<tglx@linutronix.de> wrote:
> Why not simply managing the pending bit for level irqs ?
>
Hi Thomas,
thanks again for the patch. I finally made time to test it and it works as
expected. I've included it below with a change-log entry and tested-by:
in case that helps.
Thanks,
NeilBrown
From: Thomas Gleixner <tglx@linutronix.de>
Date: Wed, 25 Apr 2012 12:54:54 +0200
Subject: [PATCH] IRQ: allow check_wakeup_irqs to notice level-triggered interrupts.
Level triggered interrupts do not cause IRQS_PENDING to be set when
they fire-while-disabled as the 'pending' state is always present in
the level - they automatically refire where re-enabled.
However the IRQS_PENDING flag is also used to abort a suspend cycle -
if any 'is_wakeup_set' interrupt is PENDING, check_wakeup_irqs() will
cause suspend to abort. Without IRQS_PENDING, suspend won't abort.
Consequently, level-triggered interrupts that fire during the 'noirq'
phase of suspend do not currently abort suspend.
So set IRQS_PENDING even for level triggered interrupts, and make sure
to clear the flag in check_irq_resend.
Also: in check_wakeup_irqs, ignore 'is_wakeup' interrupts that were
already disabled before suspend_device_irqs() disabled them further.
Tested-by: NeilBrown <neilb@suse.de>
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 6080f6b..741f836 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -379,8 +379,10 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc)
* If its disabled or no action available
* keep it masked and get out of here
*/
- if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data)))
+ if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) {
+ desc->istate |= IRQS_PENDING;
goto out_unlock;
+ }
handle_irq_event(desc);
diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c
index 15e53b1..b858ce3 100644
--- a/kernel/irq/pm.c
+++ b/kernel/irq/pm.c
@@ -103,7 +103,8 @@ int check_wakeup_irqs(void)
int irq;
for_each_irq_desc(irq, desc) {
- if (irqd_is_wakeup_set(&desc->irq_data)) {
+ if (desc->depth == 1 &&
+ irqd_is_wakeup_set(&desc->irq_data)) {
if (desc->istate & IRQS_PENDING)
return -EBUSY;
continue;
diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c
index 14dd576..6454db7 100644
--- a/kernel/irq/resend.c
+++ b/kernel/irq/resend.c
@@ -58,10 +58,13 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq)
/*
* We do not resend level type interrupts. Level type
* interrupts are resent by hardware when they are still
- * active.
+ * active. Clear the pending bit so suspend/resume does not
+ * get confused.
*/
- if (irq_settings_is_level(desc))
+ if (irq_settings_is_level(desc)) {
+ desc->istate &= ~IRQS_PENDING;
return;
+ }
if (desc->istate & IRQS_REPLAY)
return;
if (desc->istate & IRQS_PENDING) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 828 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120504/f8e80438/attachment.sig>
next prev parent reply other threads:[~2012-05-04 5:12 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-25 3:05 [PATCH 0/3] Ensure twl4030 interrupts are lost during suspend NeilBrown
2012-04-25 3:05 ` [PATCH 2/3] IRQ: allow check_wakeup_irqs to notice level-triggered interrupts NeilBrown
2012-04-25 8:50 ` Thomas Gleixner
2012-04-25 9:39 ` NeilBrown
2012-04-25 12:54 ` Thomas Gleixner
2012-04-25 21:04 ` NeilBrown
2012-05-04 5:12 ` NeilBrown [this message]
2012-05-04 16:01 ` Thomas Gleixner
2012-05-08 20:52 ` NeilBrown
2012-04-25 3:05 ` [PATCH 1/3] ARM: omap2+: set IRQCHIP_SKIP_SET_WAKE for INTC interrupts NeilBrown
2012-04-26 20:08 ` Kevin Hilman
2012-04-26 20:25 ` Tony Lindgren
2012-04-26 20:39 ` Kevin Hilman
2012-04-26 20:50 ` NeilBrown
2012-04-27 22:01 ` Kevin Hilman
2012-04-27 6:20 ` Shilimkar, Santosh
2012-04-25 3:05 ` [PATCH 3/3] twl4030: enable wakeup on twl4030 IRQ NeilBrown
2012-04-26 20:39 ` Kevin Hilman
2012-05-09 16:03 ` Samuel Ortiz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120504151221.6998d4e5@notabene.brown \
--to=neilb@suse.de \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).