*/
 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);