Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 104959
b: refs/heads/master
c: 2db8732
h: refs/heads/master
i:
  104957: 744ba53
  104955: cee4c17
  104951: 2fe5900
  104943: 53d6c24
  104927: abbb870
  104895: 2ea4198
  104831: 02c34dc
  104703: 070bae3
  104447: 36ecbd6
v: v3
  • Loading branch information
Uwe Kleine-König authored and Linus Torvalds committed Jul 23, 2008
1 parent d119cba commit d71e945
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1bad879a078111748ebc27fb0d29e8c916556835
refs/heads/master: 2db873211ba47ef704c301f9ecf4a33413a0b649
39 changes: 27 additions & 12 deletions trunk/kernel/irq/manage.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
}
Expand Down

0 comments on commit d71e945

Please sign in to comment.