drm/msm/sde: add function to return raw interrupt status

Current hardware interrupt driver does not support reading of
raw interrupt status using interrupt index.  This patch adds
new function to perform atomic read and clear of interrupt status
using interrupt index returned from interrupt lookup function.

Change-Id: I0cb7f5802df6da270738e98bf4a1748978cdd565
Signed-off-by: Alan Kwong <akwong@codeaurora.org>
diff --git a/drivers/gpu/drm/msm/sde/sde_hw_interrupts.c b/drivers/gpu/drm/msm/sde/sde_hw_interrupts.c
index 921df1f..4993036 100644
--- a/drivers/gpu/drm/msm/sde/sde_hw_interrupts.c
+++ b/drivers/gpu/drm/msm/sde/sde_hw_interrupts.c
@@ -891,6 +891,27 @@
 	spin_unlock_irqrestore(&intr->mask_lock, irq_flags);
 }
 
+static u32 sde_hw_intr_get_interrupt_status(struct sde_hw_intr *intr,
+		int irq_idx, bool clear)
+{
+	int reg_idx;
+	unsigned long irq_flags;
+	u32 intr_status;
+
+	spin_lock_irqsave(&intr->mask_lock, irq_flags);
+
+	reg_idx = sde_irq_map[irq_idx].reg_idx;
+	intr_status = SDE_REG_READ(&intr->hw,
+			sde_intr_set[reg_idx].status_off) &
+					sde_irq_map[irq_idx].irq_mask;
+	if (intr_status && clear)
+		SDE_REG_WRITE(&intr->hw, sde_intr_set[irq_idx].clr_off,
+				intr_status);
+
+	spin_unlock_irqrestore(&intr->mask_lock, irq_flags);
+
+	return intr_status;
+}
 
 static void __setup_intr_ops(struct sde_hw_intr_ops *ops)
 {
@@ -905,6 +926,7 @@
 	ops->get_interrupt_sources = sde_hw_intr_get_interrupt_sources;
 	ops->get_interrupt_statuses = sde_hw_intr_get_interrupt_statuses;
 	ops->clear_interrupt_status = sde_hw_intr_clear_interrupt_status;
+	ops->get_interrupt_status = sde_hw_intr_get_interrupt_status;
 }
 
 static struct sde_mdss_base_cfg *__intr_offset(struct sde_mdss_cfg *m,