From d71e945b902091bfa6158a8ea3a843401e9733b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Wed, 23 Jul 2008 14:42:25 +0200 Subject: [PATCH] --- yaml --- r: 104959 b: refs/heads/master c: 2db873211ba47ef704c301f9ecf4a33413a0b649 h: refs/heads/master i: 104957: 744ba53a1efc5cc1d62e927d1e06780fd566ff32 104955: cee4c17669f904702d31e74e6c36ae041ae8f174 104951: 2fe5900d04a61b18eaa2e96e326360e72a4fdb41 104943: 53d6c240664963ea4e1fc35e02933ac3499a3c27 104927: abbb87048b763fd3d2181ee19a1879cf05807a40 104895: 2ea41985f9ac99ac7f8fc205ee14ccb240cabc6a 104831: 02c34dc488a4aac3759e16d111524cc2e4755f87 104703: 070bae30fe9fc5f6cac20cf506e2ad280078629a 104447: 36ecbd682292842230ecb63974d9cd4cffc150ab v: v3 --- [refs] | 2 +- trunk/kernel/irq/manage.c | 39 +++++++++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index e4ebd61f4b33..6ffe1057d0e1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1bad879a078111748ebc27fb0d29e8c916556835 +refs/heads/master: 2db873211ba47ef704c301f9ecf4a33413a0b649 diff --git a/trunk/kernel/irq/manage.c b/trunk/kernel/irq/manage.c index 77a51be36010..3cfc0fefb5ee 100644 --- a/trunk/kernel/irq/manage.c +++ b/trunk/kernel/irq/manage.c @@ -217,6 +217,17 @@ void enable_irq(unsigned int irq) } EXPORT_SYMBOL(enable_irq); +int set_irq_wake_real(unsigned int irq, unsigned int on) +{ + struct irq_desc *desc = irq_desc + irq; + int ret = -ENXIO; + + if (desc->chip->set_wake) + ret = desc->chip->set_wake(irq, on); + + return ret; +} + /** * set_irq_wake - control irq power management wakeup * @irq: interrupt to control @@ -233,30 +244,34 @@ int set_irq_wake(unsigned int irq, unsigned int on) { struct irq_desc *desc = irq_desc + irq; unsigned long flags; - int ret = -ENXIO; - int (*set_wake)(unsigned, unsigned) = desc->chip->set_wake; + int ret = 0; /* wakeup-capable irqs can be shared between drivers that * don't need to have the same sleep mode behaviors. */ spin_lock_irqsave(&desc->lock, flags); if (on) { - if (desc->wake_depth++ == 0) - desc->status |= IRQ_WAKEUP; - else - set_wake = NULL; + if (desc->wake_depth++ == 0) { + ret = set_irq_wake_real(irq, on); + if (ret) + desc->wake_depth = 0; + else + desc->status |= IRQ_WAKEUP; + } } else { if (desc->wake_depth == 0) { printk(KERN_WARNING "Unbalanced IRQ %d " "wake disable\n", irq); WARN_ON(1); - } else if (--desc->wake_depth == 0) - desc->status &= ~IRQ_WAKEUP; - else - set_wake = NULL; + } else if (--desc->wake_depth == 0) { + ret = set_irq_wake_real(irq, on); + if (ret) + desc->wake_depth = 1; + else + desc->status &= ~IRQ_WAKEUP; + } } - if (set_wake) - ret = desc->chip->set_wake(irq, on); + spin_unlock_irqrestore(&desc->lock, flags); return ret; }