void __init avic_init_irq(void __iomem *base, int nr_irqs) { int i; g_icoll_base = base; mxs_reset_block(base + HW_ICOLL_CTRL, 0); for (i = 0; i < nr_irqs; i++) { __raw_writel(0, g_icoll_base + HW_ICOLL_INTERRUPTn(i)); set_irq_chip(i, &icoll_chip); set_irq_handler(i, handle_level_irq); set_irq_flags(i, IRQF_VALID | IRQF_PROBE); } __raw_writel(BF_ICOLL_LEVELACK_IRQLEVELACK (BV_ICOLL_LEVELACK_IRQLEVELACK__LEVEL0), g_icoll_base + HW_ICOLL_LEVELACK); __raw_writel(BF_ICOLL_LEVELACK_IRQLEVELACK (BV_ICOLL_LEVELACK_IRQLEVELACK__LEVEL1), g_icoll_base + HW_ICOLL_LEVELACK); __raw_writel(BF_ICOLL_LEVELACK_IRQLEVELACK (BV_ICOLL_LEVELACK_IRQLEVELACK__LEVEL2), g_icoll_base + HW_ICOLL_LEVELACK); __raw_writel(BF_ICOLL_LEVELACK_IRQLEVELACK (BV_ICOLL_LEVELACK_IRQLEVELACK__LEVEL3), g_icoll_base + HW_ICOLL_LEVELACK); __raw_writel(0, g_icoll_base + HW_ICOLL_VECTOR); /* Barrier */ (void)__raw_readl(g_icoll_base + HW_ICOLL_STAT); }
void __init avic_init_irq(void __iomem *base, int nr_irqs) { int i; g_icoll_base = base; /* Reset icoll */ __raw_writel(BM_ICOLL_CTRL_SFTRST, g_icoll_base + HW_ICOLL_CTRL_CLR); for (i = 0; i < 100000; i++) { if (!(__raw_readl(g_icoll_base + HW_ICOLL_CTRL) & BM_ICOLL_CTRL_SFTRST)) break; udelay(2); } if (i >= 100000) { printk(KERN_ERR "%s:%d timeout when enableing\n", __func__, __LINE__); return; } __raw_writel(BM_ICOLL_CTRL_CLKGATE, g_icoll_base + HW_ICOLL_CTRL_CLR); for (i = 0; i < nr_irqs; i++) { __raw_writel(0, g_icoll_base + HW_ICOLL_INTERRUPTn(i)); set_irq_chip(i, &icoll_chip); set_irq_handler(i, handle_level_irq); set_irq_flags(i, IRQF_VALID | IRQF_PROBE); } __raw_writel(BF_ICOLL_LEVELACK_IRQLEVELACK (BV_ICOLL_LEVELACK_IRQLEVELACK__LEVEL0), g_icoll_base + HW_ICOLL_LEVELACK); __raw_writel(BF_ICOLL_LEVELACK_IRQLEVELACK (BV_ICOLL_LEVELACK_IRQLEVELACK__LEVEL1), g_icoll_base + HW_ICOLL_LEVELACK); __raw_writel(BF_ICOLL_LEVELACK_IRQLEVELACK (BV_ICOLL_LEVELACK_IRQLEVELACK__LEVEL2), g_icoll_base + HW_ICOLL_LEVELACK); __raw_writel(BF_ICOLL_LEVELACK_IRQLEVELACK (BV_ICOLL_LEVELACK_IRQLEVELACK__LEVEL3), g_icoll_base + HW_ICOLL_LEVELACK); __raw_writel(0, g_icoll_base + HW_ICOLL_VECTOR); /* Barrier */ (void)__raw_readl(g_icoll_base + HW_ICOLL_STAT); }