On Wednesday 08 October 2008, Tony Lindgren wrote:
> I suspect that twl is not yet initialized for pwrirq handling at this
> point. At least this patch seems to help, 

Did you verify that the value you read isn't 0xff?  Or does the
issue seem to be the mere attempt to read a register?

I have a hard time seeing the root cause be anything other than
problems in i2c-omap, since the timeouts appear at various other
places too.


> no idea on what registers 
> we should check though.. Anybody got ideas on what needs to be checked
> for pwrirq?

Well, there does seem to be an issue where the "pending IRQ" mechanism
can leave a PWRIRQ.PWRON interrupt pending sometimes.  If you see a
bunch of alarming-but-harmless boot messages like 

  TWL4030 module irq 373 is disabled but can't be masked!

before pwrirq registers, that seems to be the issue.  A debug hack I
applied (appended) reported that the mask (IMR) was 0xff but the IRQ
was still being raised ... when pwrirq registered itself, the stream
of those messages stopped.  (Or, when this hack dumped the status and
thus kicked in clear-on-read ...)

- Dave


=============================
---
 drivers/mfd/twl4030-core.c |   40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

--- a/drivers/mfd/twl4030-core.c
+++ b/drivers/mfd/twl4030-core.c
@@ -574,6 +574,36 @@ static int twl4030_irq_thread(void *data
                        continue;
                }
 
+               /* power irq before handler registered? */
+               if ((pih_isr & BIT(5)) && irq_desc[twl4030_irq_base + 5].depth) 
{
+                       u8 buf[8];
+                       int status;
+                       int retries = 3;
+
+                       while (retries--) {
+                               status = twl4030_i2c_read(TWL4030_MODULE_INT,
+                                               buf, 0, sizeof buf);
+                               if (status == 0) {
+                                       pr_crit("... PWR: "
+                                               "%02x.%02x/%02x.%02x "
+                                               "%02x; "
+                                               "%02x.%02x, "
+                                               "%02x "
+                                               "\n",
+                                               /* {ISR,IMR}{1,2} */
+                                               buf[0], buf[1], buf[2], buf[3],
+                                               /* SIH */
+                                               buf[4],
+                                               /* EDR */
+                                               buf[5], buf[6],
+                                               /* CTRL */
+                                               buf[7]);
+                               } else
+                                       pr_crit("... read PWR --> %d\n",
+                                               status);
+                       }
+               }
+
                /* these handlers deal with the relevant SIH irq status */
                local_irq_disable();
                for (module_irq = twl4030_irq_base;

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to