|
|
@@ -123,6 +123,19 @@ static void orion_bridge_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Bridge IRQ_CAUSE is asserted regardless of IRQ_MASK register.
|
|
|
+ * To avoid interrupt events on stale irqs, we clear them before unmask.
|
|
|
+ */
|
|
|
+static unsigned int orion_bridge_irq_startup(struct irq_data *d)
|
|
|
+{
|
|
|
+ struct irq_chip_type *ct = irq_data_get_chip_type(d);
|
|
|
+
|
|
|
+ ct->chip.irq_ack(d);
|
|
|
+ ct->chip.irq_unmask(d);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int __init orion_bridge_irq_init(struct device_node *np,
|
|
|
struct device_node *parent)
|
|
|
{
|
|
|
@@ -176,6 +189,7 @@ static int __init orion_bridge_irq_init(struct device_node *np,
|
|
|
|
|
|
gc->chip_types[0].regs.ack = ORION_BRIDGE_IRQ_CAUSE;
|
|
|
gc->chip_types[0].regs.mask = ORION_BRIDGE_IRQ_MASK;
|
|
|
+ gc->chip_types[0].chip.irq_startup = orion_bridge_irq_startup;
|
|
|
gc->chip_types[0].chip.irq_ack = irq_gc_ack_clr_bit;
|
|
|
gc->chip_types[0].chip.irq_mask = irq_gc_mask_clr_bit;
|
|
|
gc->chip_types[0].chip.irq_unmask = irq_gc_mask_set_bit;
|