Hello, On Friday, August 19, 2011 3:06 PM Kukjin Kim wrote: > 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 good but happens following: > > Hmm... > With s3c2410_defconfig: > > In file included from arch/arm/plat-s3c24xx/cpu.c:48: > arch/arm/plat-samsung/include/plat/clock.h:32: error: redefinition of > 'struct clk_ops' > arch/arm/plat-samsung/include/plat/clock.h:39: error: redefinition of > 'struct clk' > arch/arm/plat-samsung/include/plat/clock.h:60: error: conflicting types for > 's3c24xx_dclk0' > arch/arm/plat-samsung/include/plat/clock.h:60: note: previous declaration of > 's3c24xx_dclk0' was here > arch/arm/plat-samsung/include/plat/clock.h:61: error: conflicting types for > 's3c24xx_dclk1' > arch/arm/plat-samsung/include/plat/clock.h:61: note: previous declaration of > 's3c24xx_dclk1' was here > arch/arm/plat-samsung/include/plat/clock.h:62: error: conflicting types for > 's3c24xx_clkout0' > arch/arm/plat-samsung/include/plat/clock.h:62: note: previous declaration of > 's3c24xx_clkout0' was here > > (snip) > > arch/arm/plat-samsung/include/plat/clock.h:101: error: conflicting types for > 's3c_disable_clocks' > arch/arm/plat-samsung/include/plat/clock.h:101: note: previous declaration > of 's3c_disable_clocks' was here > arch/arm/plat-samsung/include/plat/clock.h:118: error: conflicting types for > 's3c64xx_sclk_ctrl' > arch/arm/plat-samsung/include/plat/clock.h:118: note: previous declaration > of 's3c64xx_sclk_ctrl' was here > arch/arm/plat-samsung/include/plat/clock.h:126: error: conflicting types for > 's3c2410_wdtclk' > arch/arm/plat-samsung/include/plat/clock.h:126: note: previous declaration > of 's3c2410_wdtclk' was here > make[1]: *** [arch/arm/plat-s3c24xx/cpu.o] Error 1 > make[1]: *** Waiting for unfinished jobs.... > make: *** [arch/arm/plat-s3c24xx] Error 2 > make: *** Waiting for unfinished jobs.... > > And, with s5p64x0_defconfig: > > CHK include/linux/version.h > CHK include/generated/utsrelease.h > make[1]: `include/generated/mach-types.h' is up to date. > CALL scripts/checksyscalls.sh > CHK include/generated/compile.h > KSYM .tmp_kallsyms1.S > AS .tmp_kallsyms1.o > LD .tmp_vmlinux2 > KSYM .tmp_kallsyms2.S > AS .tmp_kallsyms2.o > LD vmlinux > SYSMAP System.map > SYSMAP .tmp_System.map > Inconsistent kallsyms data > This is a bug - please report about it > Try make KALLSYMS_EXTRA_PASS=1 as a workaround > make: *** [vmlinux] Error 1 > > > The building error of s3c2410_defconfig can be fixed with below. > --- > commit c5f80e2eb419437a7e4272d28bc7258b650b0934 > Author: Kukjin Kim <kgene.kim@xxxxxxxxxxx> > Date: Fri Aug 19 21:12:19 2011 +0900 > > ARM: SAMSUNG: fix to prevent declaring duplicated > > The plat/clock.h revised to prevent declaring duplicated. > > Signed-off-by: Kukjin Kim <kgene.kim@xxxxxxxxxxx> > > diff --git a/arch/arm/plat-samsung/include/plat/clock.h > b/arch/arm/plat-samsung/include/plat/clock.h > index 8f95700..092be14 100644 > --- a/arch/arm/plat-samsung/include/plat/clock.h > +++ b/arch/arm/plat-samsung/include/plat/clock.h > @@ -9,6 +9,9 @@ > * published by the Free Software Foundation. > */ > > +#ifndef __ASM_PLAT_CLOCK_H > +#define __ASM_PLAT_CLOCK_H __FILE__ > + > #include <linux/spinlock.h> > #include <linux/clkdev.h> > > @@ -124,3 +127,5 @@ extern void s3c_pwmclk_init(void); > /* Global watchdog clock used by arch_wtd_reset() callback */ > > extern struct clk *s3c2410_wdtclk; > + > +#endif /* __ASM_PLAT_CLOCK_H */ > --- > > But, the error of s5p64x0_defconfig happens still :( Well, this issue is definitely not related to my patch. The strange thing is the fact that it builds here correctly with s5p64x0_defconfig. Best regards -- Marek Szyprowski Samsung Poland R&D Center -- 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