aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/irqchip/irq-orion.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/irqchip/irq-orion.c b/drivers/irqchip/irq-orion.c
index 1f636f719065..0dfdc5c824a1 100644
--- a/drivers/irqchip/irq-orion.c
+++ b/drivers/irqchip/irq-orion.c
@@ -123,6 +123,19 @@ static void orion_bridge_irq_handler(unsigned int irq, struct irq_desc *desc)
123 } 123 }
124} 124}
125 125
126/*
127 * Bridge IRQ_CAUSE is asserted regardless of IRQ_MASK register.
128 * To avoid interrupt events on stale irqs, we clear them before unmask.
129 */
130static unsigned int orion_bridge_irq_startup(struct irq_data *d)
131{
132 struct irq_chip_type *ct = irq_data_get_chip_type(d);
133
134 ct->chip.irq_ack(d);
135 ct->chip.irq_unmask(d);
136 return 0;
137}
138
126static int __init orion_bridge_irq_init(struct device_node *np, 139static int __init orion_bridge_irq_init(struct device_node *np,
127 struct device_node *parent) 140 struct device_node *parent)
128{ 141{
@@ -176,6 +189,7 @@ static int __init orion_bridge_irq_init(struct device_node *np,
176 189
177 gc->chip_types[0].regs.ack = ORION_BRIDGE_IRQ_CAUSE; 190 gc->chip_types[0].regs.ack = ORION_BRIDGE_IRQ_CAUSE;
178 gc->chip_types[0].regs.mask = ORION_BRIDGE_IRQ_MASK; 191 gc->chip_types[0].regs.mask = ORION_BRIDGE_IRQ_MASK;
192 gc->chip_types[0].chip.irq_startup = orion_bridge_irq_startup;
179 gc->chip_types[0].chip.irq_ack = irq_gc_ack_clr_bit; 193 gc->chip_types[0].chip.irq_ack = irq_gc_ack_clr_bit;
180 gc->chip_types[0].chip.irq_mask = irq_gc_mask_clr_bit; 194 gc->chip_types[0].chip.irq_mask = irq_gc_mask_clr_bit;
181 gc->chip_types[0].chip.irq_unmask = irq_gc_mask_set_bit; 195 gc->chip_types[0].chip.irq_unmask = irq_gc_mask_set_bit;