|
|
|
@ -231,6 +231,39 @@ static void __init ar71xx_misc_irq_init(void)
|
|
|
|
|
setup_irq(AR71XX_CPU_IRQ_MISC, &ar71xx_misc_irqaction);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void ar934x_ip2_irq_dispatch(unsigned int irq, struct irq_desc *desc)
|
|
|
|
|
{
|
|
|
|
|
u32 status;
|
|
|
|
|
|
|
|
|
|
disable_irq_nosync(irq);
|
|
|
|
|
|
|
|
|
|
status = ar71xx_reset_rr(AR934X_RESET_REG_PCIE_WMAC_INT_STATUS);
|
|
|
|
|
|
|
|
|
|
if (status & AR934X_PCIE_WMAC_INT_PCIE_ALL)
|
|
|
|
|
generic_handle_irq(AR934X_IP2_IRQ_PCIE);
|
|
|
|
|
|
|
|
|
|
else if (status & AR934X_PCIE_WMAC_INT_WMAC_ALL)
|
|
|
|
|
generic_handle_irq(AR934X_IP2_IRQ_WMAC);
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
spurious_interrupt();
|
|
|
|
|
|
|
|
|
|
enable_irq(irq);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void ar934x_ip2_irq_init(void)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = AR934X_IP2_IRQ_BASE;
|
|
|
|
|
i < AR934X_IP2_IRQ_BASE + AR934X_IP2_IRQ_COUNT; i++)
|
|
|
|
|
irq_set_chip_and_handler(i, &dummy_irq_chip,
|
|
|
|
|
handle_level_irq);
|
|
|
|
|
|
|
|
|
|
irq_set_chained_handler(AR71XX_CPU_IRQ_IP2, ar934x_ip2_irq_dispatch);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* The IP2/IP3 lines are tied to a PCI/WMAC/USB device. Drivers for
|
|
|
|
|
* these devices typically allocate coherent DMA memory, however the
|
|
|
|
@ -372,6 +405,11 @@ void __init arch_init_irq(void)
|
|
|
|
|
|
|
|
|
|
ar71xx_misc_irq_init();
|
|
|
|
|
|
|
|
|
|
if (ar71xx_soc == AR71XX_SOC_AR9341 ||
|
|
|
|
|
ar71xx_soc == AR71XX_SOC_AR9342 ||
|
|
|
|
|
ar71xx_soc == AR71XX_SOC_AR9344)
|
|
|
|
|
ar934x_ip2_irq_init();
|
|
|
|
|
|
|
|
|
|
cp0_perfcount_irq = AR71XX_MISC_IRQ_PERFC;
|
|
|
|
|
|
|
|
|
|
ar71xx_gpio_irq_init();
|
|
|
|
|