From 2b50cecea6d8bc99f59f1680e149fc88aecf71ba Mon Sep 17 00:00:00 2001
From: Gabor Juhos <juhosg@openwrt.org>
Date: Wed, 26 Jan 2011 20:48:50 +0000
Subject: [PATCH] ramips: add watchdog device for RT288x

SVN-Revision: 25129
---
 .../include/asm/mach-ralink/rt288x_regs.h     |  4 +++
 .../files/arch/mips/ralink/rt288x/devices.c   | 27 +++++++++++++++++++
 .../files/arch/mips/ralink/rt288x/devices.h   |  2 ++
 3 files changed, 33 insertions(+)

diff --git a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt288x_regs.h b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt288x_regs.h
index 1dd6c2dcec..a95cb82963 100644
--- a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt288x_regs.h
+++ b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt288x_regs.h
@@ -33,6 +33,7 @@
 #define RT2880_SDRAM_BASE	0x08000000
 
 #define RT2880_SYSC_SIZE	0x100
+#define RT2880_TIMER_SIZE	0x100
 #define RT2880_INTC_SIZE	0x100
 #define RT2880_MEMC_SIZE	0x100
 #define RT2880_UART0_SIZE	0x100
@@ -45,6 +46,7 @@
 #define SYSC_REG_CHIP_NAME1	0x004	/* Chip Name 1 */
 #define SYSC_REG_CHIP_ID	0x00c	/* Chip Identification */
 #define SYSC_REG_SYSTEM_CONFIG	0x010	/* System Configuration */
+#define SYSC_REG_CLKCFG		0x030
 #define SYSC_REG_RESET_CTRL	0x034	/* Reset Control*/
 #define SYSC_REG_RESET_STATUS	0x038	/* Reset Status*/
 #define SYSC_REG_GPIO_MODE	0x060	/* GPIO Purpose Select */
@@ -62,6 +64,8 @@
 #define SYSTEM_CONFIG_CPUCLK_280	0x2
 #define SYSTEM_CONFIG_CPUCLK_300	0x3
 
+#define CLKCFG_SRAM_CS_N_WDT	BIT(9)
+
 #define RT2880_RESET_SYSTEM	BIT(0)
 #define RT2880_RESET_TIMER	BIT(1)
 #define RT2880_RESET_INTC	BIT(2)
diff --git a/target/linux/ramips/files/arch/mips/ralink/rt288x/devices.c b/target/linux/ramips/files/arch/mips/ralink/rt288x/devices.c
index 6a5cf392e0..fd6122f581 100644
--- a/target/linux/ramips/files/arch/mips/ralink/rt288x/devices.c
+++ b/target/linux/ramips/files/arch/mips/ralink/rt288x/devices.c
@@ -171,3 +171,30 @@ void __init rt288x_register_ethernet(void)
 
 	platform_device_register(&rt288x_eth_device);
 }
+
+static struct resource rt288x_wdt_resources[] = {
+	{
+		.start	= RT2880_TIMER_BASE,
+		.end	= RT2880_TIMER_BASE + RT2880_TIMER_SIZE - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+};
+
+static struct platform_device rt288x_wdt_device = {
+	.name		= "ramips-wdt",
+	.id		= -1,
+	.resource	= rt288x_wdt_resources,
+	.num_resources	= ARRAY_SIZE(rt288x_wdt_resources),
+};
+
+void __init rt288x_register_wdt(void)
+{
+	u32 t;
+
+	/* enable WDT reset output on pin SRAM_CS_N */
+	t = rt288x_sysc_rr(SYSC_REG_CLKCFG);
+	t |= CLKCFG_SRAM_CS_N_WDT;
+	rt288x_sysc_wr(t, SYSC_REG_CLKCFG);
+
+	platform_device_register(&rt288x_wdt_device);
+}
diff --git a/target/linux/ramips/files/arch/mips/ralink/rt288x/devices.h b/target/linux/ramips/files/arch/mips/ralink/rt288x/devices.h
index 1ffbfb2a8a..0df17368a6 100644
--- a/target/linux/ramips/files/arch/mips/ralink/rt288x/devices.h
+++ b/target/linux/ramips/files/arch/mips/ralink/rt288x/devices.h
@@ -20,4 +20,6 @@ void rt288x_register_wifi(void);
 extern struct ramips_eth_platform_data rt288x_eth_data;
 void rt288x_register_ethernet(void);
 
+void rt288x_register_wdt(void);
+
 #endif  /* __ASM_MACH_RT288X_PLATFORM_H */
-- 
2.30.2