Add support for PowerQUICC watchdog
The PowerQUICC series has a watchdog which can be activated by the boot loader and then needs to be reset in regular intervals. Once the watchdog is enabled, it can't be disabled anymore. This patch adds support for this kind of watchdog. An early init function is provided to manually reset the watchdog in early board setup. Later, a kernel timer is used to reset the watchdog until the watchdog driver is opened from user space. This replaces mpc8xx_wdt.c (only usable for ARCH=ppc) and mpc83xx_wdt.c (untested on this platform).
---
arch/powerpc/platforms/8xx/mpc86xads_setup.c | 5 + arch/powerpc/platforms/8xx/mpc885ads_setup.c | 5 + arch/powerpc/sysdev/Makefile | 3 + arch/powerpc/sysdev/pq_wdt.c | 204 +++++++++++++++++++++++ arch/powerpc/sysdev/pq_wdt.h | 28 ++++ drivers/watchdog/Kconfig | 13 ++- drivers/watchdog/Makefile | 1 + drivers/watchdog/pq_wdt.c | 222 ++++++++++++++++++++++++++ 8 files changed, 480 insertions(+), 1 deletions(-)
create mode 100644 arch/powerpc/sysdev/pq_wdt.c
create mode 100644 arch/powerpc/sysdev/pq_wdt.h
create mode 100644 drivers/watchdog/pq_wdt.c
arch/powerpc/platforms/8xx/mpc86xads_setup.c +0 -0
@@ -38,6 +38,7 @@
#include <asm/prom.h>
#include <sysdev/commproc.h>
+#include <sysdev/pq_wdt.h>
static void init_smc1_uart_ioports(struct fs_uart_platform_info* fpi); static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi); @@ -251,6 +252,10 @@ static void __init mpc86xads_setup_arch(void)
mpc86xads_board_setup(); ROOT_DEV = Root_NFS;
+
+#if defined(CONFIG_PQ_WDT) || defined(CONFIG_PQ_WDT_MODULE)
+ pq_wdt_early_init();
+#endif
}
static int __init mpc86xads_probe(void)
arch/powerpc/platforms/8xx/mpc885ads_setup.c +0 -0
@@ -41,6 +41,7 @@
#include <asm/udbg.h>
#include <sysdev/commproc.h>
+#include <sysdev/pq_wdt.h>
static u32 __iomem *bcsr, *bcsr5;
@@ -246,6 +247,10 @@ static void __init mpc885ads_setup_arch(void)
m8xx_pcmcia_ops.hw_ctrl = pcmcia_hw_setup; m8xx_pcmcia_ops.voltage_set = pcmcia_set_voltage;
#endif
+
+#if defined(CONFIG_PQ_WDT) || defined(CONFIG_PQ_WDT_MODULE)
+ pq_wdt_early_init();
+#endif
}
static int __init mpc885ads_probe(void)
arch/powerpc/sysdev/Makefile +0 -0
@@ -35,5 +35,8 @@ obj-$(CONFIG_CPM) += cpm_common.o
obj-$(CONFIG_CPM2) += cpm2_common.o cpm2_pic.o
obj-$(CONFIG_PPC_DCR) += dcr.o
obj-$(CONFIG_8xx) += mpc8xx_pic.o commproc.o
+ifneq ($(CONFIG_PQ_WDT),)
+obj-y += pq_wdt.o
+endif
obj-$(CONFIG_UCODE_PATCH) += micropatch.o
endif
arch/powerpc/sysdev/pq_wdt.c new file +204 -0
204 lines not on this page · raw message
arch/powerpc/sysdev/pq_wdt.h new file +28 -0
@@ -0,0 +1,28 @@ +/* +* Author: Florian Schirmer <[email protected]> +* +* 2002 (c) Florian Schirmer <[email protected]> This file is licensed under +* the terms of the GNU General Public License version 2. This program +* is licensed "as is" without any warranty of any kind, whether express +* or implied. +* +* 2007 (c) Jochen Friedrich <[email protected]> ported to ARCH=powerpc and +* extended to be useful on any Power QUICC 1/2/2pro which have the same +* style of watchdog. +*/ +#ifndef _POWERPC_SYSDEV_PQ_WDT_H +#define _POWERPC_SYSDEV_PQ_WDT_H + +#define SWCRR_SWEN 0x00000004/* Watchdog Enable bit. */ +#define SWCRR_SWRI 0x00000002/* Software Watchdog Reset/Interrupt Select bit.*/ +#define SWCRR_SWPR 0x00000001/* Software Watchdog Counter Prescale bit. */ + +extern int pq_wdt_get_timeout (void ); +extern void pq_wdt_reset (void ); +extern void pq_wdt_install_timer (void ); +extern void pq_wdt_stop_timer (void ); +extern int pq_wdt_setup (int ); +extern int pq_wdt_present (void ); +extern int pq_wdt_early_init (void ); + +#endif /* _POWERPC_SYSDEV_PQ_WDT_H */
drivers/watchdog/Kconfig +0 -0
@@ -649,7 +649,18 @@ config MPC5200_WDT
config 8xx_WDT
tristate "MPC8xx Watchdog Timer"
- depends on 8xx
+ depends on 8xx && ! OF
+
+config PQ_WDT
+ tristate "Power QUICC Watchdog Timer"
+ depends on (8xx || PPC_82xx || PPC_83xx) && OF
+ default y
+ help
+ Watchdog driver for Power QUICC 1/2/2pro style watchdog drivers. + You should really select this unless your boot loader turns + off the watchdog. As the watchdog is turned on by default and + can be turned on/off only once after reboot, your board won't + run otherwise. Say 'M' if unsure.
config 83xx_WDT
tristate "MPC83xx Watchdog Timer"
drivers/watchdog/Makefile +0 -0
@@ -98,6 +98,7 @@ obj-$(CONFIG_AR7_WDT) += ar7_wdt.o
# POWERPC Architecture
obj-$(CONFIG_8xx_WDT) += mpc8xx_wdt.o
+obj-$(CONFIG_PQ_WDT) += pq_wdt.o
obj-$(CONFIG_MPC5200_WDT) += mpc5200_wdt.o
obj-$(CONFIG_83xx_WDT) += mpc83xx_wdt.o
obj-$(CONFIG_MV64X60_WDT) += mv64x60_wdt.o
drivers/watchdog/pq_wdt.c new file +222 -0
222 lines not on this page · raw message
Signature · 1 line
1.5.3.7
Hi Jochen,
Just a couple of suggestions.
arch/powerpc/sysdev/pq_wdt.c line 186
Quoted 12 lines · On Fri, 28 Dec 2007 16:13:11 +0100 Jochen Friedrich <[email protected]> wrote:
arch/powerpc/sysdev/pq_wdt.c new file +10
-0+int __init pq_wdt_early_init (void ) +{ + data =of_get_property (soc,"bus-frequency" ,NULL ); +if (!data) { +of_node_put (soc); +printk (KERN_ERR "Could not find bus-frequency in soc node\n" ); + ret = -ENODEV ; + goto out; + } +of_node_put (soc);
If you move the "of_node_put(soc)" just above the "if (!data)" then you won't need to repeat it.
drivers/watchdog/pq_wdt.c line 204
Quoted 7 lines
drivers/watchdog/pq_wdt.c new file +7
-0+static struct of_platform_driver pq_wdt_driver = { + .owner =THIS_MODULE , + .name ="pq-wdt" , + .match_table = pq_wdt_match, + .probe = pq_wdt_probe, + .remove = pq_wdt_remove, +};
We are removing the owner and name fields from struct of_platform_driver, so the preferred initialization looks like this:
static struct of_platform_driver pq_wdt_driver = {
.match_table = pq_wdt_match,
.probe = pq_wdt_probe,
.remove = pq_wdt_remove,
.driver = {
.name = "pq-wdt",
.owner = THIS_MODULE,
}
};or similar.
Signature · 3 lines
Cheers, Stephen Rothwell [email protected] http://www.canb.auug.org.au/~sfr/