Marek Szyprowski wrote: > > 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@xxxxxxxxxxx> > Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx> > --- > arch/arm/plat-samsung/clock.c | 11 +++++++++++ > arch/arm/plat-samsung/include/plat/clock.h | 3 +++ > .../arm/plat-samsung/include/plat/watchdog-reset.h | 10 +++------- > 3 files changed, 17 insertions(+), 7 deletions(-) > > > history: > v3: > - moved initialization to arch_initcall, cleaned the code > > v2: > - added missing '__init' section modifiers > > diff --git a/arch/arm/plat-samsung/clock.c b/arch/arm/plat-samsung/clock.c > index 302c426..3b44519 100644 > --- a/arch/arm/plat-samsung/clock.c > +++ b/arch/arm/plat-samsung/clock.c > @@ -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) > diff --git a/arch/arm/plat-samsung/include/plat/clock.h b/arch/arm/plat- > samsung/include/plat/clock.h > index 87d5b38..8f95700 100644 > --- a/arch/arm/plat-samsung/include/plat/clock.h > +++ b/arch/arm/plat-samsung/include/plat/clock.h > @@ -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; > diff --git a/arch/arm/plat-samsung/include/plat/watchdog-reset.h b/arch/arm/plat- > samsung/include/plat/watchdog-reset.h > index 54b762a..40dbb2b 100644 > --- a/arch/arm/plat-samsung/include/plat/watchdog-reset.h > +++ b/arch/arm/plat-samsung/include/plat/watchdog-reset.h > @@ -10,6 +10,7 @@ > * published by the Free Software Foundation. > */ > > +#include <plat/clock.h> > #include <plat/regs-watchdog.h> > #include <mach/map.h> > > @@ -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); > -- > 1.7.1.569.g6f426 Looks ok to me, applied. Thanks. Best regards, Kgene. -- Kukjin Kim <kgene.kim@xxxxxxxxxxx>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd. -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html