Kevin Hilman <khilman@deeprootsystems.com> writes:
So just as a test, I just removed the 'disable' hook from my platforms
irq_chip and this allows me to wakeup without using my proposed patch,
although I'm not sure it is the right behavior either.
The 'struct irq_chip' comments are a bit misleading here as it says
* @disable: disable the interrupt (defaults to chip->mask if NULL)
And since my irq_chip->disable was doing basically the same thing as
my irq_chip->mask, I didn't expect it to change behavior. But in
kernel/irq/chip.c, disable gets set to an empty default_disable if the
irq_chip's version is NULL.
The result is that if irq_chip->disable == NULL, suspend_device_irqs() is a
big NOP, albiet one that does lots of locking. :)
So, should the irq_chip code be fixed to match the comment? Something
like the patch below? If I fix the IRQ chip code, then I'm back to
needing my patch since my irq_chip mask function still masks the IRQ
at the hardware.
Kevin
commit f9b534f23ac7835eead99fb0a9cec7c505fe1e85
Author: Kevin Hilman <khilman@deeprootsystems.com>
Date: Tue May 5 17:32:59 2009 -0700
IRQ: chip->disable should default to chip->mask if NULL
The struct irq_chip comments in <linux/irq.h> state:
* @disable: disable the interrupt (defaults to chip->mask if NULL)
However, the code in kernel/irq/chip.c does otherwise by setting
a NULL disable hook to an empty default_disable function.
This patch makes the default_disable function call the ->mask hook
to match the comments.
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index c687ba4..0fb690a 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -238,6 +238,10 @@ static void default_enable(unsigned int irq)
*/
static void default_disable(unsigned int irq)
{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ desc->chip->mask(irq);
+ desc->status |= IRQ_MASKED;
}
/*
--