Russell King - ARM Linux <linux@xxxxxxxxxxxxxxxx> writes: > On Mon, Aug 10, 2009 at 09:48:07AM -0700, Kevin Hilman wrote: >> diff --git a/drivers/watchdog/davinci_wdt.c b/drivers/watchdog/davinci_wdt.c >> index 83e22e7..5ed89e4 100644 >> --- a/drivers/watchdog/davinci_wdt.c >> +++ b/drivers/watchdog/davinci_wdt.c >> @@ -25,6 +25,7 @@ >> #include <linux/uaccess.h> >> #include <linux/io.h> >> #include <linux/device.h> >> +#include <linux/clk.h> >> >> #define MODULE_NAME "DAVINCI-WDT: " >> >> @@ -69,6 +70,7 @@ static unsigned long wdt_status; >> >> static struct resource *wdt_mem; >> static void __iomem *wdt_base; >> +struct clk *wdt_clk; > > Why the random spacing? oops, not tabified. >> >> static void wdt_service(void) >> { >> @@ -86,6 +88,10 @@ static void wdt_enable(void) >> { >> u32 tgcr; >> u32 timer_margin; >> + u32 wdt_freq; >> + >> + BUG_ON(!wdt_clk); > > BUG_ON here is not required (and wrong). removed. >> + wdt_freq = clk_get_rate(wdt_clk); >> >> spin_lock(&io_lock); >> >> @@ -99,9 +105,9 @@ static void wdt_enable(void) >> iowrite32(0, wdt_base + TIM12); >> iowrite32(0, wdt_base + TIM34); >> /* set timeout period */ >> - timer_margin = (((u64)heartbeat * CLOCK_TICK_RATE) & 0xffffffff); >> + timer_margin = (((u64)heartbeat * wdt_freq) & 0xffffffff); >> iowrite32(timer_margin, wdt_base + PRD12); >> - timer_margin = (((u64)heartbeat * CLOCK_TICK_RATE) >> 32); >> + timer_margin = (((u64)heartbeat * wdt_freq) >> 32); >> iowrite32(timer_margin, wdt_base + PRD34); >> /* enable run continuously */ >> iowrite32(ENAMODE12_PERIODIC, wdt_base + TCR); >> @@ -199,6 +205,11 @@ static int __devinit davinci_wdt_probe(struct platform_device *pdev) >> struct resource *res; >> struct device *dev = &pdev->dev; >> >> + wdt_clk = clk_get(dev, NULL); >> + if (WARN_ON(!wdt_clk)) >> + return -ENODEV; > > if (WARN_ON(IS_ERR(wdt_clk))) > return PTR_ERR(wdt_clk); fixed. >> + clk_enable(wdt_clk); >> + >> if (heartbeat < 1 || heartbeat > MAX_HEARTBEAT) >> heartbeat = DEFAULT_HEARTBEAT; >> >> @@ -245,6 +256,12 @@ static int __devexit davinci_wdt_remove(struct platform_device *pdev) >> kfree(wdt_mem); >> wdt_mem = NULL; >> } >> + >> + if (wdt_clk) { > > NULL check is not required. removed. >> + clk_disable(wdt_clk); >> + clk_put(wdt_clk); >> + } >> + >> return 0; >> } >> >> -- Updated version: >From c7b99413b5323a5f7faa00e86d623b0711fcd0d0 Mon Sep 17 00:00:00 2001 From: Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx> Date: Tue, 10 Feb 2009 20:30:37 -0800 Subject: [PATCH] watchdog: davinci: use clock framework for timer frequency Remove use of CLOCK_TICK_RATE in favor of using clock framework for getting timer frequency. Signed-off-by: Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx> --- drivers/watchdog/davinci_wdt.c | 19 +++++++++++++++++-- 1 files changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/watchdog/davinci_wdt.c b/drivers/watchdog/davinci_wdt.c index 83e22e7..43c42f5 100644 --- a/drivers/watchdog/davinci_wdt.c +++ b/drivers/watchdog/davinci_wdt.c @@ -25,6 +25,7 @@ #include <linux/uaccess.h> #include <linux/io.h> #include <linux/device.h> +#include <linux/clk.h> #define MODULE_NAME "DAVINCI-WDT: " @@ -69,6 +70,7 @@ static unsigned long wdt_status; static struct resource *wdt_mem; static void __iomem *wdt_base; +struct clk *wdt_clk; static void wdt_service(void) { @@ -86,6 +88,9 @@ static void wdt_enable(void) { u32 tgcr; u32 timer_margin; + u32 wdt_freq; + + wdt_freq = clk_get_rate(wdt_clk); spin_lock(&io_lock); @@ -99,9 +104,9 @@ static void wdt_enable(void) iowrite32(0, wdt_base + TIM12); iowrite32(0, wdt_base + TIM34); /* set timeout period */ - timer_margin = (((u64)heartbeat * CLOCK_TICK_RATE) & 0xffffffff); + timer_margin = (((u64)heartbeat * wdt_freq) & 0xffffffff); iowrite32(timer_margin, wdt_base + PRD12); - timer_margin = (((u64)heartbeat * CLOCK_TICK_RATE) >> 32); + timer_margin = (((u64)heartbeat * wdt_freq) >> 32); iowrite32(timer_margin, wdt_base + PRD34); /* enable run continuously */ iowrite32(ENAMODE12_PERIODIC, wdt_base + TCR); @@ -199,6 +204,12 @@ static int __devinit davinci_wdt_probe(struct platform_device *pdev) struct resource *res; struct device *dev = &pdev->dev; + wdt_clk = clk_get(dev, NULL); + if (WARN_ON(IS_ERR(wdt_clk))) + return PTR_ERR(wdt_clk); + + clk_enable(wdt_clk); + if (heartbeat < 1 || heartbeat > MAX_HEARTBEAT) heartbeat = DEFAULT_HEARTBEAT; @@ -245,6 +256,10 @@ static int __devexit davinci_wdt_remove(struct platform_device *pdev) kfree(wdt_mem); wdt_mem = NULL; } + + clk_disable(wdt_clk); + clk_put(wdt_clk); + return 0; } -- 1.6.3.3 -- To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html