From 9ae6129829a683f36dee5e7651714700e47f26bc Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 11 Oct 2009 19:50:16 +0000 Subject: [PATCH] atheros: leave the gpio interrupts alone when user space changes the gpio input settings, fixes #4493 SVN-Revision: 18036 --- .../atheros/patches-2.6.30/100-board.patch | 23 +++++++++++++++---- .../patches-2.6.30/105-ar2315_pci.patch | 4 ++-- .../atheros/patches-2.6.31/100-board.patch | 23 +++++++++++++++---- .../patches-2.6.31/105-ar2315_pci.patch | 4 ++-- 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/target/linux/atheros/patches-2.6.30/100-board.patch b/target/linux/atheros/patches-2.6.30/100-board.patch index 4367ce413d..5f51293714 100644 --- a/target/linux/atheros/patches-2.6.30/100-board.patch +++ b/target/linux/atheros/patches-2.6.30/100-board.patch @@ -2105,7 +2105,7 @@ + --- /dev/null +++ b/arch/mips/ar231x/ar2315.c -@@ -0,0 +1,643 @@ +@@ -0,0 +1,658 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive @@ -2163,6 +2163,10 @@ + if (!pend) + ar231x_write_reg(AR2315_ISR, AR2315_ISR_GPIO); + ++ /* Enable interrupt with edge detection */ ++ if ((ar231x_read_reg(AR2315_GPIO_CR) & AR2315_GPIO_CR_M(bit)) != AR2315_GPIO_CR_I(bit)) ++ return; ++ + if (bit >= 0) + do_IRQ(AR531X_GPIO_IRQ_BASE + bit); +} @@ -2220,14 +2224,24 @@ +{ + unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE; + -+ /* reconfigure GPIO line as input */ -+ ar231x_mask_reg(AR2315_GPIO_CR, AR2315_GPIO_CR_M(gpio), AR2315_GPIO_CR_I(gpio)); -+ + /* Enable interrupt with edge detection */ ++ if ((ar231x_read_reg(AR2315_GPIO_CR) & AR2315_GPIO_CR_M(gpio)) != AR2315_GPIO_CR_I(gpio)) ++ return; ++ + gpiointmask |= (1 << gpio); + ar2315_set_gpiointmask(gpio, 3); +} + ++static unsigned int ar2315_gpio_intr_startup(unsigned int irq) ++{ ++ unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE; ++ ++ /* reconfigure GPIO line as input */ ++ ar231x_mask_reg(AR2315_GPIO_CR, AR2315_GPIO_CR_M(gpio), AR2315_GPIO_CR_I(gpio)); ++ ar2315_gpio_intr_enable(irq); ++ return 0; ++} ++ +static void ar2315_gpio_intr_disable(unsigned int irq) +{ + unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE; @@ -2246,6 +2260,7 @@ + +static struct irq_chip ar2315_gpio_intr_controller = { + .typename = "AR2315-GPIO", ++ .startup = ar2315_gpio_intr_startup, + .ack = ar2315_gpio_intr_disable, + .mask_ack = ar2315_gpio_intr_disable, + .mask = ar2315_gpio_intr_disable, diff --git a/target/linux/atheros/patches-2.6.30/105-ar2315_pci.patch b/target/linux/atheros/patches-2.6.30/105-ar2315_pci.patch index f5f0956e11..9b76dfee46 100644 --- a/target/linux/atheros/patches-2.6.30/105-ar2315_pci.patch +++ b/target/linux/atheros/patches-2.6.30/105-ar2315_pci.patch @@ -256,7 +256,7 @@ + default y --- a/arch/mips/ar231x/ar2315.c +++ b/arch/mips/ar231x/ar2315.c -@@ -59,6 +59,27 @@ static inline void ar2315_gpio_irq(void) +@@ -63,6 +63,27 @@ static inline void ar2315_gpio_irq(void) do_IRQ(AR531X_GPIO_IRQ_BASE + bit); } @@ -284,7 +284,7 @@ /* * Called when an interrupt is received, this function -@@ -77,6 +98,10 @@ ar2315_irq_dispatch(void) +@@ -81,6 +102,10 @@ ar2315_irq_dispatch(void) do_IRQ(AR2315_IRQ_WLAN0_INTRS); else if (pending & CAUSEF_IP4) do_IRQ(AR2315_IRQ_ENET0_INTRS); diff --git a/target/linux/atheros/patches-2.6.31/100-board.patch b/target/linux/atheros/patches-2.6.31/100-board.patch index be6d64d633..e54a47032e 100644 --- a/target/linux/atheros/patches-2.6.31/100-board.patch +++ b/target/linux/atheros/patches-2.6.31/100-board.patch @@ -2107,7 +2107,7 @@ + --- /dev/null +++ b/arch/mips/ar231x/ar2315.c -@@ -0,0 +1,643 @@ +@@ -0,0 +1,658 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive @@ -2165,6 +2165,10 @@ + if (!pend) + ar231x_write_reg(AR2315_ISR, AR2315_ISR_GPIO); + ++ /* Enable interrupt with edge detection */ ++ if ((ar231x_read_reg(AR2315_GPIO_CR) & AR2315_GPIO_CR_M(bit)) != AR2315_GPIO_CR_I(bit)) ++ return; ++ + if (bit >= 0) + do_IRQ(AR531X_GPIO_IRQ_BASE + bit); +} @@ -2222,14 +2226,24 @@ +{ + unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE; + -+ /* reconfigure GPIO line as input */ -+ ar231x_mask_reg(AR2315_GPIO_CR, AR2315_GPIO_CR_M(gpio), AR2315_GPIO_CR_I(gpio)); -+ + /* Enable interrupt with edge detection */ ++ if ((ar231x_read_reg(AR2315_GPIO_CR) & AR2315_GPIO_CR_M(gpio)) != AR2315_GPIO_CR_I(gpio)) ++ return; ++ + gpiointmask |= (1 << gpio); + ar2315_set_gpiointmask(gpio, 3); +} + ++static unsigned int ar2315_gpio_intr_startup(unsigned int irq) ++{ ++ unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE; ++ ++ /* reconfigure GPIO line as input */ ++ ar231x_mask_reg(AR2315_GPIO_CR, AR2315_GPIO_CR_M(gpio), AR2315_GPIO_CR_I(gpio)); ++ ar2315_gpio_intr_enable(irq); ++ return 0; ++} ++ +static void ar2315_gpio_intr_disable(unsigned int irq) +{ + unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE; @@ -2248,6 +2262,7 @@ + +static struct irq_chip ar2315_gpio_intr_controller = { + .typename = "AR2315-GPIO", ++ .startup = ar2315_gpio_intr_startup, + .ack = ar2315_gpio_intr_disable, + .mask_ack = ar2315_gpio_intr_disable, + .mask = ar2315_gpio_intr_disable, diff --git a/target/linux/atheros/patches-2.6.31/105-ar2315_pci.patch b/target/linux/atheros/patches-2.6.31/105-ar2315_pci.patch index f5f0956e11..9b76dfee46 100644 --- a/target/linux/atheros/patches-2.6.31/105-ar2315_pci.patch +++ b/target/linux/atheros/patches-2.6.31/105-ar2315_pci.patch @@ -256,7 +256,7 @@ + default y --- a/arch/mips/ar231x/ar2315.c +++ b/arch/mips/ar231x/ar2315.c -@@ -59,6 +59,27 @@ static inline void ar2315_gpio_irq(void) +@@ -63,6 +63,27 @@ static inline void ar2315_gpio_irq(void) do_IRQ(AR531X_GPIO_IRQ_BASE + bit); } @@ -284,7 +284,7 @@ /* * Called when an interrupt is received, this function -@@ -77,6 +98,10 @@ ar2315_irq_dispatch(void) +@@ -81,6 +102,10 @@ ar2315_irq_dispatch(void) do_IRQ(AR2315_IRQ_WLAN0_INTRS); else if (pending & CAUSEF_IP4) do_IRQ(AR2315_IRQ_ENET0_INTRS); -- 2.30.2