return readb(address);
}
-extern can_irqreturn_t sja1000p_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
-
-can_irqreturn_t ems_cpcpci_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+int ems_cpcpci_irq_handler(int irq, struct chip_t *chip)
{
- struct chip_t *chip=(struct chip_t *)dev_id;
+ //struct chip_t *chip=(struct chip_t *)dev_id;
struct candevice_t *candev=chip->hostdevice;
int i;
unsigned long icr;
+ int test_irq_again;
icr=readl(candev->dev_base_addr + PITA2_ICR);
- if(!(icr & PITA2_ICR_INT0)) return IRQ_NONE;
+ if(!(icr & PITA2_ICR_INT0)) return CANCHIP_IRQ_NONE;
/* correct way to handle interrupts from all chips connected to the one PITA-2 */
do {
writel(PITA2_ICR_INT0_En | PITA2_ICR_INT0, candev->dev_base_addr + PITA2_ICR);
+ test_irq_again=0;
for(i=0;i<candev->nr_all_chips;i++){
chip=candev->chip[i];
if(!chip || !(chip->flags&CHIP_CONFIGURED))
continue;
- sja1000p_irq_handler(irq, chip, regs);
+ if(sja1000p_irq_handler(irq, chip))
+ test_irq_again=1;
}
icr=readl(candev->dev_base_addr + PITA2_ICR);
- } while(icr & PITA2_ICR_INT0);
- return IRQ_HANDLED;
+ } while((icr & PITA2_ICR_INT0)||test_irq_again);
+ return CANCHIP_IRQ_HANDLED;
}
int ems_cpcpci_reset(struct candevice_t *candev)