static irqreturn_t c67x00_irq(int irq, void *__dev) { struct c67x00_device *c67x00 = __dev; struct c67x00_sie *sie; u16 msg, int_status; int i, count = 8; int_status = c67x00_ll_hpi_status(c67x00); if (!int_status) return IRQ_NONE; while (int_status != 0 && (count-- >= 0)) { c67x00_ll_irq(c67x00, int_status); for (i = 0; i < C67X00_SIES; i++) { sie = &c67x00->sie[i]; msg = 0; if (int_status & SIEMSG_FLG(i)) msg = c67x00_ll_fetch_siemsg(c67x00, i); if (sie->irq) sie->irq(sie, int_status, msg); } int_status = c67x00_ll_hpi_status(c67x00); } if (int_status) dev_warn(&c67x00->pdev->dev, "Not all interrupts handled! " "status = 0x%04x\n", int_status); return IRQ_HANDLED; }
void c67x00_ll_hpi_reg_init(struct c67x00_device *dev) { int i; hpi_recv_mbox(dev); c67x00_ll_hpi_status(dev); hpi_write_word(dev, HPI_IRQ_ROUTING_REG, 0); for (i = 0; i < C67X00_SIES; i++) { hpi_write_word(dev, SIEMSG_REG(i), 0); hpi_read_word(dev, SIEMSG_REG(i)); } }