watchdog: pnx4008: add restart handler
v4 cover watchdog: pnx4008: add restart handler
From: Sylvain Lemieux <[email protected]>
The LPC32xx provide the capability to perform a soft or hard reset; a soft reset will no reset the external peripheral
(i.e. RESOUT_N output not asserted).
This changeset migrate the restart code from the "mach-lpc32xx" to the "pnx-4008" watchdog driver and add the soft reset capability.
The default behavior (i.e. hard reset) remain unchanged.
The core restart handler support added by this change:2165bf524da5f5e496d - "watchdog: core: add restart handler support" is not use in this changeset; it does not support the reboot mode.
Note:
Patch #5 was generated with the option "--unified=2" to ensure it can be apply before or after the changes for the new LPC32xx irqchip driver:
- http://permalink.gmane.org/gmane.linux.drivers.devicetree/144683
---
Changes from v3 to v4:
* Update the patch as per the feedback received from:
Arnd: http://permalink.gmane.org/gmane.linux.watchdog/3329
- Switch patch #5 and #6 order.
Changes from v2 to v3:
* Update the patch as per the feedback received from:
Joachim: http://permalink.gmane.org/gmane.linux.watchdog/3303
- remove explicit clock enable from restart handler.
- verify "register_restart_handler" return value.
- add call to unregister_restart_handler".
- do the restart handling directly in "pnx4008_restart_handler".
* Move the change to "phy3250.c" into a separate patch and generate the new patch with the "--unified=2" option.
Changes from v1 to v2:
* Rename patch title;
was "arm: lpc32xx: restart: add support for soft reset"
* Update the patch as per the feedback received from:
Joachim: http://permalink.gmane.org/gmane.linux.ports.arm.kernel/479791
- migrate restart code from "mach-lpc32xx" to "pnx-4008" driver.
* Add soft reset support to "pnx-4008" driver instead of "mach-lpc32xx".
* Use define available in "pnx-4008" when writting to watchdog register.
* Remove restart handler from "mach-lpc32xx".
* Remove restart hook from "phy3250.c".
* Update driver logging during power-on.
Sylvain Lemieux (6):
watchdog: pnx4008: update logging during power-on
watchdog: pnx4008: add restart handler
watchdog: pnx4008: add support for soft reset
watchdog: pnx4008: restart: support "cmd" from userspace
arm: lpc32xx: phy3250 remove restart hook
arm: lpc32xx: remove restart handler
arch/arm/mach-lpc32xx/common.c | 15 ------------ arch/arm/mach-lpc32xx/common.h | 1 - arch/arm/mach-lpc32xx/phy3250.c | 1 - drivers/watchdog/pnx4008_wdt.c | 51 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 49 insertions(+), 19 deletions(-)
Signature · 1 line
1.8.3.1
PATCH v4 1/6 watchdog: pnx4008: update logging during power-on
From: Sylvain Lemieux <[email protected]>
There is no need add the driver name in the text to display
on the console during the power-on:
pnx4008-watchdog 4003c000.watchdog: PNX4008 Watchdog Timer: heartbeat 19 sec
---
Changes from v3 to v4:
- none.
Changes from v2 to v3:
- none.
Changes from v1 to v2:
- new patch in v2.
drivers/watchdog/pnx4008_wdt.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/watchdog/pnx4008_wdt.c +1 -2
@@ -178,8 +178,7 @@ static int pnx4008_wdt_probe(struct platform_device *pdev) goto disable_clk; } -dev_info (&pdev->dev,"PNX4008 Watchdog Timer: heartbeat %d sec\n" , - pnx4008_wdd.timeout); +dev_info (&pdev->dev,"heartbeat %d sec\n" , pnx4008_wdd.timeout);return 0 ;
Signature · 1 line
1.8.3.1
Guenter Roeck
maintainerPATCH v4 1/6 watchdog: pnx4008: update logging during power-on
Quoted 7 lines · Sylvain Lemieux
From: Sylvain Lemieux <[email protected]>
There is no need add the driver name in the text to display
on the console during the power-on:
pnx4008-watchdog 4003c000.watchdog: PNX4008 Watchdog Timer: heartbeat 19 secSigned-off-by Sylvain Lemieux <[email protected]>
Quoted 28 lines
---
Changes from v3 to v4:
- none.Changes from v2 to v3:
- none.Changes from v1 to v2:
- new patch in v2.drivers/watchdog/pnx4008_wdt.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)drivers/watchdog/pnx4008_wdt.c +1
-2@@ -178,8 +178,7 @@ static int pnx4008_wdt_probe(struct platform_device *pdev) goto disable_clk; } -dev_info (&pdev->dev,"PNX4008 Watchdog Timer: heartbeat %d sec\n" , - pnx4008_wdd.timeout); +dev_info (&pdev->dev,"heartbeat %d sec\n" , pnx4008_wdd.timeout);return 0 ;
PATCH v4 2/6 watchdog: pnx4008: add restart handler
In reply to Sylvain LemieuxFrom: Sylvain Lemieux <[email protected]>
Add restart handler capability to the driver;
the restart handler implementation was taken from
"mach-lpc32xx" ("lpc23xx_restart" function).
---
Changes from v3 to v4:
- none.
Changes from v2 to v3:
- remove explicit clock enable from restart handler.
- verify "register_restart_handler" return value.
- add call to unregister_restart_handler".
- do the restart handling directly in "pnx4008_restart_handler".
Changes from v1 to v2:
- new patch in v2.
drivers/watchdog/pnx4008_wdt.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
drivers/watchdog/pnx4008_wdt.c +26 -0
@@ -31,6 +31,8 @@#include <linux/slab.h> #include <linux/err.h> #include <linux/of.h> +#include <linux/delay.h> +#include <linux/reboot.h> #include <mach/hardware.h> /* WatchDog Timer - Chapter 23 Page 207 */
@@ -77,6 +79,7 @@static bool nowayout =WATCHDOG_NOWAYOUT ;static unsigned int heartbeat =DEFAULT_HEARTBEAT ; +static struct notifier_block restart_handler;static DEFINE_SPINLOCK (io_lock);static void __iomem *wdt_base;
@@ -124,6 +127,19 @@ static int pnx4008_wdt_set_timeout(struct watchdog_device *wdd,return 0 ; } +static int pnx4008_restart_handler (struct notifier_block *this, +unsigned long mode,void *cmd) +{ +/* Instant assert of RESETOUT_N with pulse length 1mS */ +writel (13000 ,WDTIM_PULSE (wdt_base)); +writel (M_RES2 |RESFRC1 |RESFRC2 ,WDTIM_MCTRL (wdt_base)); + +/* Wait for watchdog to reset system */ +mdelay (1000 ); + +return NOTIFY_DONE ; +} +static const struct watchdog_info pnx4008_wdt_ident = { .options =WDIOF_CARDRESET |WDIOF_MAGICCLOSE |WDIOF_SETTIMEOUT |WDIOF_KEEPALIVEPING ,
@@ -157,6 +173,15 @@ static int pnx4008_wdt_probe(struct platform_device *pdev)if (IS_ERR (wdt_base))return PTR_ERR (wdt_base); +/* Register restart handler. */ + restart_handler.notifier_call = pnx4008_restart_handler; + restart_handler.priority =128 ; + ret =register_restart_handler (&restart_handler); +if (ret) { +dev_warn (&pdev->dev,"cannot register restart handler\n" ); +return ret; + } + wdt_clk =devm_clk_get (&pdev->dev,NULL );if (IS_ERR (wdt_clk))return PTR_ERR (wdt_clk);
@@ -189,6 +214,7 @@ disable_clk:static int pnx4008_wdt_remove (struct platform_device *pdev) { +unregister_restart_handler (&restart_handler);watchdog_unregister_device (&pnx4008_wdd);clk_disable_unprepare (wdt_clk);
Signature · 1 line
1.8.3.1
PATCH v4 3/6 watchdog: pnx4008: add support for soft reset
In reply to Sylvain LemieuxFrom: Sylvain Lemieux <[email protected]>
Add support for explicit soft reset using the reboot mode.
The default reboot mode behavior is unchanged;
you can overwrite the default reboot type in the board specific file "DT_MACHINE_START" definition using the "reboot_mode" parameter.
---
Changes from v3 to v4:
- none.
Changes from v2 to v3:
- no logical change; updated to work with new revision of patch #2.
Changes from v1 to v2:
- Rename patch title;
was "arm: lpc32xx: restart: add support for soft reset"
- Add change to "pnx-4008" driver instead of "mach-lpc32xx".
- Use define available in "pnx-4008" when writting to watchdog register.
drivers/watchdog/pnx4008_wdt.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/watchdog/pnx4008_wdt.c +10 -3
@@ -130,9 +130,16 @@ static int pnx4008_wdt_set_timeout(struct watchdog_device *wdd,static int pnx4008_restart_handler (struct notifier_block *this,unsigned long mode,void *cmd) { -/* Instant assert of RESETOUT_N with pulse length 1mS */ -writel (13000 ,WDTIM_PULSE (wdt_base)); -writel (M_RES2 |RESFRC1 |RESFRC2 ,WDTIM_MCTRL (wdt_base)); +if (mode == (unsigned long )REBOOT_SOFT ) { +/* Force match output active */ +writel (EXT_MATCH0 ,WDTIM_EMR (wdt_base)); +/* Internal reset on match output (RESOUT_N not asserted) */ +writel (M_RES1 ,WDTIM_MCTRL (wdt_base)); + }else { +/* Instant assert of RESETOUT_N with pulse length 1mS */ +writel (13000 ,WDTIM_PULSE (wdt_base)); +writel (M_RES2 |RESFRC1 |RESFRC2 ,WDTIM_MCTRL (wdt_base)); + }/* Wait for watchdog to reset system */ mdelay (1000 );
Signature · 1 line
1.8.3.1
PATCH v4 4/6 watchdog: pnx4008: restart: support "cmd" from userspace
In reply to Sylvain LemieuxFrom: Sylvain Lemieux <[email protected]>
Added support to verify if a "cmd" is passed from the userspace program rebooting the system;
- if a valid "cmd" is available, handle it;
- If the received "cmd" is not supported, use the default reboot mode.
---
Changes from v3 to v4:
- none.
Changes from v2 to v3:
- no logical change; updated to work with new revision of patch #2.
Changes from v1 to v2:
- Rename patch title;
was "arm: lpc32xx: restart: support "cmd" from userspace"
- Add change to "pnx-4008" driver instead of "mach-lpc32xx".
drivers/watchdog/pnx4008_wdt.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
drivers/watchdog/pnx4008_wdt.c +15 -0
@@ -130,6 +130,21 @@ static int pnx4008_wdt_set_timeout(struct watchdog_device *wdd,static int pnx4008_restart_handler (struct notifier_block *this,unsigned long mode,void *cmd) { +const char *boot_cmd = (const char *)cmd; + +/* +* Verify if a "cmd" passed from the userspace program rebooting +* the system; if available, handle it. +* - For details, see the 'reboot' syscall in kernel/reboot.c +* - If the received "cmd" is not supported, use the default mode. +*/ +if (boot_cmd) { +if (boot_cmd[0 ] =='h' ) + mode = (unsigned long )REBOOT_HARD ; +else if (boot_cmd[0 ] =='s' ) + mode = (unsigned long )REBOOT_SOFT ; + } +if (mode == (unsigned long )REBOOT_SOFT ) {/* Force match output active */ writel (EXT_MATCH0 ,WDTIM_EMR (wdt_base));
Signature · 1 line
1.8.3.1
PATCH v4 5/6 arm: lpc32xx: phy3250 remove restart hook
In reply to Sylvain LemieuxFrom: Sylvain Lemieux <[email protected]>
Remove the restart hook assignment from phy3250;
this functionality is now managed by
the pnx4008 watchdog driver.
---
Note:
This patch was generated with the option "--unified=2" to ensure it can be apply before or after the changes for the new LPC32xx irqchip driver:
- http://permalink.gmane.org/gmane.linux.drivers.devicetree/144683
Changes from v3 to v4:
- Switch patch #5 and #6 order.
Changes from v2 to v3:
- new patch in v3.
arch/arm/mach-lpc32xx/phy3250.c | 1 - 1 file changed, 1 deletion(-)
arch/arm/mach-lpc32xx/phy3250.c +0 -1
@@ -211,4 +211,3 @@ DT_MACHINE_START(LPC32XX_DT, "LPC32XX SoC (Flattened Device Tree)") .init_machine = lpc3250_machine_init, .dt_compat = lpc32xx_dt_compat, - .restart = lpc23xx_restart,MACHINE_END
Signature · 1 line
1.8.3.1
PATCH v4 6/6 arm: lpc32xx: remove restart handler
In reply to Sylvain LemieuxFrom: Sylvain Lemieux <[email protected]>
Remove the restart handler from "mach-lpc32xx";
this functionality is now available in the
pnx4008 watchdog driver.
---
Changes from v3 to v4:
- Switch patch #5 and #6 order.
Changes from v2 to v3:
- move the change to "phy3250.c" into a separate patch.
Changes from v1 to v2:
- new patch in v2.
arch/arm/mach-lpc32xx/common.c | 15 --------------- arch/arm/mach-lpc32xx/common.h | 1 - 2 files changed, 16 deletions(-)
arch/arm/mach-lpc32xx/common.c +0 -15
@@ -194,21 +194,6 @@ void __init lpc32xx_map_io(void)iotable_init (lpc32xx_io_desc,ARRAY_SIZE (lpc32xx_io_desc)); } -void lpc23xx_restart (enum reboot_mode mode,const char *cmd) -{ -/* Make sure WDT clocks are enabled */ -__raw_writel (LPC32XX_CLKPWR_PWMCLK_WDOG_EN , -LPC32XX_CLKPWR_TIMER_CLK_CTRL ); - -/* Instant assert of RESETOUT_N with pulse length 1mS */ -__raw_writel (13000 ,io_p2v (LPC32XX_WDTIM_BASE +0x18 )); -__raw_writel (0x70 ,io_p2v (LPC32XX_WDTIM_BASE +0xC )); - -/* Wait for watchdog to reset system */ -while (1 ) - ; -} -static int __init lpc32xx_check_uid (void ) {u32 uid[4 ];
arch/arm/mach-lpc32xx/common.h +0 -1
@@ -30,7 +30,6 @@ extern void lpc32xx_timer_init(void);extern void __init lpc32xx_init_irq (void );extern void __init lpc32xx_map_io (void );extern void __init lpc32xx_serial_init (void ); -extern void lpc23xx_restart (enum reboot_mode ,const char *);/*
Signature · 1 line
1.8.3.1
Guenter Roeck
maintainerv4 cover watchdog: pnx4008: add restart handler
In reply to Sylvain LemieuxQuoted 6 lines · Sylvain Lemieux
From: Sylvain Lemieux <[email protected]>
The LPC32xx provide the capability to perform a soft or hard reset; a soft reset will no reset the external peripheral
(i.e.RESOUT_Noutput not asserted).
Quoted 8 lines
This changeset migrate the restart code from the "mach-lpc32xx" to the "pnx-4008" watchdog driver and add the soft reset capability.
The default behavior (i.e. hard reset) remain unchanged.
The core restart handler support added by this change:
2165bf524da5f5e496d- "watchdog: core: add restart handler support" is not use in this changeset; it does not support the reboot mode.
I finally had the time to look into this. Sorry for the late reply.
Changing the watchdog core to pass the restart mode (or action) and the cmd/data pointer to the driver would be trivial and should be done instead.
I wrote a patch to do just that. I'll send it out later today for review, assuming it passes my internal tests.
Guenter
Quoted 48 lines
Note:
Patch #5 was generated with the option "--unified=2" to ensure it can be apply before or after the changes for the new LPC32xx irqchip driver:
- http://permalink.gmane.org/gmane.linux.drivers.devicetree/144683
---
Changes from v3 to v4:
* Update the patch as per the feedback received from:
Arnd: http://permalink.gmane.org/gmane.linux.watchdog/3329
- Switch patch #5 and #6 order.Changes from v2 to v3:
* Update the patch as per the feedback received from:
Joachim: http://permalink.gmane.org/gmane.linux.watchdog/3303
- remove explicit clock enable from restart handler.
- verify "register_restart_handler" return value.
- add call tounregister_restart_handler".
- do the restart handling directly in "pnx4008_restart_handler".
* Move the change to "phy3250.c" into a separate patch and generate the new patch with the "--unified=2" option.Changes from v1 to v2:
* Rename patch title;
was "arm: lpc32xx: restart: add support for soft reset"
* Update the patch as per the feedback received from:
Joachim: http://permalink.gmane.org/gmane.linux.ports.arm.kernel/479791
- migrate restart code from "mach-lpc32xx" to "pnx-4008" driver.
* Add soft reset support to "pnx-4008" driver instead of "mach-lpc32xx".
* Use define available in "pnx-4008" when writting to watchdog register.
* Remove restart handler from "mach-lpc32xx".
* Remove restart hook from "phy3250.c".
* Update driver logging during power-on.Sylvain Lemieux (6):
watchdog: pnx4008: update logging during power-on
watchdog: pnx4008: add restart handler
watchdog: pnx4008: add support for soft reset
watchdog: pnx4008: restart: support "cmd" from userspace
arm: lpc32xx: phy3250 remove restart hook
arm: lpc32xx: remove restart handlerarch/arm/mach-lpc32xx/common.c | 15 ------------ arch/arm/mach-lpc32xx/common.h | 1 - arch/arm/mach-lpc32xx/phy3250.c | 1 - drivers/watchdog/pnx4008_wdt.c | 51 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 49 insertions(+), 19 deletions(-)
v4 cover watchdog: pnx4008: add restart handler
Quoted 16 lines · Guenter Roeck
Quoted 6 lines · Sylvain Lemieux
From: Sylvain Lemieux <[email protected]>
The LPC32xx provide the capability to perform a soft or hard reset; a soft reset will no reset the external peripheral
(i.e.RESOUT_Noutput not asserted).Quoted 8 lines
This changeset migrate the restart code from the "mach-lpc32xx" to the "pnx-4008" watchdog driver and add the soft reset capability.
The default behavior (i.e. hard reset) remain unchanged.
The core restart handler support added by this change:
2165bf524da5f5e496d- "watchdog: core: add restart handler support" is not use in this changeset; it does not support the reboot mode.
Quoted 6 lines
I finally had the time to look into this. Sorry for the late reply.
Changing the watchdog core to pass the restart mode (or action) and the cmd/data pointer to the driver would be trivial and should be done instead.
Thanks for the feedback.
Do you want me to rebase this patchset on the patch you will submit to update the core restart handler support?
Quoted 54 lines
I wrote a patch to do just that. I'll send it out later today for review, assuming it passes my internal tests.
Guenter
Quoted 48 lines
Note:
Patch #5 was generated with the option "--unified=2" to ensure it can be apply before or after the changes for the new LPC32xx irqchip driver:
- http://permalink.gmane.org/gmane.linux.drivers.devicetree/144683
---
Changes from v3 to v4:
* Update the patch as per the feedback received from:
Arnd: http://permalink.gmane.org/gmane.linux.watchdog/3329
- Switch patch #5 and #6 order.Changes from v2 to v3:
* Update the patch as per the feedback received from:
Joachim: http://permalink.gmane.org/gmane.linux.watchdog/3303
- remove explicit clock enable from restart handler.
- verify "register_restart_handler" return value.
- add call tounregister_restart_handler".
- do the restart handling directly in "pnx4008_restart_handler".
* Move the change to "phy3250.c" into a separate patch and generate the new patch with the "--unified=2" option.Changes from v1 to v2:
* Rename patch title;
was "arm: lpc32xx: restart: add support for soft reset"
* Update the patch as per the feedback received from:
Joachim: http://permalink.gmane.org/gmane.linux.ports.arm.kernel/479791
- migrate restart code from "mach-lpc32xx" to "pnx-4008" driver.
* Add soft reset support to "pnx-4008" driver instead of "mach-lpc32xx".
* Use define available in "pnx-4008" when writting to watchdog register.
* Remove restart handler from "mach-lpc32xx".
* Remove restart hook from "phy3250.c".
* Update driver logging during power-on.Sylvain Lemieux (6):
watchdog: pnx4008: update logging during power-on
watchdog: pnx4008: add restart handler
watchdog: pnx4008: add support for soft reset
watchdog: pnx4008: restart: support "cmd" from userspace
arm: lpc32xx: phy3250 remove restart hook
arm: lpc32xx: remove restart handlerarch/arm/mach-lpc32xx/common.c | 15 ------------ arch/arm/mach-lpc32xx/common.h | 1 - arch/arm/mach-lpc32xx/phy3250.c | 1 - drivers/watchdog/pnx4008_wdt.c | 51 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 49 insertions(+), 19 deletions(-)
Guenter Roeck
maintainerv4 cover watchdog: pnx4008: add restart handler
Quoted 19 lines · Sylvain Lemieux
Quoted 18 lines · Guenter Roeck
Quoted 6 lines · Sylvain Lemieux
From: Sylvain Lemieux <[email protected]>
The LPC32xx provide the capability to perform a soft or hard reset; a soft reset will no reset the external peripheral
(i.e.RESOUT_Noutput not asserted).Quoted 8 lines
This changeset migrate the restart code from the "mach-lpc32xx" to the "pnx-4008" watchdog driver and add the soft reset capability.
The default behavior (i.e. hard reset) remain unchanged.
The core restart handler support added by this change:
2165bf524da5f5e496d- "watchdog: core: add restart handler support" is not use in this changeset; it does not support the reboot mode.I finally had the time to look into this. Sorry for the late reply.
Quoted 9 lines
Quoted 4 lines
Changing the watchdog core to pass the restart mode (or action) and the cmd/data pointer to the driver would be trivial and should be done instead.
Thanks for the feedback.
Do you want me to rebase this patchset on the patch you will submit to update the core restart handler support?
Yes, please. I'll Cc: you on it.
If you want to get started early and are open to do some early testing, try cloning git://kerneltests.org/git/linux.git. You'll find the patch in branch 'testing'.
Thanks,
Guenter
v4 cover watchdog: pnx4008: add restart handler
Quoted 30 lines · Guenter Roeck
Quoted 19 lines · Sylvain Lemieux
Quoted 18 lines · Guenter Roeck
Quoted 6 lines · Sylvain Lemieux
From: Sylvain Lemieux <[email protected]>
The LPC32xx provide the capability to perform a soft or hard reset; a soft reset will no reset the external peripheral
(i.e.RESOUT_Noutput not asserted).Quoted 8 lines
This changeset migrate the restart code from the "mach-lpc32xx" to the "pnx-4008" watchdog driver and add the soft reset capability.
The default behavior (i.e. hard reset) remain unchanged.
The core restart handler support added by this change:
2165bf524da5f5e496d- "watchdog: core: add restart handler support" is not use in this changeset; it does not support the reboot mode.I finally had the time to look into this. Sorry for the late reply.
Quoted 9 lines
Quoted 4 lines
Changing the watchdog core to pass the restart mode (or action) and the cmd/data pointer to the driver would be trivial and should be done instead.
Thanks for the feedback.
Do you want me to rebase this patchset on the patch you will submit to update the core restart handler support?
Quoted 6 lines
Yes, please. I'll Cc: you on it.
If you want to get started early and are open to do some early testing, try cloning
git://kerneltests.org/git/linux.git. You'll find the patch in branch 'testing'.
Rebase and tested on a custom LPC32xx board.
Quoted 3 lines
Thanks,
Guenter