irqreturn_t dpu_core_irq(struct dpu_kms *dpu_kms)
 {
-       /*
-        * Read interrupt status from all sources. Interrupt status are
-        * stored within hw_intr.
-        * Function will also clear the interrupt status after reading.
-        * Individual interrupt status bit will only get stored if it
-        * is enabled.
-        */
-       dpu_kms->hw_intr->ops.get_interrupt_statuses(dpu_kms->hw_intr);
-
        /*
         * Dispatch to HW driver to handle interrupt lookup that is being
         * fired. When matching interrupt is located, HW driver will call to
         * dpu_core_irq_callback_handler will perform the registered function
         * callback, and do the interrupt status clearing once the registered
         * callback is finished.
+        * Function will also clear the interrupt status after reading.
         */
        dpu_kms->hw_intr->ops.dispatch_irqs(
                        dpu_kms->hw_intr,
 
        int start_idx;
        int end_idx;
        u32 irq_status;
+       u32 enable_mask;
        unsigned long irq_flags;
 
        if (!intr)
         */
        spin_lock_irqsave(&intr->irq_lock, irq_flags);
        for (reg_idx = 0; reg_idx < ARRAY_SIZE(dpu_intr_set); reg_idx++) {
-               irq_status = intr->save_irq_status[reg_idx];
-
                /*
                 * Each Interrupt register has a range of 64 indexes, and
                 * that is static for dpu_irq_map.
                        start_idx >= ARRAY_SIZE(dpu_irq_map))
                        continue;
 
+               /* Read interrupt status */
+               irq_status = DPU_REG_READ(&intr->hw, dpu_intr_set[reg_idx].status_off);
+
+               /* Read enable mask */
+               enable_mask = DPU_REG_READ(&intr->hw, dpu_intr_set[reg_idx].en_off);
+
+               /* and clear the interrupt */
+               if (irq_status)
+                       DPU_REG_WRITE(&intr->hw, dpu_intr_set[reg_idx].clr_off,
+                                    irq_status);
+
+               /* Finally update IRQ status based on enable mask */
+               irq_status &= enable_mask;
+
                /*
                 * Search through matching intr status from irq map.
                 * start_idx and end_idx defined the search range in
                                irq_status &= ~dpu_irq_map[irq_idx].irq_mask;
                        }
        }
+
+       /* ensure register writes go through */
+       wmb();
+
        spin_unlock_irqrestore(&intr->irq_lock, irq_flags);
 }
 
        return 0;
 }
 
-static void dpu_hw_intr_get_interrupt_statuses(struct dpu_hw_intr *intr)
-{
-       int i;
-       u32 enable_mask;
-       unsigned long irq_flags;
-
-       if (!intr)
-               return;
-
-       spin_lock_irqsave(&intr->irq_lock, irq_flags);
-       for (i = 0; i < ARRAY_SIZE(dpu_intr_set); i++) {
-               if (!test_bit(i, &intr->irq_mask))
-                       continue;
-
-               /* Read interrupt status */
-               intr->save_irq_status[i] = DPU_REG_READ(&intr->hw,
-                               dpu_intr_set[i].status_off);
-
-               /* Read enable mask */
-               enable_mask = DPU_REG_READ(&intr->hw, dpu_intr_set[i].en_off);
-
-               /* and clear the interrupt */
-               if (intr->save_irq_status[i])
-                       DPU_REG_WRITE(&intr->hw, dpu_intr_set[i].clr_off,
-                                       intr->save_irq_status[i]);
-
-               /* Finally update IRQ status based on enable mask */
-               intr->save_irq_status[i] &= enable_mask;
-       }
-
-       /* ensure register writes go through */
-       wmb();
-
-       spin_unlock_irqrestore(&intr->irq_lock, irq_flags);
-}
 
 static void dpu_hw_intr_clear_intr_status_nolock(struct dpu_hw_intr *intr,
                int irq_idx)
        ops->dispatch_irqs = dpu_hw_intr_dispatch_irq;
        ops->clear_all_irqs = dpu_hw_intr_clear_irqs;
        ops->disable_all_irqs = dpu_hw_intr_disable_irqs;
-       ops->get_interrupt_statuses = dpu_hw_intr_get_interrupt_statuses;
        ops->clear_intr_status_nolock = dpu_hw_intr_clear_intr_status_nolock;
        ops->get_interrupt_status = dpu_hw_intr_get_interrupt_status;
 }
                return ERR_PTR(-ENOMEM);
        }
 
-       intr->save_irq_status = kcalloc(ARRAY_SIZE(dpu_intr_set), sizeof(u32),
-                       GFP_KERNEL);
-       if (intr->save_irq_status == NULL) {
-               kfree(intr->cache_irq_mask);
-               kfree(intr);
-               return ERR_PTR(-ENOMEM);
-       }
-
        intr->irq_mask = m->mdss_irqs;
        intr->obsolete_irq = m->obsolete_irq;
 
 {
        if (intr) {
                kfree(intr->cache_irq_mask);
-               kfree(intr->save_irq_status);
                kfree(intr);
        }
 }