* RE: [PATCH] twl4030 reboot workaround
2010-07-28 9:41 ` [PATCH] twl4030 reboot workaround Mikko Rapeli
@ 2010-07-28 10:07 ` Gopinath, Thara
2010-07-29 6:07 ` Mikko Rapeli
2010-07-28 10:18 ` Peter 'p2' De Schrijver
2010-07-28 15:47 ` Mike Turquette
2 siblings, 1 reply; 18+ messages in thread
From: Gopinath, Thara @ 2010-07-28 10:07 UTC (permalink / raw)
To: Mikko Rapeli, linux-omap@vger.kernel.org
Cc: Turquette, Mike, sameo@linux.intel.com
>>-----Original Message-----
>>From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-owner@vger.kernel.org] On Behalf Of Mikko
>>Rapeli
>>Sent: Wednesday, July 28, 2010 3:12 PM
>>To: linux-omap@vger.kernel.org
>>Cc: Turquette, Mike; sameo@linux.intel.com
>>Subject: [PATCH] twl4030 reboot workaround
>>
>>From: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
>>
>>Original patch: http://marc.info/?l=linux-omap&m=126522625032441&w=2
>>
>>"Removes TWL4030 sleep script prior to rebooting, only on OMAP3. This is
>>necessary since DPLL3 reset causes SYS_OFFMODE pin to go low, resulting
>>in the sleep script being executed on TWL4030. This usually results in
>>VDD1 & VDD2 voltage collapse while ROM code is executing, followed by an
>>MPU Watch Dog reset or worse, an irrecoverable hang."
>>
>>Original patch resulted in a crash due to sleeping i2c calls late in the
>>reboot sequence. Here's how to trigger the crash:
>>
>> # cat /dev/urandom > /foo &
>> sync();
>> reboot(LINUX_REBOOT_CMD_RESTART2);
>>
>>Kernel trace from 2.6.32:
>>
>>Unable to handle kernel NULL pointer dereference at virtual address 00000000
>>pgd = c0004000
>>[00000000] *pgd=00000000
>>Internal error: Oops: 805 [#2] PREEMPT
>>...
>>[<c00b3210>] (exit_mmap+0x1d4/0x1f8) from [<c006069c>] (mmput+0x34/0x110)
>>[<c006069c>] (mmput+0x34/0x110) from [<c0064a90>] (exit_mm+0x140/0x180)
>>[<c0064a90>] (exit_mm+0x140/0x180) from [<c00668ec>] (do_exit+0x5d8/0x6ac)
>>[<c00668ec>] (do_exit+0x5d8/0x6ac) from [<c0035858>] (die+0x2d4/0x2e0)
>>[<c0035858>] (die+0x2d4/0x2e0) from [<c0035904>] (baddataabort+0x0/0x50)
>>[<c0035904>] (baddataabort+0x0/0x50) from [<c0274ff4>] (i2c_transfer+0xec/0x104)
>>[<c0274ff4>] (i2c_transfer+0xec/0x104) from [<00000001>] (0x1)
>>
>>Fix is to move reboot preparations into a reboot notifier.
>>
>>Signed-off-by: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
>>---
>> drivers/mfd/twl4030-power.c | 29 +++++++++++++++++++++++++++++
>> 1 files changed, 29 insertions(+), 0 deletions(-)
>>
>>diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c
>>index 7efa878..5d46768 100644
>>--- a/drivers/mfd/twl4030-power.c
>>+++ b/drivers/mfd/twl4030-power.c
>>@@ -28,6 +28,7 @@
>> #include <linux/pm.h>
>> #include <linux/i2c/twl.h>
>> #include <linux/platform_device.h>
>>+#include <linux/reboot.h>
>>
>> #include <asm/mach-types.h>
>>
>>@@ -127,6 +128,29 @@ static u8 res_config_addrs[] = {
>> [RES_Main_Ref] = 0x94,
>> };
>>
>>+/*
>>+ * PRCM on OMAP3 will drive SYS_OFFMODE low during DPLL3 warm reset.
>>+ * This causes Gaia sleep script to execute, usually killing VDD1 and
>>+ * VDD2 while code is running. WA is to disable the sleep script
>>+ * before warm reset.
>>+ */
>>+static int twl4030_prepare_for_reboot(struct notifier_block *this,
>>+ unsigned long cmd, void *p)
>>+{
>>+ int err;
Minor nit. Insert a blank line.
Regards
Thara
>>+ err = twl4030_remove_script(TWL4030_SLEEP_SCRIPT);
>>+ if (err)
>>+ pr_err("TWL4030: error trying to disable sleep script!\n");
>>+
>>+ return NOTIFY_DONE;
>>+}
>>+
>>+static struct notifier_block twl4030_reboot_notifier = {
>>+ .notifier_call = twl4030_prepare_for_reboot,
>>+ .next = NULL,
>>+ .priority = 0
>>+};
>>+
>> static int __init twl4030_write_script_byte(u8 address, u8 byte)
>> {
>> int err;
>>@@ -549,6 +573,11 @@ void __init twl4030_power_init(struct twl4030_power_data *twl4030_scripts)
>> err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0, R_PROTECT_KEY);
>> if (err)
>> pr_err("TWL4030 Unable to relock registers\n");
>>+
>>+ err = register_reboot_notifier(&twl4030_reboot_notifier);
>>+ if (err)
>>+ pr_err("TWL4030 Failed to register reboot notifier\n");
>>+
>> return;
>>
>> unlock:
>>--
>>1.5.6.5
>>
>>--
>>To unsubscribe from this list: send the line "unsubscribe linux-omap" in
>>the body of a message to majordomo@vger.kernel.org
>>More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH] twl4030 reboot workaround
2010-07-28 10:07 ` Gopinath, Thara
@ 2010-07-29 6:07 ` Mikko Rapeli
0 siblings, 0 replies; 18+ messages in thread
From: Mikko Rapeli @ 2010-07-29 6:07 UTC (permalink / raw)
To: ext Gopinath, Thara
Cc: linux-omap@vger.kernel.org, Turquette, Mike,
sameo@linux.intel.com
On Wed, Jul 28, 2010 at 12:07:32PM +0200, ext Gopinath, Thara wrote:
> Minor nit. Insert a blank line.
Thanks, will send a new version.
-Mikko
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] twl4030 reboot workaround
2010-07-28 9:41 ` [PATCH] twl4030 reboot workaround Mikko Rapeli
2010-07-28 10:07 ` Gopinath, Thara
@ 2010-07-28 10:18 ` Peter 'p2' De Schrijver
2010-07-29 6:06 ` Mikko Rapeli
2010-07-28 15:47 ` Mike Turquette
2 siblings, 1 reply; 18+ messages in thread
From: Peter 'p2' De Schrijver @ 2010-07-28 10:18 UTC (permalink / raw)
To: Rapeli Mikko (EXT-Ixonos/Oulu)
Cc: linux-omap@vger.kernel.org, mturquette@ti.com,
sameo@linux.intel.com
On Wed, Jul 28, 2010 at 11:41:32AM +0200, Rapeli Mikko (EXT-Ixonos/Oulu) wrote:
> From: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
>
> Original patch: http://marc.info/?l=linux-omap&m=126522625032441&w=2
>
> "Removes TWL4030 sleep script prior to rebooting, only on OMAP3. This is
> necessary since DPLL3 reset causes SYS_OFFMODE pin to go low, resulting
> in the sleep script being executed on TWL4030. This usually results in
> VDD1 & VDD2 voltage collapse while ROM code is executing, followed by an
> MPU Watch Dog reset or worse, an irrecoverable hang."
>
> Original patch resulted in a crash due to sleeping i2c calls late in the
> reboot sequence. Here's how to trigger the crash:
>
> # cat /dev/urandom > /foo &
> sync();
> reboot(LINUX_REBOOT_CMD_RESTART2);
>
> Kernel trace from 2.6.32:
>
> Unable to handle kernel NULL pointer dereference at virtual address 00000000
> pgd = c0004000
> [00000000] *pgd=00000000
> Internal error: Oops: 805 [#2] PREEMPT
> ...
> [<c00b3210>] (exit_mmap+0x1d4/0x1f8) from [<c006069c>] (mmput+0x34/0x110)
> [<c006069c>] (mmput+0x34/0x110) from [<c0064a90>] (exit_mm+0x140/0x180)
> [<c0064a90>] (exit_mm+0x140/0x180) from [<c00668ec>] (do_exit+0x5d8/0x6ac)
> [<c00668ec>] (do_exit+0x5d8/0x6ac) from [<c0035858>] (die+0x2d4/0x2e0)
> [<c0035858>] (die+0x2d4/0x2e0) from [<c0035904>] (baddataabort+0x0/0x50)
> [<c0035904>] (baddataabort+0x0/0x50) from [<c0274ff4>] (i2c_transfer+0xec/0x104)
> [<c0274ff4>] (i2c_transfer+0xec/0x104) from [<00000001>] (0x1)
>
> Fix is to move reboot preparations into a reboot notifier.
>
And what if we get an OMAP3 watchdog reset ? In this case there is no
software to remove the script...
Cheers,
Peter.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] twl4030 reboot workaround
2010-07-28 10:18 ` Peter 'p2' De Schrijver
@ 2010-07-29 6:06 ` Mikko Rapeli
0 siblings, 0 replies; 18+ messages in thread
From: Mikko Rapeli @ 2010-07-29 6:06 UTC (permalink / raw)
To: De-Schrijver Peter (Nokia-MS/Helsinki)
Cc: linux-omap@vger.kernel.org, mturquette@ti.com,
sameo@linux.intel.com
On Wed, Jul 28, 2010 at 12:18:11PM +0200, De-Schrijver Peter
(Nokia-MS/Helsinki) wrote:
> On Wed, Jul 28, 2010 at 11:41:32AM +0200, Rapeli Mikko (EXT-Ixonos/Oulu)
> wrote:
> > From: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
> >
> > Original patch: http://marc.info/?l=linux-omap&m=126522625032441&w=2
> >
> > "Removes TWL4030 sleep script prior to rebooting, only on OMAP3. This is
> > necessary since DPLL3 reset causes SYS_OFFMODE pin to go low, resulting
> > in the sleep script being executed on TWL4030. This usually results in
> > VDD1 & VDD2 voltage collapse while ROM code is executing, followed by an
> > MPU Watch Dog reset or worse, an irrecoverable hang."
> >
> > Original patch resulted in a crash due to sleeping i2c calls late in the
> > reboot sequence. Here's how to trigger the crash:
> >
> > # cat /dev/urandom > /foo &
> > sync();
> > reboot(LINUX_REBOOT_CMD_RESTART2);
> >
> > Kernel trace from 2.6.32:
> >
> > Unable to handle kernel NULL pointer dereference at virtual address 00000000
> > pgd = c0004000
> > [00000000] *pgd=00000000
> > Internal error: Oops: 805 [#2] PREEMPT
> > ...
> > [<c00b3210>] (exit_mmap+0x1d4/0x1f8) from [<c006069c>] (mmput+0x34/0x110)
> > [<c006069c>] (mmput+0x34/0x110) from [<c0064a90>] (exit_mm+0x140/0x180)
> > [<c0064a90>] (exit_mm+0x140/0x180) from [<c00668ec>] (do_exit+0x5d8/0x6ac)
> > [<c00668ec>] (do_exit+0x5d8/0x6ac) from [<c0035858>] (die+0x2d4/0x2e0)
> > [<c0035858>] (die+0x2d4/0x2e0) from [<c0035904>] (baddataabort+0x0/0x50)
> > [<c0035904>] (baddataabort+0x0/0x50) from [<c0274ff4>] (i2c_transfer+0xec/0x104)
> > [<c0274ff4>] (i2c_transfer+0xec/0x104) from [<00000001>] (0x1)
> >
> > Fix is to move reboot preparations into a reboot notifier.
> >
>
> And what if we get an OMAP3 watchdog reset ? In this case there is no
> software to remove the script...
Well, I don't know. We have seen boot and reboot failures and this
remove script patch set has helped to reduce those failures.
-Mikko
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] twl4030 reboot workaround
2010-07-28 9:41 ` [PATCH] twl4030 reboot workaround Mikko Rapeli
2010-07-28 10:07 ` Gopinath, Thara
2010-07-28 10:18 ` Peter 'p2' De Schrijver
@ 2010-07-28 15:47 ` Mike Turquette
2010-07-29 6:16 ` Mikko Rapeli
2 siblings, 1 reply; 18+ messages in thread
From: Mike Turquette @ 2010-07-28 15:47 UTC (permalink / raw)
To: Mikko Rapeli; +Cc: linux-omap@vger.kernel.org, sameo@linux.intel.com
Mikko Rapeli wrote:
> From: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
>
> Original patch: http://marc.info/?l=linux-omap&m=126522625032441&w=2
I forgot about this one...
> "Removes TWL4030 sleep script prior to rebooting, only on OMAP3. This is
> necessary since DPLL3 reset causes SYS_OFFMODE pin to go low, resulting
> in the sleep script being executed on TWL4030. This usually results in
> VDD1 & VDD2 voltage collapse while ROM code is executing, followed by an
> MPU Watch Dog reset or worse, an irrecoverable hang."
>
> Original patch resulted in a crash due to sleeping i2c calls late in the
> reboot sequence. Here's how to trigger the crash:
>
> # cat /dev/urandom > /foo &
> sync();
> reboot(LINUX_REBOOT_CMD_RESTART2);
>
> Kernel trace from 2.6.32:
>
> Unable to handle kernel NULL pointer dereference at virtual address 00000000
> pgd = c0004000
> [00000000] *pgd=00000000
> Internal error: Oops: 805 [#2] PREEMPT
> ...
> [<c00b3210>] (exit_mmap+0x1d4/0x1f8) from [<c006069c>] (mmput+0x34/0x110)
> [<c006069c>] (mmput+0x34/0x110) from [<c0064a90>] (exit_mm+0x140/0x180)
> [<c0064a90>] (exit_mm+0x140/0x180) from [<c00668ec>] (do_exit+0x5d8/0x6ac)
> [<c00668ec>] (do_exit+0x5d8/0x6ac) from [<c0035858>] (die+0x2d4/0x2e0)
> [<c0035858>] (die+0x2d4/0x2e0) from [<c0035904>] (baddataabort+0x0/0x50)
> [<c0035904>] (baddataabort+0x0/0x50) from [<c0274ff4>] (i2c_transfer+0xec/0x104)
> [<c0274ff4>] (i2c_transfer+0xec/0x104) from [<00000001>] (0x1)
>
> Fix is to move reboot preparations into a reboot notifier.
>
> Signed-off-by: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
> ---
> drivers/mfd/twl4030-power.c | 29 +++++++++++++++++++++++++++++
> 1 files changed, 29 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c
> index 7efa878..5d46768 100644
> --- a/drivers/mfd/twl4030-power.c
> +++ b/drivers/mfd/twl4030-power.c
> @@ -28,6 +28,7 @@
> #include <linux/pm.h>
> #include <linux/i2c/twl.h>
> #include <linux/platform_device.h>
> +#include <linux/reboot.h>
>
> #include <asm/mach-types.h>
>
> @@ -127,6 +128,29 @@ static u8 res_config_addrs[] = {
> [RES_Main_Ref] = 0x94,
> };
>
> +/*
> + * PRCM on OMAP3 will drive SYS_OFFMODE low during DPLL3 warm reset.
> + * This causes Gaia sleep script to execute, usually killing VDD1 and
> + * VDD2 while code is running. WA is to disable the sleep script
> + * before warm reset.
> + */
> +static int twl4030_prepare_for_reboot(struct notifier_block *this,
> + unsigned long cmd, void *p)
> +{
> + int err;
> + err = twl4030_remove_script(TWL4030_SLEEP_SCRIPT);
> + if (err)
> + pr_err("TWL4030: error trying to disable sleep script!\n");
> +
> + return NOTIFY_DONE;
> +}
> +
> +static struct notifier_block twl4030_reboot_notifier = {
> + .notifier_call = twl4030_prepare_for_reboot,
> + .next = NULL,
> + .priority = 0
> +};
> +
> static int __init twl4030_write_script_byte(u8 address, u8 byte)
> {
> int err;
> @@ -549,6 +573,11 @@ void __init twl4030_power_init(struct twl4030_power_data *twl4030_scripts)
> err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0, R_PROTECT_KEY);
> if (err)
> pr_err("TWL4030 Unable to relock registers\n");
> +
> + err = register_reboot_notifier(&twl4030_reboot_notifier);
This method is much better than the method I proposed before. Taking
into account the comments from others, ACK.
Mike
> + if (err)
> + pr_err("TWL4030 Failed to register reboot notifier\n");
> +
> return;
>
> unlock:
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH] twl4030 reboot workaround
2010-07-28 15:47 ` Mike Turquette
@ 2010-07-29 6:16 ` Mikko Rapeli
2010-07-29 6:41 ` [PATCH v2] " Mikko Rapeli
0 siblings, 1 reply; 18+ messages in thread
From: Mikko Rapeli @ 2010-07-29 6:16 UTC (permalink / raw)
To: ext Mike Turquette; +Cc: linux-omap@vger.kernel.org, sameo@linux.intel.com
On Wed, Jul 28, 2010 at 05:47:36PM +0200, ext Mike Turquette wrote:
> This method is much better than the method I proposed before. Taking
> into account the comments from others, ACK.
Thanks, I'll send an updated version with that one new line. Do you have
an idea how the watchdog reset case should be handled? Can the boot loader do
something about this or must the script removal be done before reboot?
-Mikko
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2] twl4030 reboot workaround
2010-07-29 6:16 ` Mikko Rapeli
@ 2010-07-29 6:41 ` Mikko Rapeli
2010-07-29 19:10 ` Mike Rapoport
0 siblings, 1 reply; 18+ messages in thread
From: Mikko Rapeli @ 2010-07-29 6:41 UTC (permalink / raw)
To: linux-omap; +Cc: mturquette, sameo
From: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
Original patch: http://marc.info/?l=linux-omap&m=126522625032441&w=2
"Removes TWL4030 sleep script prior to rebooting, only on OMAP3. This is
necessary since DPLL3 reset causes SYS_OFFMODE pin to go low, resulting
in the sleep script being executed on TWL4030. This usually results in
VDD1 & VDD2 voltage collapse while ROM code is executing, followed by an
MPU Watch Dog reset or worse, an irrecoverable hang."
Original patch resulted in a crash due to sleeping i2c calls late in the
reboot sequence. Here's how to trigger the crash:
# cat /dev/urandom > /foo &
sync();
reboot(LINUX_REBOOT_CMD_RESTART2);
Kernel trace from 2.6.32:
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c0004000
[00000000] *pgd=00000000
Internal error: Oops: 805 [#2] PREEMPT
...
[<c00b3210>] (exit_mmap+0x1d4/0x1f8) from [<c006069c>] (mmput+0x34/0x110)
[<c006069c>] (mmput+0x34/0x110) from [<c0064a90>] (exit_mm+0x140/0x180)
[<c0064a90>] (exit_mm+0x140/0x180) from [<c00668ec>] (do_exit+0x5d8/0x6ac)
[<c00668ec>] (do_exit+0x5d8/0x6ac) from [<c0035858>] (die+0x2d4/0x2e0)
[<c0035858>] (die+0x2d4/0x2e0) from [<c0035904>] (baddataabort+0x0/0x50)
[<c0035904>] (baddataabort+0x0/0x50) from [<c0274ff4>] (i2c_transfer+0xec/0x104)
[<c0274ff4>] (i2c_transfer+0xec/0x104) from [<00000001>] (0x1)
Fix is to move reboot preparations into a reboot notifier.
Signed-off-by: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
Acked-by: Mike Turquette <mturquette@ti.com>
---
v2: added a new line after variable declarations
v1: http://marc.info/?l=linux-omap&m=128031011323970&w=2
drivers/mfd/twl4030-power.c | 30 ++++++++++++++++++++++++++++++
1 files changed, 30 insertions(+), 0 deletions(-)
diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c
index 7efa878..5c6da1e 100644
--- a/drivers/mfd/twl4030-power.c
+++ b/drivers/mfd/twl4030-power.c
@@ -28,6 +28,7 @@
#include <linux/pm.h>
#include <linux/i2c/twl.h>
#include <linux/platform_device.h>
+#include <linux/reboot.h>
#include <asm/mach-types.h>
@@ -127,6 +128,30 @@ static u8 res_config_addrs[] = {
[RES_Main_Ref] = 0x94,
};
+/*
+ * PRCM on OMAP3 will drive SYS_OFFMODE low during DPLL3 warm reset.
+ * This causes Gaia sleep script to execute, usually killing VDD1 and
+ * VDD2 while code is running. WA is to disable the sleep script
+ * before warm reset.
+ */
+static int twl4030_prepare_for_reboot(struct notifier_block *this,
+ unsigned long cmd, void *p)
+{
+ int err;
+
+ err = twl4030_remove_script(TWL4030_SLEEP_SCRIPT);
+ if (err)
+ pr_err("TWL4030: error trying to disable sleep script!\n");
+
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block twl4030_reboot_notifier = {
+ .notifier_call = twl4030_prepare_for_reboot,
+ .next = NULL,
+ .priority = 0
+};
+
static int __init twl4030_write_script_byte(u8 address, u8 byte)
{
int err;
@@ -549,6 +574,11 @@ void __init twl4030_power_init(struct twl4030_power_data *twl4030_scripts)
err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0, R_PROTECT_KEY);
if (err)
pr_err("TWL4030 Unable to relock registers\n");
+
+ err = register_reboot_notifier(&twl4030_reboot_notifier);
+ if (err)
+ pr_err("TWL4030 Failed to register reboot notifier\n");
+
return;
unlock:
--
1.5.6.5
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH v2] twl4030 reboot workaround
2010-07-29 6:41 ` [PATCH v2] " Mikko Rapeli
@ 2010-07-29 19:10 ` Mike Rapoport
2010-07-30 5:48 ` Mikko Rapeli
2010-07-30 6:35 ` Gopinath, Thara
0 siblings, 2 replies; 18+ messages in thread
From: Mike Rapoport @ 2010-07-29 19:10 UTC (permalink / raw)
To: Mikko Rapeli; +Cc: linux-omap, mturquette, sameo
Hi
On Thu, Jul 29, 2010 at 9:41 AM, Mikko Rapeli
<ext-mikko.rapeli@nokia.com> wrote:
> From: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
>
> Original patch: http://marc.info/?l=linux-omap&m=126522625032441&w=2
>
> "Removes TWL4030 sleep script prior to rebooting, only on OMAP3. This is
> necessary since DPLL3 reset causes SYS_OFFMODE pin to go low, resulting
> in the sleep script being executed on TWL4030. This usually results in
> VDD1 & VDD2 voltage collapse while ROM code is executing, followed by an
> MPU Watch Dog reset or worse, an irrecoverable hang."
I had a similar issue when my system hanged on hard reset when there
was a TWL sleep script installed.
The workaround I've found was to install the sleep script immediately
before entering the suspend state and remove the script on the resume
path.
If you think that such approach is appropriate I can send a patch.
> Original patch resulted in a crash due to sleeping i2c calls late in the
> reboot sequence. Here's how to trigger the crash:
>
> # cat /dev/urandom > /foo &
> sync();
> reboot(LINUX_REBOOT_CMD_RESTART2);
>
> Kernel trace from 2.6.32:
>
> Unable to handle kernel NULL pointer dereference at virtual address 00000000
> pgd = c0004000
> [00000000] *pgd=00000000
> Internal error: Oops: 805 [#2] PREEMPT
> ...
> [<c00b3210>] (exit_mmap+0x1d4/0x1f8) from [<c006069c>] (mmput+0x34/0x110)
> [<c006069c>] (mmput+0x34/0x110) from [<c0064a90>] (exit_mm+0x140/0x180)
> [<c0064a90>] (exit_mm+0x140/0x180) from [<c00668ec>] (do_exit+0x5d8/0x6ac)
> [<c00668ec>] (do_exit+0x5d8/0x6ac) from [<c0035858>] (die+0x2d4/0x2e0)
> [<c0035858>] (die+0x2d4/0x2e0) from [<c0035904>] (baddataabort+0x0/0x50)
> [<c0035904>] (baddataabort+0x0/0x50) from [<c0274ff4>] (i2c_transfer+0xec/0x104)
> [<c0274ff4>] (i2c_transfer+0xec/0x104) from [<00000001>] (0x1)
>
> Fix is to move reboot preparations into a reboot notifier.
>
> Signed-off-by: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
> Acked-by: Mike Turquette <mturquette@ti.com>
> ---
>
> v2: added a new line after variable declarations
>
> v1: http://marc.info/?l=linux-omap&m=128031011323970&w=2
>
> drivers/mfd/twl4030-power.c | 30 ++++++++++++++++++++++++++++++
> 1 files changed, 30 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c
> index 7efa878..5c6da1e 100644
> --- a/drivers/mfd/twl4030-power.c
> +++ b/drivers/mfd/twl4030-power.c
> @@ -28,6 +28,7 @@
> #include <linux/pm.h>
> #include <linux/i2c/twl.h>
> #include <linux/platform_device.h>
> +#include <linux/reboot.h>
>
> #include <asm/mach-types.h>
>
> @@ -127,6 +128,30 @@ static u8 res_config_addrs[] = {
> [RES_Main_Ref] = 0x94,
> };
>
> +/*
> + * PRCM on OMAP3 will drive SYS_OFFMODE low during DPLL3 warm reset.
> + * This causes Gaia sleep script to execute, usually killing VDD1 and
> + * VDD2 while code is running. WA is to disable the sleep script
> + * before warm reset.
> + */
> +static int twl4030_prepare_for_reboot(struct notifier_block *this,
> + unsigned long cmd, void *p)
> +{
> + int err;
> +
> + err = twl4030_remove_script(TWL4030_SLEEP_SCRIPT);
> + if (err)
> + pr_err("TWL4030: error trying to disable sleep script!\n");
> +
> + return NOTIFY_DONE;
> +}
> +
> +static struct notifier_block twl4030_reboot_notifier = {
> + .notifier_call = twl4030_prepare_for_reboot,
> + .next = NULL,
> + .priority = 0
> +};
> +
> static int __init twl4030_write_script_byte(u8 address, u8 byte)
> {
> int err;
> @@ -549,6 +574,11 @@ void __init twl4030_power_init(struct twl4030_power_data *twl4030_scripts)
> err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0, R_PROTECT_KEY);
> if (err)
> pr_err("TWL4030 Unable to relock registers\n");
> +
> + err = register_reboot_notifier(&twl4030_reboot_notifier);
> + if (err)
> + pr_err("TWL4030 Failed to register reboot notifier\n");
> +
> return;
>
> unlock:
> --
> 1.5.6.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
Sincerely Yours,
Mike.
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH v2] twl4030 reboot workaround
2010-07-29 19:10 ` Mike Rapoport
@ 2010-07-30 5:48 ` Mikko Rapeli
2010-07-30 6:35 ` Gopinath, Thara
1 sibling, 0 replies; 18+ messages in thread
From: Mikko Rapeli @ 2010-07-30 5:48 UTC (permalink / raw)
To: ext Mike Rapoport
Cc: linux-omap@vger.kernel.org, mturquette@ti.com,
sameo@linux.intel.com
On Thu, Jul 29, 2010 at 09:10:43PM +0200, ext Mike Rapoport wrote:
> On Thu, Jul 29, 2010 at 9:41 AM, Mikko Rapeli
> <ext-mikko.rapeli@nokia.com> wrote:
> > From: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
> >
> > Original patch: http://marc.info/?l=linux-omap&m=126522625032441&w=2
> >
> > "Removes TWL4030 sleep script prior to rebooting, only on OMAP3. This is
> > necessary since DPLL3 reset causes SYS_OFFMODE pin to go low, resulting
> > in the sleep script being executed on TWL4030. This usually results in
> > VDD1 & VDD2 voltage collapse while ROM code is executing, followed by an
> > MPU Watch Dog reset or worse, an irrecoverable hang."
>
> I had a similar issue when my system hanged on hard reset when there
> was a TWL sleep script installed.
> The workaround I've found was to install the sleep script immediately
> before entering the suspend state and remove the script on the resume
> path.
> If you think that such approach is appropriate I can send a patch.
Yes, I think this patch would be a good idea too since it fixes a real
issue.
-Mikko
^ permalink raw reply [flat|nested] 18+ messages in thread
* RE: [PATCH v2] twl4030 reboot workaround
2010-07-29 19:10 ` Mike Rapoport
2010-07-30 5:48 ` Mikko Rapeli
@ 2010-07-30 6:35 ` Gopinath, Thara
2010-07-30 18:39 ` Mike Turquette
1 sibling, 1 reply; 18+ messages in thread
From: Gopinath, Thara @ 2010-07-30 6:35 UTC (permalink / raw)
To: Mike Rapoport, Mikko Rapeli
Cc: linux-omap@vger.kernel.org, Turquette, Mike,
sameo@linux.intel.com
>>-----Original Message-----
>>From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-owner@vger.kernel.org] On Behalf Of Mike
>>Rapoport
>>Sent: Friday, July 30, 2010 12:41 AM
>>To: Mikko Rapeli
>>Cc: linux-omap@vger.kernel.org; Turquette, Mike; sameo@linux.intel.com
>>Subject: Re: [PATCH v2] twl4030 reboot workaround
>>
>>Hi
>>
>>On Thu, Jul 29, 2010 at 9:41 AM, Mikko Rapeli
>><ext-mikko.rapeli@nokia.com> wrote:
>>> From: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
>>>
>>> Original patch: http://marc.info/?l=linux-omap&m=126522625032441&w=2
>>>
>>> "Removes TWL4030 sleep script prior to rebooting, only on OMAP3. This is
>>> necessary since DPLL3 reset causes SYS_OFFMODE pin to go low, resulting
>>> in the sleep script being executed on TWL4030. This usually results in
>>> VDD1 & VDD2 voltage collapse while ROM code is executing, followed by an
>>> MPU Watch Dog reset or worse, an irrecoverable hang."
>>
>>I had a similar issue when my system hanged on hard reset when there
>>was a TWL sleep script installed.
>>The workaround I've found was to install the sleep script immediately
>>before entering the suspend state and remove the script on the resume
>>path.
>>If you think that such approach is appropriate I can send a patch.
How do you hit the off state(Vdd's at 0 V) in the idle path then? Or do you do this every
time in the idle thread also?
Regards
Thara
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2] twl4030 reboot workaround
2010-07-30 6:35 ` Gopinath, Thara
@ 2010-07-30 18:39 ` Mike Turquette
2010-07-30 19:11 ` Gopinath, Thara
0 siblings, 1 reply; 18+ messages in thread
From: Mike Turquette @ 2010-07-30 18:39 UTC (permalink / raw)
To: Gopinath, Thara
Cc: Mike Rapoport, Mikko Rapeli, linux-omap@vger.kernel.org,
sameo@linux.intel.com
Gopinath, Thara wrote:
>
>>> -----Original Message-----
>>> From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-owner@vger.kernel.org] On Behalf Of Mike
>>> Rapoport
>>> Sent: Friday, July 30, 2010 12:41 AM
>>> To: Mikko Rapeli
>>> Cc: linux-omap@vger.kernel.org; Turquette, Mike; sameo@linux.intel.com
>>> Subject: Re: [PATCH v2] twl4030 reboot workaround
>>>
>>> Hi
>>>
>>> On Thu, Jul 29, 2010 at 9:41 AM, Mikko Rapeli
>>> <ext-mikko.rapeli@nokia.com> wrote:
>>>> From: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
>>>>
>>>> Original patch: http://marc.info/?l=linux-omap&m=126522625032441&w=2
>>>>
>>>> "Removes TWL4030 sleep script prior to rebooting, only on OMAP3. This is
>>>> necessary since DPLL3 reset causes SYS_OFFMODE pin to go low, resulting
>>>> in the sleep script being executed on TWL4030. This usually results in
>>>> VDD1 & VDD2 voltage collapse while ROM code is executing, followed by an
>>>> MPU Watch Dog reset or worse, an irrecoverable hang."
>>> I had a similar issue when my system hanged on hard reset when there
>>> was a TWL sleep script installed.
>>> The workaround I've found was to install the sleep script immediately
>>> before entering the suspend state and remove the script on the resume
>>> path.
>>> If you think that such approach is appropriate I can send a patch.
>
> How do you hit the off state(Vdd's at 0 V) in the idle path then? Or do you do this every
> time in the idle thread also?
I do not think it is appropriate to add/remove the sleep script
before/after every OFF mode case. The script should be programmed once
and left alone EXCEPT in the case of warm reset.
If there are other corner cases where SYS_OFFMODE goes low, then we
should cover those with similar fixes to the warm reset fix, but in
general I think the policy should be to leave the scripts alone once
programmed
Dynamically programming/removing the scripts around OFF transitions
increases software overhead for those transitions even more which is
very undesirable.
Mike
> Regards
> Thara
^ permalink raw reply [flat|nested] 18+ messages in thread
* RE: [PATCH v2] twl4030 reboot workaround
2010-07-30 18:39 ` Mike Turquette
@ 2010-07-30 19:11 ` Gopinath, Thara
2010-08-01 6:31 ` Mike Rapoport
0 siblings, 1 reply; 18+ messages in thread
From: Gopinath, Thara @ 2010-07-30 19:11 UTC (permalink / raw)
To: Turquette, Mike
Cc: Mike Rapoport, Mikko Rapeli, linux-omap@vger.kernel.org,
sameo@linux.intel.com
>>-----Original Message-----
>>From: Turquette, Mike
>>Sent: Saturday, July 31, 2010 12:09 AM
>>To: Gopinath, Thara
>>Cc: Mike Rapoport; Mikko Rapeli; linux-omap@vger.kernel.org; sameo@linux.intel.com
>>Subject: Re: [PATCH v2] twl4030 reboot workaround
>>
>>Gopinath, Thara wrote:
>>>
>>>>> -----Original Message-----
>>>>> From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-owner@vger.kernel.org] On Behalf Of
>>Mike
>>>>> Rapoport
>>>>> Sent: Friday, July 30, 2010 12:41 AM
>>>>> To: Mikko Rapeli
>>>>> Cc: linux-omap@vger.kernel.org; Turquette, Mike; sameo@linux.intel.com
>>>>> Subject: Re: [PATCH v2] twl4030 reboot workaround
>>>>>
>>>>> Hi
>>>>>
>>>>> On Thu, Jul 29, 2010 at 9:41 AM, Mikko Rapeli
>>>>> <ext-mikko.rapeli@nokia.com> wrote:
>>>>>> From: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
>>>>>>
>>>>>> Original patch: http://marc.info/?l=linux-omap&m=126522625032441&w=2
>>>>>>
>>>>>> "Removes TWL4030 sleep script prior to rebooting, only on OMAP3. This is
>>>>>> necessary since DPLL3 reset causes SYS_OFFMODE pin to go low, resulting
>>>>>> in the sleep script being executed on TWL4030. This usually results in
>>>>>> VDD1 & VDD2 voltage collapse while ROM code is executing, followed by an
>>>>>> MPU Watch Dog reset or worse, an irrecoverable hang."
>>>>> I had a similar issue when my system hanged on hard reset when there
>>>>> was a TWL sleep script installed.
>>>>> The workaround I've found was to install the sleep script immediately
>>>>> before entering the suspend state and remove the script on the resume
>>>>> path.
>>>>> If you think that such approach is appropriate I can send a patch.
>>>
>>> How do you hit the off state(Vdd's at 0 V) in the idle path then? Or do you do this every
>>> time in the idle thread also?
>>
>>I do not think it is appropriate to add/remove the sleep script
>>before/after every OFF mode case. The script should be programmed once
>>and left alone EXCEPT in the case of warm reset.
>>
>>If there are other corner cases where SYS_OFFMODE goes low, then we
>>should cover those with similar fixes to the warm reset fix, but in
>>general I think the policy should be to leave the scripts alone once
>>programmed
>>
>>Dynamically programming/removing the scripts around OFF transitions
>>increases software overhead for those transitions even more which is
>>very undesirable.
This was exactly my concern. The latency increase due to the dynamic addition and
removal of sleep scripts around off transitions might not be justifiable. Maybe Mike
does not want to hit 0V for Vdd's in the idle thread in which case it can be acceptable to
dynamically add the script in the system suspend path and remove it in the resume path.
Else I also do not think this approach is acceptable.
Regards
Thara
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2] twl4030 reboot workaround
2010-07-30 19:11 ` Gopinath, Thara
@ 2010-08-01 6:31 ` Mike Rapoport
0 siblings, 0 replies; 18+ messages in thread
From: Mike Rapoport @ 2010-08-01 6:31 UTC (permalink / raw)
To: Gopinath, Thara
Cc: Turquette, Mike, Mikko Rapeli, linux-omap@vger.kernel.org,
sameo@linux.intel.com, Mike Rapoport
Gopinath, Thara wrote:
>
>>> -----Original Message-----
>>> From: Turquette, Mike
>>> Sent: Saturday, July 31, 2010 12:09 AM
>>> To: Gopinath, Thara
>>> Cc: Mike Rapoport; Mikko Rapeli; linux-omap@vger.kernel.org; sameo@linux.intel.com
>>> Subject: Re: [PATCH v2] twl4030 reboot workaround
>>>
>>> Gopinath, Thara wrote:
>>>>>> -----Original Message-----
>>>>>> From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-owner@vger.kernel.org] On Behalf Of
>>> Mike
>>>>>> Rapoport
>>>>>> Sent: Friday, July 30, 2010 12:41 AM
>>>>>> To: Mikko Rapeli
>>>>>> Cc: linux-omap@vger.kernel.org; Turquette, Mike; sameo@linux.intel.com
>>>>>> Subject: Re: [PATCH v2] twl4030 reboot workaround
>>>>>>
>>>>>> Hi
>>>>>>
>>>>>> On Thu, Jul 29, 2010 at 9:41 AM, Mikko Rapeli
>>>>>> <ext-mikko.rapeli@nokia.com> wrote:
>>>>>>> From: Mikko Rapeli <ext-mikko.rapeli@nokia.com>
>>>>>>>
>>>>>>> Original patch: http://marc.info/?l=linux-omap&m=126522625032441&w=2
>>>>>>>
>>>>>>> "Removes TWL4030 sleep script prior to rebooting, only on OMAP3. This is
>>>>>>> necessary since DPLL3 reset causes SYS_OFFMODE pin to go low, resulting
>>>>>>> in the sleep script being executed on TWL4030. This usually results in
>>>>>>> VDD1 & VDD2 voltage collapse while ROM code is executing, followed by an
>>>>>>> MPU Watch Dog reset or worse, an irrecoverable hang."
>>>>>> I had a similar issue when my system hanged on hard reset when there
>>>>>> was a TWL sleep script installed.
>>>>>> The workaround I've found was to install the sleep script immediately
>>>>>> before entering the suspend state and remove the script on the resume
>>>>>> path.
>>>>>> If you think that such approach is appropriate I can send a patch.
>>>> How do you hit the off state(Vdd's at 0 V) in the idle path then? Or do you do this every
>>>> time in the idle thread also?
>>> I do not think it is appropriate to add/remove the sleep script
>>> before/after every OFF mode case. The script should be programmed once
>>> and left alone EXCEPT in the case of warm reset.
>>>
>>> If there are other corner cases where SYS_OFFMODE goes low, then we
>>> should cover those with similar fixes to the warm reset fix, but in
>>> general I think the policy should be to leave the scripts alone once
>>> programmed
>>>
>>> Dynamically programming/removing the scripts around OFF transitions
>>> increases software overhead for those transitions even more which is
>>> very undesirable.
>
> This was exactly my concern. The latency increase due to the dynamic addition and
> removal of sleep scripts around off transitions might not be justifiable. Maybe Mike
> does not want to hit 0V for Vdd's in the idle thread in which case it can be acceptable to
> dynamically add the script in the system suspend path and remove it in the resume path.
> Else I also do not think this approach is acceptable.
I've missed the idle case indeed and I agree that dynamic addition and removal
of sleep scripts is not an acceptable solution.
> Regards
> Thara
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Sincerely yours,
Mike.
^ permalink raw reply [flat|nested] 18+ messages in thread