mirror of https://github.com/hak5/openwrt-owl.git
ar71xx: fix disable_irq() on chained irq handlers
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 43974owl
parent
4f2fe5d7fa
commit
f1c5232f4d
|
@ -0,0 +1,93 @@
|
|||
--- a/arch/mips/ath79/irq.c
|
||||
+++ b/arch/mips/ath79/irq.c
|
||||
@@ -26,6 +26,8 @@
|
||||
|
||||
static void (*ath79_ip2_handler)(void);
|
||||
static void (*ath79_ip3_handler)(void);
|
||||
+static struct irq_chip ip2_chip;
|
||||
+static struct irq_chip ip3_chip;
|
||||
|
||||
static void ath79_misc_irq_handler(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
@@ -149,8 +151,7 @@ static void ar934x_ip2_irq_init(void)
|
||||
|
||||
for (i = ATH79_IP2_IRQ_BASE;
|
||||
i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++)
|
||||
- irq_set_chip_and_handler(i, &dummy_irq_chip,
|
||||
- handle_level_irq);
|
||||
+ irq_set_chip_and_handler(i, &ip2_chip, handle_level_irq);
|
||||
|
||||
irq_set_chained_handler(ATH79_CPU_IRQ(2), ar934x_ip2_irq_dispatch);
|
||||
}
|
||||
@@ -224,15 +225,13 @@ static void qca955x_irq_init(void)
|
||||
|
||||
for (i = ATH79_IP2_IRQ_BASE;
|
||||
i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++)
|
||||
- irq_set_chip_and_handler(i, &dummy_irq_chip,
|
||||
- handle_level_irq);
|
||||
+ irq_set_chip_and_handler(i, &ip2_chip, handle_level_irq);
|
||||
|
||||
irq_set_chained_handler(ATH79_CPU_IRQ(2), qca955x_ip2_irq_dispatch);
|
||||
|
||||
for (i = ATH79_IP3_IRQ_BASE;
|
||||
i < ATH79_IP3_IRQ_BASE + ATH79_IP3_IRQ_COUNT; i++)
|
||||
- irq_set_chip_and_handler(i, &dummy_irq_chip,
|
||||
- handle_level_irq);
|
||||
+ irq_set_chip_and_handler(i, &ip3_chip, handle_level_irq);
|
||||
|
||||
irq_set_chained_handler(ATH79_CPU_IRQ(3), qca955x_ip3_irq_dispatch);
|
||||
}
|
||||
@@ -313,15 +312,13 @@ static void qca956x_irq_init(void)
|
||||
|
||||
for (i = ATH79_IP2_IRQ_BASE;
|
||||
i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++)
|
||||
- irq_set_chip_and_handler(i, &dummy_irq_chip,
|
||||
- handle_level_irq);
|
||||
+ irq_set_chip_and_handler(i, &ip2_chip, handle_level_irq);
|
||||
|
||||
irq_set_chained_handler(ATH79_CPU_IRQ(2), qca956x_ip2_irq_dispatch);
|
||||
|
||||
for (i = ATH79_IP3_IRQ_BASE;
|
||||
i < ATH79_IP3_IRQ_BASE + ATH79_IP3_IRQ_COUNT; i++)
|
||||
- irq_set_chip_and_handler(i, &dummy_irq_chip,
|
||||
- handle_level_irq);
|
||||
+ irq_set_chip_and_handler(i, &ip3_chip, handle_level_irq);
|
||||
|
||||
irq_set_chained_handler(ATH79_CPU_IRQ(3), qca956x_ip3_irq_dispatch);
|
||||
|
||||
@@ -430,8 +427,35 @@ static void ar934x_ip3_handler(void)
|
||||
do_IRQ(ATH79_CPU_IRQ(3));
|
||||
}
|
||||
|
||||
+static void ath79_ip2_disable(struct irq_data *data)
|
||||
+{
|
||||
+ disable_irq(ATH79_CPU_IRQ(2));
|
||||
+}
|
||||
+
|
||||
+static void ath79_ip2_enable(struct irq_data *data)
|
||||
+{
|
||||
+ enable_irq(ATH79_CPU_IRQ(2));
|
||||
+}
|
||||
+
|
||||
+static void ath79_ip3_disable(struct irq_data *data)
|
||||
+{
|
||||
+ disable_irq(ATH79_CPU_IRQ(3));
|
||||
+}
|
||||
+
|
||||
+static void ath79_ip3_enable(struct irq_data *data)
|
||||
+{
|
||||
+ enable_irq(ATH79_CPU_IRQ(3));
|
||||
+}
|
||||
+
|
||||
void __init arch_init_irq(void)
|
||||
{
|
||||
+ ip2_chip = dummy_irq_chip;
|
||||
+ ip3_chip = dummy_irq_chip;
|
||||
+ ip2_chip.irq_disable = ath79_ip2_disable;
|
||||
+ ip2_chip.irq_enable = ath79_ip2_enable;
|
||||
+ ip3_chip.irq_disable = ath79_ip3_disable;
|
||||
+ ip3_chip.irq_enable = ath79_ip3_enable;
|
||||
+
|
||||
if (soc_is_ar71xx()) {
|
||||
ath79_ip2_handler = ar71xx_ip2_handler;
|
||||
ath79_ip3_handler = ar71xx_ip3_handler;
|
Loading…
Reference in New Issue