Re: [PATCH] twl4030: Fix pwrirq by making sure the module is responding (Re: kernel oops for 3430sdp)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux