Commit caf27307 authored by Marek Szyprowski's avatar Marek Szyprowski Committed by Kukjin Kim

ARM: SAMSUNG: fix watchdog reset issue with clk_get()

clkdev framework uses global mutex to protect clock tree, so it is not
possible to call clk_get() in interrupt context. This patch fixes this
issue and makes system reset by watchdog call working again.
Signed-off-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarKukjin Kim <kgene.kim@samsung.com>
parent 0685d5ec
...@@ -64,6 +64,17 @@ static LIST_HEAD(clocks); ...@@ -64,6 +64,17 @@ static LIST_HEAD(clocks);
*/ */
DEFINE_SPINLOCK(clocks_lock); DEFINE_SPINLOCK(clocks_lock);
/* Global watchdog clock used by arch_wtd_reset() callback */
struct clk *s3c2410_wdtclk;
static int __init s3c_wdt_reset_init(void)
{
s3c2410_wdtclk = clk_get(NULL, "watchdog");
if (IS_ERR(s3c2410_wdtclk))
printk(KERN_WARNING "%s: warning: cannot get watchdog clock\n", __func__);
return 0;
}
arch_initcall(s3c_wdt_reset_init);
/* enable and disable calls for use with the clk struct */ /* enable and disable calls for use with the clk struct */
static int clk_null_enable(struct clk *clk, int enable) static int clk_null_enable(struct clk *clk, int enable)
......
...@@ -121,3 +121,6 @@ extern int s3c64xx_sclk_ctrl(struct clk *clk, int enable); ...@@ -121,3 +121,6 @@ extern int s3c64xx_sclk_ctrl(struct clk *clk, int enable);
extern void s3c_pwmclk_init(void); extern void s3c_pwmclk_init(void);
/* Global watchdog clock used by arch_wtd_reset() callback */
extern struct clk *s3c2410_wdtclk;
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <plat/clock.h>
#include <plat/regs-watchdog.h> #include <plat/regs-watchdog.h>
#include <mach/map.h> #include <mach/map.h>
...@@ -19,17 +20,12 @@ ...@@ -19,17 +20,12 @@
static inline void arch_wdt_reset(void) static inline void arch_wdt_reset(void)
{ {
struct clk *wdtclk;
printk("arch_reset: attempting watchdog reset\n"); printk("arch_reset: attempting watchdog reset\n");
__raw_writel(0, S3C2410_WTCON); /* disable watchdog, to be safe */ __raw_writel(0, S3C2410_WTCON); /* disable watchdog, to be safe */
wdtclk = clk_get(NULL, "watchdog"); if (s3c2410_wdtclk)
if (!IS_ERR(wdtclk)) { clk_enable(s3c2410_wdtclk);
clk_enable(wdtclk);
} else
printk(KERN_WARNING "%s: warning: cannot get watchdog clock\n", __func__);
/* put initial values into count and data */ /* put initial values into count and data */
__raw_writel(0x80, S3C2410_WTCNT); __raw_writel(0x80, S3C2410_WTCNT);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment