EXPORT_SYMBOL_GPL(handle_fasteoi_ack_irq);
 
 /**
- *     handle_fasteoi_mask_irq - irq handler for level hierarchy
- *     stacked on transparent controllers
+ * handle_fasteoi_mask_irq - irq handler for level hierarchy stacked on
+ *                          transparent controllers
  *
- *     @desc:  the interrupt description structure for this irq
+ * @desc:      the interrupt description structure for this irq
  *
- *     Like handle_fasteoi_irq(), but for use with hierarchy where
- *     the irq_chip also needs to have its ->irq_mask_ack() function
- *     called.
+ * Like handle_fasteoi_irq(), but for use with hierarchy where the irq_chip
+ * also needs to have its ->irq_mask_ack() function called.
  */
 void handle_fasteoi_mask_irq(struct irq_desc *desc)
 {
        struct irq_chip *chip = desc->irq_data.chip;
 
-       raw_spin_lock(&desc->lock);
+       guard(raw_spinlock)(&desc->lock);
        mask_ack_irq(desc);
 
-       if (!irq_can_handle_pm(desc))
-               goto out;
-
-       desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
-
-       /*
-        * If its disabled or no action available
-        * then mask it and get out of here:
-        */
-       if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) {
-               desc->istate |= IRQS_PENDING;
-               mask_irq(desc);
-               goto out;
+       if (!irq_can_handle(desc)) {
+               cond_eoi_irq(chip, &desc->irq_data);
+               return;
        }
 
        kstat_incr_irqs_this_cpu(desc);
-       if (desc->istate & IRQS_ONESHOT)
-               mask_irq(desc);
 
        handle_irq_event(desc);
 
        cond_unmask_eoi_irq(desc, chip);
-
-       raw_spin_unlock(&desc->lock);
-       return;
-out:
-       if (!(chip->flags & IRQCHIP_EOI_IF_HANDLED))
-               chip->irq_eoi(&desc->irq_data);
-       raw_spin_unlock(&desc->lock);
 }
 EXPORT_SYMBOL_GPL(handle_fasteoi_mask_irq);