Title: [4207] branches/2007R1/arch/blackfin/mach-common: [#2424]
Revision
4207
Author
hennerich
Date
2008-02-01 04:00:45 -0600 (Fri, 01 Feb 2008)

Log Message

[#2424]
-Fix spurious GPIO Interrupt that maybe latched during set irq_type for
edge triggered interrupts  

Diffstat

 ints-priority-dc.c |   38 ++++++++++++++++++++------------------
 ints-priority-sc.c |   33 ++++++++++++++++++---------------
 2 files changed, 38 insertions(+), 33 deletions(-)

Modified Paths

Diff

Modified: branches/2007R1/arch/blackfin/mach-common/ints-priority-dc.c (4206 => 4207)


--- branches/2007R1/arch/blackfin/mach-common/ints-priority-dc.c	2008-02-01 09:48:37 UTC (rev 4206)
+++ branches/2007R1/arch/blackfin/mach-common/ints-priority-dc.c	2008-02-01 10:00:45 UTC (rev 4207)
@@ -245,12 +245,12 @@
 	u16 gpionr = irq - IRQ_PF0;
 
 	if (!(gpio_enabled[gpio_bank(gpionr)] & gpio_bit(gpionr))) {
-			
+
 		ret = gpio_request(gpionr, NULL);
 		if(ret)
 			return ret;
 
-	}		
+	}
 
 	gpio_enabled[gpio_bank(gpionr)] |= gpio_bit(gpionr);
 	bf561_gpio_unmask_irq(irq);
@@ -285,7 +285,7 @@
 			    IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
 
 		if (!(gpio_enabled[gpio_bank(gpionr)] & gpio_bit(gpionr))) {
-			
+
 			ret = gpio_request(gpionr, NULL);
 			if(ret)
 				return ret;
@@ -295,22 +295,12 @@
 			gpio_enabled[gpio_bank(gpionr)] |= gpio_bit(gpionr);
 		} else {
 			gpio_enabled[gpio_bank(gpionr)] &= ~gpio_bit(gpionr);
-			return 0;		
+			return 0;
 		}
 
-
+		set_gpio_inen(gpionr, 0);
 		set_gpio_dir(gpionr, 0);
-		set_gpio_inen(gpionr, 1);
 
-
-		if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
-			gpio_edge_triggered[gpio_bank(gpionr)] |= gpio_bit(gpionr);
-			set_gpio_edge(gpionr, 1);
-		} else {
-			set_gpio_edge(gpionr, 0);
-			gpio_edge_triggered[gpio_bank(gpionr)] &= ~gpio_bit(gpionr);
-		}
-
 		if ((type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING))
 		    == (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING))
 			set_gpio_both(gpionr, 1);
@@ -322,8 +312,20 @@
 		else
 			set_gpio_polar(gpionr, 0);	/* high or rising edge denoted by zero */
 
-	SSYNC();
+		if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
+			set_gpio_edge(gpionr, 1);
+			set_gpio_inen(gpionr, 1);
+			gpio_edge_triggered[gpio_bank(gpionr)] |= gpio_bit(gpionr);
+			set_gpio_data(gpionr, 0);
 
+		} else {
+			set_gpio_edge(gpionr, 0);
+			gpio_edge_triggered[gpio_bank(gpionr)] &= ~gpio_bit(gpionr);
+			set_gpio_inen(gpionr, 1);
+		}
+
+		SSYNC();
+
 	if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING))
 		set_irq_handler(irq, handle_edge_irq);
 	else
@@ -463,8 +465,8 @@
 	    IMASK_IVG14 | IMASK_IVG13 | IMASK_IVG12 | IMASK_IVG11 |
 	    IMASK_IVG10 | IMASK_IVG9 | IMASK_IVG8 | IMASK_IVG7 | IMASK_IVGHW;
 
-	bfin_write_SICA_IWR0(IWR_ENABLE_ALL);  
-	bfin_write_SICA_IWR1(IWR_ENABLE_ALL);  
+	bfin_write_SICA_IWR0(IWR_ENABLE_ALL);
+	bfin_write_SICA_IWR1(IWR_ENABLE_ALL);
 
 	return 0;
 }

Modified: branches/2007R1/arch/blackfin/mach-common/ints-priority-sc.c (4206 => 4207)


--- branches/2007R1/arch/blackfin/mach-common/ints-priority-sc.c	2008-02-01 09:48:37 UTC (rev 4206)
+++ branches/2007R1/arch/blackfin/mach-common/ints-priority-sc.c	2008-02-01 10:00:45 UTC (rev 4207)
@@ -353,12 +353,12 @@
 	u16 gpionr = irq - IRQ_PF0;
 
 	if (!(gpio_enabled[gpio_bank(gpionr)] & gpio_bit(gpionr))) {
-			
+
 		ret = gpio_request(gpionr, NULL);
 		if(ret)
 			return ret;
 
-	}		
+	}
 
 	gpio_enabled[gpio_bank(gpionr)] |= gpio_bit(gpionr);
 	bfin_gpio_unmask_irq(irq);
@@ -392,7 +392,7 @@
 			    IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
 
 		if (!(gpio_enabled[gpio_bank(gpionr)] & gpio_bit(gpionr))) {
-			
+
 			ret = gpio_request(gpionr, NULL);
 			if(ret)
 				return ret;
@@ -402,22 +402,13 @@
 			gpio_enabled[gpio_bank(gpionr)] |= gpio_bit(gpionr);
 		} else {
 			gpio_enabled[gpio_bank(gpionr)] &= ~gpio_bit(gpionr);
-			return 0;		
+			return 0;
 		}
 
 
+		set_gpio_inen(gpionr, 0);
 		set_gpio_dir(gpionr, 0);
-		set_gpio_inen(gpionr, 1);
 
-
-		if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
-			gpio_edge_triggered[gpio_bank(gpionr)] |= gpio_bit(gpionr);
-			set_gpio_edge(gpionr, 1);
-		} else {
-			set_gpio_edge(gpionr, 0);
-			gpio_edge_triggered[gpio_bank(gpionr)] &= ~gpio_bit(gpionr);
-		}
-
 		if ((type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING))
 		    == (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING))
 			set_gpio_both(gpionr, 1);
@@ -429,8 +420,20 @@
 		else
 			set_gpio_polar(gpionr, 0);	/* high or rising edge denoted by zero */
 
-	SSYNC();
+		if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
+			set_gpio_edge(gpionr, 1);
+			set_gpio_inen(gpionr, 1);
+			gpio_edge_triggered[gpio_bank(gpionr)] |= gpio_bit(gpionr);
+			set_gpio_data(gpionr, 0);
 
+		} else {
+			set_gpio_edge(gpionr, 0);
+			gpio_edge_triggered[gpio_bank(gpionr)] &= ~gpio_bit(gpionr);
+			set_gpio_inen(gpionr, 1);
+		}
+
+		SSYNC();
+
 	if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING))
 		set_irq_handler(irq, handle_edge_irq);
 	else
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
http://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to