lkml.org 
[lkml]   [2009]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH RT 8/6] [ARM, WATCHDOG] davinci: include mach/timex.h in davinci_wdt.c
    From
    Date
    Russell King - ARM Linux <linux@arm.linux.org.uk> 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@deeprootsystems.com>
    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@deeprootsystems.com>
    ---
    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


    \
     
     \ /
      Last update: 2009-08-10 23:07    [W:3.729 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site