mirror of
https://github.com/torvalds/linux.git
synced 2025-08-15 22:21:42 +02:00
genirq/manage: Rework irq_set_irq_wake()
Use the new guards to get and lock the interrupt descriptor and tidy up the code. No functional change. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/all/87ldrhq0hc.ffs@tglx
This commit is contained in:
parent
bddd10c554
commit
8589e325ba
1 changed files with 30 additions and 35 deletions
|
@ -846,45 +846,40 @@ static int set_irq_wake_real(unsigned int irq, unsigned int on)
|
|||
*/
|
||||
int irq_set_irq_wake(unsigned int irq, unsigned int on)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct irq_desc *desc = irq_get_desc_buslock(irq, &flags, IRQ_GET_DESC_CHECK_GLOBAL);
|
||||
int ret = 0;
|
||||
scoped_irqdesc_get_and_lock(irq, IRQ_GET_DESC_CHECK_GLOBAL) {
|
||||
struct irq_desc *desc = scoped_irqdesc;
|
||||
int ret = 0;
|
||||
|
||||
if (!desc)
|
||||
return -EINVAL;
|
||||
/* Don't use NMIs as wake up interrupts please */
|
||||
if (irq_is_nmi(desc))
|
||||
return -EINVAL;
|
||||
|
||||
/* Don't use NMIs as wake up interrupts please */
|
||||
if (irq_is_nmi(desc)) {
|
||||
ret = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/* wakeup-capable irqs can be shared between drivers that
|
||||
* don't need to have the same sleep mode behaviors.
|
||||
*/
|
||||
if (on) {
|
||||
if (desc->wake_depth++ == 0) {
|
||||
ret = set_irq_wake_real(irq, on);
|
||||
if (ret)
|
||||
desc->wake_depth = 0;
|
||||
else
|
||||
irqd_set(&desc->irq_data, IRQD_WAKEUP_STATE);
|
||||
}
|
||||
} else {
|
||||
if (desc->wake_depth == 0) {
|
||||
WARN(1, "Unbalanced IRQ %d wake disable\n", irq);
|
||||
} else if (--desc->wake_depth == 0) {
|
||||
ret = set_irq_wake_real(irq, on);
|
||||
if (ret)
|
||||
desc->wake_depth = 1;
|
||||
else
|
||||
irqd_clear(&desc->irq_data, IRQD_WAKEUP_STATE);
|
||||
/*
|
||||
* wakeup-capable irqs can be shared between drivers that
|
||||
* don't need to have the same sleep mode behaviors.
|
||||
*/
|
||||
if (on) {
|
||||
if (desc->wake_depth++ == 0) {
|
||||
ret = set_irq_wake_real(irq, on);
|
||||
if (ret)
|
||||
desc->wake_depth = 0;
|
||||
else
|
||||
irqd_set(&desc->irq_data, IRQD_WAKEUP_STATE);
|
||||
}
|
||||
} else {
|
||||
if (desc->wake_depth == 0) {
|
||||
WARN(1, "Unbalanced IRQ %d wake disable\n", irq);
|
||||
} else if (--desc->wake_depth == 0) {
|
||||
ret = set_irq_wake_real(irq, on);
|
||||
if (ret)
|
||||
desc->wake_depth = 1;
|
||||
else
|
||||
irqd_clear(&desc->irq_data, IRQD_WAKEUP_STATE);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
irq_put_desc_busunlock(desc, flags);
|
||||
return ret;
|
||||
return -EINVAL;
|
||||
}
|
||||
EXPORT_SYMBOL(irq_set_irq_wake);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue