diff options
author | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-06-04 19:45:23 +0800 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-06-04 19:45:23 +0800 |
commit | a05c58e73b23211d7b8d4ea31a0519ea41d4ec3c (patch) | |
tree | b3aa7890aba1877b417e900994126bb0a6e2f359 /drivers/mfd/stmpe.c | |
parent | 9ce0109275e82697ada4b005325e663ba72c3181 (diff) | |
parent | f0bfbaaec3d8dfb06790c59bc5d6c848f0bbd5f8 (diff) |
Merge topic branch 'core' into integration-linux-ux500
Diffstat (limited to 'drivers/mfd/stmpe.c')
-rw-r--r-- | drivers/mfd/stmpe.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c index 2dd8d49cb30..6b8f9417c00 100644 --- a/drivers/mfd/stmpe.c +++ b/drivers/mfd/stmpe.c @@ -772,7 +772,7 @@ static irqreturn_t stmpe_irq(int irq, void *data) ret = stmpe_block_read(stmpe, israddr, num, isr); if (ret < 0) return IRQ_NONE; - +back: for (i = 0; i < num; i++) { int bank = num - i - 1; u8 status = isr[i]; @@ -794,6 +794,22 @@ static irqreturn_t stmpe_irq(int irq, void *data) stmpe_reg_write(stmpe, israddr + i, clear); } + /* + It may happen that on the first status read interrupt + sources may not showup, so read one more time. + */ + ret = stmpe_block_read(stmpe, israddr, num, isr); + if (ret >= 0) { + for (i = 0; i < num; i++) { + int bank = num - i - 1; + u8 status = isr[i]; + + status &= stmpe->ier[bank]; + if (status) + goto back; + } + } + return IRQ_HANDLED; } |