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