diff options
| -rw-r--r-- | Documentation/devicetree/bindings/watchdog/sun4i-wdt.txt (renamed from Documentation/devicetree/bindings/watchdog/sunxi-wdt.txt) | 6 | ||||
| -rw-r--r-- | arch/arm/mach-sunxi/sunxi.c | 58 | 
2 files changed, 38 insertions, 26 deletions
diff --git a/Documentation/devicetree/bindings/watchdog/sunxi-wdt.txt b/Documentation/devicetree/bindings/watchdog/sun4i-wdt.txt index 0b271777560..ecd650adff3 100644 --- a/Documentation/devicetree/bindings/watchdog/sunxi-wdt.txt +++ b/Documentation/devicetree/bindings/watchdog/sun4i-wdt.txt @@ -1,13 +1,13 @@ -Allwinner sunXi Watchdog timer +Allwinner sun4i Watchdog timer  Required properties: -- compatible : should be "allwinner,sunxi-wdt" +- compatible : should be "allwinner,sun4i-wdt"  - reg : Specifies base physical address and size of the registers.  Example:  wdt: watchdog@01c20c90 { -	compatible = "allwinner,sunxi-wdt"; +	compatible = "allwinner,sun4i-wdt";  	reg = <0x01c20c90 0x10>;  }; diff --git a/arch/arm/mach-sunxi/sunxi.c b/arch/arm/mach-sunxi/sunxi.c index c99ab1bdee4..706ce35396b 100644 --- a/arch/arm/mach-sunxi/sunxi.c +++ b/arch/arm/mach-sunxi/sunxi.c @@ -24,50 +24,63 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> +#include <asm/system_misc.h>  #include "sunxi.h" -#define WATCHDOG_CTRL_REG	0x00 -#define WATCHDOG_CTRL_RESTART		(1 << 0) -#define WATCHDOG_MODE_REG	0x04 -#define WATCHDOG_MODE_ENABLE		(1 << 0) -#define WATCHDOG_MODE_RESET_ENABLE	(1 << 1) +#define SUN4I_WATCHDOG_CTRL_REG		0x00 +#define SUN4I_WATCHDOG_CTRL_RESTART		(1 << 0) +#define SUN4I_WATCHDOG_MODE_REG		0x04 +#define SUN4I_WATCHDOG_MODE_ENABLE		(1 << 0) +#define SUN4I_WATCHDOG_MODE_RESET_ENABLE	(1 << 1)  static void __iomem *wdt_base; -static void sunxi_setup_restart(void) -{ -	struct device_node *np = of_find_compatible_node(NULL, NULL, -						"allwinner,sunxi-wdt"); -	if (WARN(!np, "unable to setup watchdog restart")) -		return; - -	wdt_base = of_iomap(np, 0); -	WARN(!wdt_base, "failed to map watchdog base address"); -} - -static void sunxi_restart(char mode, const char *cmd) +static void sun4i_restart(char mode, const char *cmd)  {  	if (!wdt_base)  		return;  	/* Enable timer and set reset bit in the watchdog */ -	writel(WATCHDOG_MODE_ENABLE | WATCHDOG_MODE_RESET_ENABLE, -		wdt_base + WATCHDOG_MODE_REG); +	writel(SUN4I_WATCHDOG_MODE_ENABLE | SUN4I_WATCHDOG_MODE_RESET_ENABLE, +	       wdt_base + SUN4I_WATCHDOG_MODE_REG);  	/*  	 * Restart the watchdog. The default (and lowest) interval  	 * value for the watchdog is 0.5s.  	 */ -	writel(WATCHDOG_CTRL_RESTART, wdt_base + WATCHDOG_CTRL_REG); +	writel(SUN4I_WATCHDOG_CTRL_RESTART, wdt_base + SUN4I_WATCHDOG_CTRL_REG);  	while (1) {  		mdelay(5); -		writel(WATCHDOG_MODE_ENABLE | WATCHDOG_MODE_RESET_ENABLE, -			wdt_base + WATCHDOG_MODE_REG); +		writel(SUN4I_WATCHDOG_MODE_ENABLE | SUN4I_WATCHDOG_MODE_RESET_ENABLE, +		       wdt_base + SUN4I_WATCHDOG_MODE_REG);  	}  } +static struct of_device_id sunxi_restart_ids[] = { +	{ .compatible = "allwinner,sun4i-wdt", .data = sun4i_restart }, +	{ /*sentinel*/ } +}; + +static void sunxi_setup_restart(void) +{ +	const struct of_device_id *of_id; +	struct device_node *np; + +	np = of_find_matching_node(NULL, sunxi_restart_ids); +	if (WARN(!np, "unable to setup watchdog restart")) +		return; + +	wdt_base = of_iomap(np, 0); +	WARN(!wdt_base, "failed to map watchdog base address"); + +	of_id = of_match_node(sunxi_restart_ids, np); +	WARN(!of_id, "restart function not available"); + +	arm_pm_restart = of_id->data; +} +  static struct map_desc sunxi_io_desc[] __initdata = {  	{  		.virtual	= (unsigned long) SUNXI_REGS_VIRT_BASE, @@ -105,7 +118,6 @@ DT_MACHINE_START(SUNXI_DT, "Allwinner A1X (Device Tree)")  	.init_machine	= sunxi_dt_init,  	.map_io		= sunxi_map_io,  	.init_irq	= irqchip_init, -	.restart	= sunxi_restart,  	.init_time	= sunxi_timer_init,  	.dt_compat	= sunxi_board_dt_compat,  MACHINE_END  |