@@ -41,38 +41,44 @@ static irqreturn_t cplds_irq_handler(int in_irq, void *d)
4141 unsigned long pending ;
4242 unsigned int bit ;
4343
44- pending = readl (fpga -> base + FPGA_IRQ_SET_CLR ) & fpga -> irq_mask ;
45- for_each_set_bit (bit , & pending , CPLDS_NB_IRQ )
46- generic_handle_irq (irq_find_mapping (fpga -> irqdomain , bit ));
44+ do {
45+ pending = readl (fpga -> base + FPGA_IRQ_SET_CLR ) & fpga -> irq_mask ;
46+ for_each_set_bit (bit , & pending , CPLDS_NB_IRQ ) {
47+ generic_handle_irq (irq_find_mapping (fpga -> irqdomain ,
48+ bit ));
49+ }
50+ } while (pending );
4751
4852 return IRQ_HANDLED ;
4953}
5054
51- static void cplds_irq_mask_ack (struct irq_data * d )
55+ static void cplds_irq_mask (struct irq_data * d )
5256{
5357 struct cplds * fpga = irq_data_get_irq_chip_data (d );
5458 unsigned int cplds_irq = irqd_to_hwirq (d );
55- unsigned int set , bit = BIT (cplds_irq );
59+ unsigned int bit = BIT (cplds_irq );
5660
5761 fpga -> irq_mask &= ~bit ;
5862 writel (fpga -> irq_mask , fpga -> base + FPGA_IRQ_MASK_EN );
59- set = readl (fpga -> base + FPGA_IRQ_SET_CLR );
60- writel (set & ~bit , fpga -> base + FPGA_IRQ_SET_CLR );
6163}
6264
6365static void cplds_irq_unmask (struct irq_data * d )
6466{
6567 struct cplds * fpga = irq_data_get_irq_chip_data (d );
6668 unsigned int cplds_irq = irqd_to_hwirq (d );
67- unsigned int bit = BIT (cplds_irq );
69+ unsigned int set , bit = BIT (cplds_irq );
70+
71+ set = readl (fpga -> base + FPGA_IRQ_SET_CLR );
72+ writel (set & ~bit , fpga -> base + FPGA_IRQ_SET_CLR );
6873
6974 fpga -> irq_mask |= bit ;
7075 writel (fpga -> irq_mask , fpga -> base + FPGA_IRQ_MASK_EN );
7176}
7277
7378static struct irq_chip cplds_irq_chip = {
7479 .name = "pxa_cplds" ,
75- .irq_mask_ack = cplds_irq_mask_ack ,
80+ .irq_ack = cplds_irq_mask ,
81+ .irq_mask = cplds_irq_mask ,
7682 .irq_unmask = cplds_irq_unmask ,
7783 .flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE ,
7884};
0 commit comments