Skip to content

Commit

Permalink
ARM: SAMSUNG: fix watchdog reset issue with clk_get()
Browse files Browse the repository at this point in the history
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: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
  • Loading branch information
Marek Szyprowski authored and Kukjin Kim committed Sep 15, 2011
1 parent 0685d5e commit caf2730
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 7 deletions.
11 changes: 11 additions & 0 deletions arch/arm/plat-samsung/clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,17 @@ static LIST_HEAD(clocks);
*/
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 */

static int clk_null_enable(struct clk *clk, int enable)
Expand Down
3 changes: 3 additions & 0 deletions arch/arm/plat-samsung/include/plat/clock.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,3 +121,6 @@ extern int s3c64xx_sclk_ctrl(struct clk *clk, int enable);

extern void s3c_pwmclk_init(void);

/* Global watchdog clock used by arch_wtd_reset() callback */

extern struct clk *s3c2410_wdtclk;
10 changes: 3 additions & 7 deletions arch/arm/plat-samsung/include/plat/watchdog-reset.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
* published by the Free Software Foundation.
*/

#include <plat/clock.h>
#include <plat/regs-watchdog.h>
#include <mach/map.h>

Expand All @@ -19,17 +20,12 @@

static inline void arch_wdt_reset(void)
{
struct clk *wdtclk;

printk("arch_reset: attempting watchdog reset\n");

__raw_writel(0, S3C2410_WTCON); /* disable watchdog, to be safe */

wdtclk = clk_get(NULL, "watchdog");
if (!IS_ERR(wdtclk)) {
clk_enable(wdtclk);
} else
printk(KERN_WARNING "%s: warning: cannot get watchdog clock\n", __func__);
if (s3c2410_wdtclk)
clk_enable(s3c2410_wdtclk);

/* put initial values into count and data */
__raw_writel(0x80, S3C2410_WTCNT);
Expand Down

0 comments on commit caf2730

Please sign in to comment.