ARM: s3c64xx: switch to generic watchdog driver reset
Similarly to commit f6361c6b38
("ARM: S3C24XX: remove separate restart
code"), the platform watchdog reset code can be removed in favor of
a generic watchdog driver which already handles reset.
This allows removal of a bunch of machine code and fixes also W=1
compile warnings:
arch/arm/plat-samsung/watchdog-reset.c:29:6: warning: no previous prototype for 'samsung_wdt_reset' [-Wmissing-prototypes]
arch/arm/plat-samsung/watchdog-reset.c:69:13: warning: no previous prototype for 'samsung_wdt_reset_of_init' [-Wmissing-prototypes]
arch/arm/plat-samsung/watchdog-reset.c:89:13: warning: no previous prototype for 'samsung_wdt_reset_init' [-Wmissing-prototypes]
The generic watchdog-based system reset is not exactly the same as
before. The previous method had a fallback to soft_restart() which now
is gone.
The commit also removes a FIXME note about calling s3c64xx_clk_init()
inside s3c64xx_init_irq(). No one fixed this since long time and the
note is not meaningful anymore because watchdog part is removed.
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
Reviewed-by: Tomasz Figa <tomasz.figa@gmail.com>
This commit is contained in:
parent
7dd3cae90d
commit
8166c10001
|
@ -18,9 +18,10 @@ menuconfig ARCH_S3C64XX
|
|||
select PM_GENERIC_DOMAINS if PM
|
||||
select S3C_DEV_NAND if ATAGS
|
||||
select S3C_GPIO_TRACK if ATAGS
|
||||
select S3C2410_WATCHDOG
|
||||
select SAMSUNG_ATAGS if ATAGS
|
||||
select SAMSUNG_WAKEMASK if PM
|
||||
select SAMSUNG_WDT_RESET
|
||||
select WATCHDOG
|
||||
help
|
||||
Samsung S3C64XX series based systems
|
||||
|
||||
|
|
|
@ -50,7 +50,6 @@
|
|||
|
||||
#include "common.h"
|
||||
#include "irq-uart.h"
|
||||
#include "watchdog-reset.h"
|
||||
|
||||
/* External clock frequency */
|
||||
static unsigned long xtal_f __ro_after_init = 12000000;
|
||||
|
@ -229,13 +228,7 @@ core_initcall(s3c64xx_dev_init);
|
|||
|
||||
void __init s3c64xx_init_irq(u32 vic0_valid, u32 vic1_valid)
|
||||
{
|
||||
/*
|
||||
* FIXME: there is no better place to put this at the moment
|
||||
* (s3c64xx_clk_init needs ioremap and must happen before init_time
|
||||
* samsung_wdt_reset_init needs clocks)
|
||||
*/
|
||||
s3c64xx_clk_init(NULL, xtal_f, xusbxti_f, soc_is_s3c6400(), S3C_VA_SYS);
|
||||
samsung_wdt_reset_init(S3C_VA_WATCHDOG);
|
||||
|
||||
printk(KERN_DEBUG "%s: initialising interrupts\n", __func__);
|
||||
|
||||
|
@ -429,12 +422,3 @@ static int __init s3c64xx_init_irq_eint(void)
|
|||
return 0;
|
||||
}
|
||||
arch_initcall(s3c64xx_init_irq_eint);
|
||||
|
||||
void s3c64xx_restart(enum reboot_mode mode, const char *cmd)
|
||||
{
|
||||
if (mode != REBOOT_SOFT)
|
||||
samsung_wdt_reset();
|
||||
|
||||
/* if all else fails, or mode was for soft, jump to 0 */
|
||||
soft_restart(0);
|
||||
}
|
||||
|
|
|
@ -19,8 +19,6 @@
|
|||
void s3c64xx_init_irq(u32 vic0, u32 vic1);
|
||||
void s3c64xx_init_io(struct map_desc *mach_desc, int size);
|
||||
|
||||
void s3c64xx_restart(enum reboot_mode mode, const char *cmd);
|
||||
|
||||
struct device_node;
|
||||
void s3c64xx_set_xtal_freq(unsigned long freq);
|
||||
void s3c64xx_set_xusbxti_freq(unsigned long freq);
|
||||
|
|
|
@ -228,5 +228,4 @@ MACHINE_START(ANW6410, "A&W6410")
|
|||
.map_io = anw6410_map_io,
|
||||
.init_machine = anw6410_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c64xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -877,5 +877,4 @@ MACHINE_START(WLF_CRAGG_6410, "Wolfson Cragganmore 6410")
|
|||
.map_io = crag6410_map_io,
|
||||
.init_machine = crag6410_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c64xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -280,5 +280,4 @@ MACHINE_START(HMT, "Airgoo-HMT")
|
|||
.map_io = hmt_map_io,
|
||||
.init_machine = hmt_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c64xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -362,5 +362,4 @@ MACHINE_START(MINI6410, "MINI6410")
|
|||
.map_io = mini6410_map_io,
|
||||
.init_machine = mini6410_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c64xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -98,5 +98,4 @@ MACHINE_START(NCP, "NCP")
|
|||
.map_io = ncp_map_io,
|
||||
.init_machine = ncp_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c64xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -330,5 +330,4 @@ MACHINE_START(REAL6410, "REAL6410")
|
|||
.map_io = real6410_map_io,
|
||||
.init_machine = real6410_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c64xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#include <mach/map.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "watchdog-reset.h"
|
||||
|
||||
/*
|
||||
* IO mapping for shared system controller IP.
|
||||
|
@ -39,20 +38,6 @@ static void __init s3c64xx_dt_map_io(void)
|
|||
panic("SoC is not S3C64xx!");
|
||||
}
|
||||
|
||||
static void __init s3c64xx_dt_init_machine(void)
|
||||
{
|
||||
samsung_wdt_reset_of_init();
|
||||
}
|
||||
|
||||
static void s3c64xx_dt_restart(enum reboot_mode mode, const char *cmd)
|
||||
{
|
||||
if (mode != REBOOT_SOFT)
|
||||
samsung_wdt_reset();
|
||||
|
||||
/* if all else fails, or mode was for soft, jump to 0 */
|
||||
soft_restart(0);
|
||||
}
|
||||
|
||||
static const char *const s3c64xx_dt_compat[] __initconst = {
|
||||
"samsung,s3c6400",
|
||||
"samsung,s3c6410",
|
||||
|
@ -63,6 +48,4 @@ DT_MACHINE_START(S3C6400_DT, "Samsung S3C64xx (Flattened Device Tree)")
|
|||
/* Maintainer: Tomasz Figa <tomasz.figa@gmail.com> */
|
||||
.dt_compat = s3c64xx_dt_compat,
|
||||
.map_io = s3c64xx_dt_map_io,
|
||||
.init_machine = s3c64xx_dt_init_machine,
|
||||
.restart = s3c64xx_dt_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -151,5 +151,4 @@ MACHINE_START(SMARTQ5, "SmartQ 5")
|
|||
.map_io = smartq_map_io,
|
||||
.init_machine = smartq5_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c64xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -167,5 +167,4 @@ MACHINE_START(SMARTQ7, "SmartQ 7")
|
|||
.map_io = smartq_map_io,
|
||||
.init_machine = smartq7_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c64xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -88,5 +88,4 @@ MACHINE_START(SMDK6400, "SMDK6400")
|
|||
.map_io = smdk6400_map_io,
|
||||
.init_machine = smdk6400_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c64xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -704,5 +704,4 @@ MACHINE_START(SMDK6410, "SMDK6410")
|
|||
.map_io = smdk6410_map_io,
|
||||
.init_machine = smdk6410_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c64xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (c) 2008 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* S3C2410 - System define for arch_reset() function
|
||||
*/
|
||||
|
||||
#ifndef __PLAT_SAMSUNG_WATCHDOG_RESET_H
|
||||
#define __PLAT_SAMSUNG_WATCHDOG_RESET_H
|
||||
|
||||
extern void samsung_wdt_reset(void);
|
||||
extern void samsung_wdt_reset_of_init(void);
|
||||
extern void samsung_wdt_reset_init(void __iomem *base);
|
||||
|
||||
#endif /* __PLAT_SAMSUNG_WATCHDOG_RESET_H */
|
|
@ -290,12 +290,6 @@ config SAMSUNG_WAKEMASK
|
|||
and above. This code allows a set of interrupt to wakeup-mask
|
||||
mappings. See <plat/wakeup-mask.h>
|
||||
|
||||
config SAMSUNG_WDT_RESET
|
||||
bool
|
||||
help
|
||||
Compile support for system restart by triggering watchdog reset.
|
||||
Used on SoCs that do not provide dedicated reset control.
|
||||
|
||||
config DEBUG_S3C_UART
|
||||
depends on PLAT_SAMSUNG
|
||||
int
|
||||
|
|
|
@ -32,4 +32,3 @@ obj-$(CONFIG_SAMSUNG_PM_CHECK) += pm-check.o
|
|||
obj-$(CONFIG_SAMSUNG_PM_DEBUG) += pm-debug.o
|
||||
|
||||
obj-$(CONFIG_SAMSUNG_WAKEMASK) += wakeup-mask.o
|
||||
obj-$(CONFIG_SAMSUNG_WDT_RESET) += watchdog-reset.o
|
||||
|
|
|
@ -1,93 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
//
|
||||
// Copyright (c) 2008 Simtec Electronics
|
||||
// Ben Dooks <ben@simtec.co.uk>
|
||||
//
|
||||
// Copyright (c) 2013 Tomasz Figa <tomasz.figa@gmail.com>
|
||||
//
|
||||
// Watchdog reset support for Samsung SoCs.
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
|
||||
#define S3C2410_WTCON 0x00
|
||||
#define S3C2410_WTDAT 0x04
|
||||
#define S3C2410_WTCNT 0x08
|
||||
|
||||
#define S3C2410_WTCON_ENABLE (1 << 5)
|
||||
#define S3C2410_WTCON_DIV16 (0 << 3)
|
||||
#define S3C2410_WTCON_RSTEN (1 << 0)
|
||||
#define S3C2410_WTCON_PRESCALE(x) ((x) << 8)
|
||||
|
||||
static void __iomem *wdt_base;
|
||||
static struct clk *wdt_clock;
|
||||
|
||||
void samsung_wdt_reset(void)
|
||||
{
|
||||
if (!wdt_base) {
|
||||
pr_err("%s: wdt reset not initialized\n", __func__);
|
||||
/* delay to allow the serial port to show the message */
|
||||
mdelay(50);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IS_ERR(wdt_clock))
|
||||
clk_prepare_enable(wdt_clock);
|
||||
|
||||
/* disable watchdog, to be safe */
|
||||
__raw_writel(0, wdt_base + S3C2410_WTCON);
|
||||
|
||||
/* put initial values into count and data */
|
||||
__raw_writel(0x80, wdt_base + S3C2410_WTCNT);
|
||||
__raw_writel(0x80, wdt_base + S3C2410_WTDAT);
|
||||
|
||||
/* set the watchdog to go and reset... */
|
||||
__raw_writel(S3C2410_WTCON_ENABLE | S3C2410_WTCON_DIV16 |
|
||||
S3C2410_WTCON_RSTEN | S3C2410_WTCON_PRESCALE(0x20),
|
||||
wdt_base + S3C2410_WTCON);
|
||||
|
||||
/* wait for reset to assert... */
|
||||
mdelay(500);
|
||||
|
||||
pr_err("Watchdog reset failed to assert reset\n");
|
||||
|
||||
/* delay to allow the serial port to show the message */
|
||||
mdelay(50);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id s3c2410_wdt_match[] = {
|
||||
{ .compatible = "samsung,s3c2410-wdt" },
|
||||
{ .compatible = "samsung,s3c6410-wdt" },
|
||||
{},
|
||||
};
|
||||
|
||||
void __init samsung_wdt_reset_of_init(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
np = of_find_matching_node(NULL, s3c2410_wdt_match);
|
||||
if (!np) {
|
||||
pr_err("%s: failed to find watchdog node\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
wdt_base = of_iomap(np, 0);
|
||||
if (!wdt_base) {
|
||||
pr_err("%s: failed to map watchdog registers\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
wdt_clock = of_clk_get(np, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
void __init samsung_wdt_reset_init(void __iomem *base)
|
||||
{
|
||||
wdt_base = base;
|
||||
wdt_clock = clk_get(NULL, "watchdog");
|
||||
}
|
Loading…
Reference in New Issue