72 lines
2.0 KiB
Diff
72 lines
2.0 KiB
Diff
TWL4030: clear TWL GPIO interrupt status registers
|
|
|
|
From: Paul Walmsley <paul@pwsan.com>
|
|
|
|
twl_init_irq() does not clear the TWL GPIO ISR registers, but the PIH
|
|
ISR thinks that it has. This causes any previously-latched GPIO interrupts
|
|
to be stuck on until twl4030-gpio.c initializes, often drowning the console in
|
|
|
|
TWL4030 module irq 368 is disabled but can't be masked!
|
|
|
|
messages. This seems to be a particular problem when booting on Beagle.
|
|
|
|
Signed-off-by: Paul Walmsley <paul@pwsan.com>
|
|
---
|
|
|
|
drivers/i2c/chips/twl4030-core.c | 42 ++++++++++++++++++++++++++++++++++++++
|
|
1 files changed, 42 insertions(+), 0 deletions(-)
|
|
|
|
diff --git a/drivers/i2c/chips/twl4030-core.c b/drivers/i2c/chips/twl4030-core.c
|
|
index ff662bc..dfc3805 100644
|
|
--- a/drivers/i2c/chips/twl4030-core.c
|
|
+++ b/drivers/i2c/chips/twl4030-core.c
|
|
@@ -857,6 +857,48 @@ static void twl_init_irq(void)
|
|
return;
|
|
}
|
|
|
|
+ /* GPIO_ISR1A */
|
|
+ res = twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0xff, 0x19);
|
|
+ if (res < 0) {
|
|
+ pr_err("%s[%d][%d]\n", msg, res, __LINE__);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /* GPIO_ISR2A */
|
|
+ res = twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0xff, 0x1a);
|
|
+ if (res < 0) {
|
|
+ pr_err("%s[%d][%d]\n", msg, res, __LINE__);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /* GPIO_ISR3A */
|
|
+ res = twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0xff, 0x1b);
|
|
+ if (res < 0) {
|
|
+ pr_err("%s[%d][%d]\n", msg, res, __LINE__);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /* GPIO_ISR1B */
|
|
+ res = twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0xff, 0x1f);
|
|
+ if (res < 0) {
|
|
+ pr_err("%s[%d][%d]\n", msg, res, __LINE__);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /* GPIO_ISR2B */
|
|
+ res = twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0xff, 0x20);
|
|
+ if (res < 0) {
|
|
+ pr_err("%s[%d][%d]\n", msg, res, __LINE__);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /* GPIO_ISR3B */
|
|
+ res = twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0xff, 0x21);
|
|
+ if (res < 0) {
|
|
+ pr_err("%s[%d][%d]\n", msg, res, __LINE__);
|
|
+ return;
|
|
+ }
|
|
+
|
|
/* install an irq handler for each of the PIH modules */
|
|
for (i = TWL4030_IRQ_BASE; i < TWL4030_IRQ_END; i++) {
|
|
set_irq_chip(i, &twl4030_irq_chip);
|