EXPORT_SYMBOL_GPL(handle_nested_irq);
 
 /**
- *     handle_simple_irq - Simple and software-decoded IRQs.
- *     @desc:  the interrupt description structure for this irq
+ * handle_simple_irq - Simple and software-decoded IRQs.
+ * @desc:      the interrupt description structure for this irq
  *
- *     Simple interrupts are either sent from a demultiplexing interrupt
- *     handler or come from hardware, where no interrupt hardware control
- *     is necessary.
+ * Simple interrupts are either sent from a demultiplexing interrupt
+ * handler or come from hardware, where no interrupt hardware control is
+ * necessary.
  *
- *     Note: The caller is expected to handle the ack, clear, mask and
- *     unmask issues if necessary.
+ * Note: The caller is expected to handle the ack, clear, mask and unmask
+ * issues if necessary.
  */
 void handle_simple_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);
+       guard(raw_spinlock)(&desc->lock);
 
-       if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) {
-               desc->istate |= IRQS_PENDING;
-               goto out_unlock;
-       }
+       if (!irq_can_handle(desc))
+               return;
 
        kstat_incr_irqs_this_cpu(desc);
        handle_irq_event(desc);
-
-out_unlock:
-       raw_spin_unlock(&desc->lock);
 }
 EXPORT_SYMBOL_GPL(handle_simple_irq);