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:
Thomas Gleixner 2025-04-30 14:48:15 +02:00
parent bddd10c554
commit 8589e325ba

View file

@ -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) int irq_set_irq_wake(unsigned int irq, unsigned int on)
{ {
unsigned long flags; scoped_irqdesc_get_and_lock(irq, IRQ_GET_DESC_CHECK_GLOBAL) {
struct irq_desc *desc = irq_get_desc_buslock(irq, &flags, IRQ_GET_DESC_CHECK_GLOBAL); struct irq_desc *desc = scoped_irqdesc;
int ret = 0; int ret = 0;
if (!desc) /* Don't use NMIs as wake up interrupts please */
return -EINVAL; if (irq_is_nmi(desc))
return -EINVAL;
/* Don't use NMIs as wake up interrupts please */ /*
if (irq_is_nmi(desc)) { * wakeup-capable irqs can be shared between drivers that
ret = -EINVAL; * don't need to have the same sleep mode behaviors.
goto out_unlock; */
} if (on) {
if (desc->wake_depth++ == 0) {
/* wakeup-capable irqs can be shared between drivers that ret = set_irq_wake_real(irq, on);
* don't need to have the same sleep mode behaviors. if (ret)
*/ desc->wake_depth = 0;
if (on) { else
if (desc->wake_depth++ == 0) { irqd_set(&desc->irq_data, IRQD_WAKEUP_STATE);
ret = set_irq_wake_real(irq, on); }
if (ret) } else {
desc->wake_depth = 0; if (desc->wake_depth == 0) {
else WARN(1, "Unbalanced IRQ %d wake disable\n", irq);
irqd_set(&desc->irq_data, IRQD_WAKEUP_STATE); } else if (--desc->wake_depth == 0) {
} ret = set_irq_wake_real(irq, on);
} else { if (ret)
if (desc->wake_depth == 0) { desc->wake_depth = 1;
WARN(1, "Unbalanced IRQ %d wake disable\n", irq); else
} else if (--desc->wake_depth == 0) { irqd_clear(&desc->irq_data, IRQD_WAKEUP_STATE);
ret = set_irq_wake_real(irq, on); }
if (ret)
desc->wake_depth = 1;
else
irqd_clear(&desc->irq_data, IRQD_WAKEUP_STATE);
} }
return ret;
} }
return -EINVAL;
out_unlock:
irq_put_desc_busunlock(desc, flags);
return ret;
} }
EXPORT_SYMBOL(irq_set_irq_wake); EXPORT_SYMBOL(irq_set_irq_wake);