* Copyright (C) 2019 David Lechner <david@lechnology.com>
  */
 
+#include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/irqchip/chained_irq.h>
 #include <linux/irqdomain.h>
        module_put(THIS_MODULE);
 }
 
+static int pruss_intc_irq_get_irqchip_state(struct irq_data *data,
+                                           enum irqchip_irq_state which,
+                                           bool *state)
+{
+       struct pruss_intc *intc = irq_data_get_irq_chip_data(data);
+       u32 reg, mask, srsr;
+
+       if (which != IRQCHIP_STATE_PENDING)
+               return -EINVAL;
+
+       reg = PRU_INTC_SRSR(data->hwirq / 32);
+       mask = BIT(data->hwirq % 32);
+
+       srsr = pruss_intc_read_reg(intc, reg);
+
+       *state = !!(srsr & mask);
+
+       return 0;
+}
+
+static int pruss_intc_irq_set_irqchip_state(struct irq_data *data,
+                                           enum irqchip_irq_state which,
+                                           bool state)
+{
+       struct pruss_intc *intc = irq_data_get_irq_chip_data(data);
+
+       if (which != IRQCHIP_STATE_PENDING)
+               return -EINVAL;
+
+       if (state)
+               pruss_intc_write_reg(intc, PRU_INTC_SISR, data->hwirq);
+       else
+               pruss_intc_write_reg(intc, PRU_INTC_SICR, data->hwirq);
+
+       return 0;
+}
+
 static struct irq_chip pruss_irqchip = {
        .name                   = "pruss-intc",
        .irq_ack                = pruss_intc_irq_ack,
        .irq_unmask             = pruss_intc_irq_unmask,
        .irq_request_resources  = pruss_intc_irq_reqres,
        .irq_release_resources  = pruss_intc_irq_relres,
+       .irq_get_irqchip_state  = pruss_intc_irq_get_irqchip_state,
+       .irq_set_irqchip_state  = pruss_intc_irq_set_irqchip_state,
 };
 
 static int pruss_intc_validate_mapping(struct pruss_intc *intc, int event,