]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
genirq/manage: Rework irq_set_irq_wake()
authorThomas Gleixner <tglx@linutronix.de>
Wed, 30 Apr 2025 12:48:15 +0000 (14:48 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 7 May 2025 07:08:15 +0000 (09:08 +0200)
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
kernel/irq/manage.c

index b8f59853f7db838d6edc344fc9a8002e1d8514ab..d1ff1e81d383dd39ece5336ce66f1f5716ed45ec 100644 (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)
 {
-       unsigned long flags;
-       struct irq_desc *desc = irq_get_desc_buslock(irq, &flags, IRQ_GET_DESC_CHECK_GLOBAL);
-       int ret = 0;
-
-       if (!desc)
-               return -EINVAL;
+       scoped_irqdesc_get_and_lock(irq, IRQ_GET_DESC_CHECK_GLOBAL) {
+               struct irq_desc *desc = scoped_irqdesc;
+               int ret = 0;
 
-       /* Don't use NMIs as wake up interrupts please */
-       if (irq_is_nmi(desc)) {
-               ret = -EINVAL;
-               goto out_unlock;
-       }
+               /* Don't use NMIs as wake up interrupts please */
+               if (irq_is_nmi(desc))
+                       return -EINVAL;
 
-       /* 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);