EXPORT_SYMBOL_GPL(handle_fasteoi_nmi);
 
 /**
- *     handle_edge_irq - edge type IRQ handler
- *     @desc:  the interrupt description structure for this irq
+ * handle_edge_irq - edge type IRQ handler
+ * @desc:      the interrupt description structure for this irq
  *
- *     Interrupt occurs on the falling and/or rising edge of a hardware
- *     signal. The occurrence is latched into the irq controller hardware
- *     and must be acked in order to be reenabled. After the ack another
- *     interrupt can happen on the same source even before the first one
- *     is handled by the associated event handler. If this happens it
- *     might be necessary to disable (mask) the interrupt depending on the
- *     controller hardware. This requires to reenable the interrupt inside
- *     of the loop which handles the interrupts which have arrived while
- *     the handler was running. If all pending interrupts are handled, the
- *     loop is left.
+ * Interrupt occurs on the falling and/or rising edge of a hardware
+ * signal. The occurrence is latched into the irq controller hardware and
+ * must be acked in order to be reenabled. After the ack another interrupt
+ * can happen on the same source even before the first one is handled by
+ * the associated event handler. If this happens it might be necessary to
+ * disable (mask) the interrupt depending on the controller hardware. This
+ * requires to reenable the interrupt inside of the loop which handles the
+ * interrupts which have arrived while the handler was running. If all
+ * pending interrupts are handled, the loop is left.
  */
 void handle_edge_irq(struct irq_desc *desc)
 {
-       raw_spin_lock(&desc->lock);
-
-       desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
-
-       if (!irq_can_handle_pm(desc)) {
-               desc->istate |= IRQS_PENDING;
-               mask_ack_irq(desc);
-               goto out_unlock;
-       }
+       guard(raw_spinlock)(&desc->lock);
 
-       /*
-        * If its disabled or no action available then mask it and get
-        * out of here.
-        */
-       if (irqd_irq_disabled(&desc->irq_data) || !desc->action) {
+       if (!irq_can_handle(desc)) {
                desc->istate |= IRQS_PENDING;
                mask_ack_irq(desc);
-               goto out_unlock;
+               return;
        }
 
        kstat_incr_irqs_this_cpu(desc);
        do {
                if (unlikely(!desc->action)) {
                        mask_irq(desc);
-                       goto out_unlock;
+                       return;
                }
 
                /*
 
                handle_irq_event(desc);
 
-       } while ((desc->istate & IRQS_PENDING) &&
-                !irqd_irq_disabled(&desc->irq_data));
-
-out_unlock:
-       raw_spin_unlock(&desc->lock);
+       } while ((desc->istate & IRQS_PENDING) && !irqd_irq_disabled(&desc->irq_data));
 }
 EXPORT_SYMBOL(handle_edge_irq);