Просмотр исходного кода

atheros: leave the gpio interrupts alone when user space changes the gpio input settings, fixes #4493

SVN-Revision: 18036
Felix Fietkau 16 лет назад
Родитель
Сommit
9ae6129829

+ 19 - 4
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,

+ 2 - 2
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);

+ 19 - 4
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,

+ 2 - 2
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);