EXPORT_SYMBOL_GPL(handle_simple_irq);
 
 /**
- *     handle_untracked_irq - Simple and software-decoded IRQs.
- *     @desc:  the interrupt description structure for this irq
+ * handle_untracked_irq - Simple and software-decoded IRQs.
+ * @desc:      the interrupt description structure for this irq
  *
- *     Untracked interrupts are sent from a demultiplexing interrupt
- *     handler when the demultiplexer does not know which device it its
- *     multiplexed irq domain generated the interrupt. IRQ's handled
- *     through here are not subjected to stats tracking, randomness, or
- *     spurious interrupt detection.
+ * Untracked interrupts are sent from a demultiplexing interrupt handler
+ * when the demultiplexer does not know which device it its multiplexed irq
+ * domain generated the interrupt. IRQ's handled through here are not
+ * subjected to stats tracking, randomness, or spurious interrupt
+ * detection.
  *
- *     Note: Like handle_simple_irq, the caller is expected to handle
- *     the ack, clear, mask and unmask issues if necessary.
+ * Note: Like handle_simple_irq, the caller is expected to handle the ack,
+ * clear, mask and unmask issues if necessary.
  */
 void handle_untracked_irq(struct irq_desc *desc)
 {
-       raw_spin_lock(&desc->lock);
-
-       if (!irq_can_handle_pm(desc))
-               goto out_unlock;
-
-       desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
+       scoped_guard(raw_spinlock, &desc->lock) {
+               if (!irq_can_handle(desc))
+                       return;
 
-       if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) {
-               desc->istate |= IRQS_PENDING;
-               goto out_unlock;
+               desc->istate &= ~IRQS_PENDING;
+               irqd_set(&desc->irq_data, IRQD_IRQ_INPROGRESS);
        }
 
-       desc->istate &= ~IRQS_PENDING;
-       irqd_set(&desc->irq_data, IRQD_IRQ_INPROGRESS);
-       raw_spin_unlock(&desc->lock);
-
        __handle_irq_event_percpu(desc);
 
-       raw_spin_lock(&desc->lock);
-       irqd_clear(&desc->irq_data, IRQD_IRQ_INPROGRESS);
-
-out_unlock:
-       raw_spin_unlock(&desc->lock);
+       scoped_guard(raw_spinlock, &desc->lock)
+               irqd_clear(&desc->irq_data, IRQD_IRQ_INPROGRESS);
 }
 EXPORT_SYMBOL_GPL(handle_untracked_irq);