]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
tegra: wdt: Add KEEPALIVE function to WDT driver
authorKamal Kannan Balagopalan <kbalagopalan@nvidia.com>
Tue, 24 Jan 2012 06:46:09 +0000 (22:46 -0800)
committerDan Willemsen <dwillemsen@nvidia.com>
Sat, 14 Sep 2013 08:31:55 +0000 (01:31 -0700)
Add KEEPALIVE functionality to Tegra WDT driver for use by user space
applications.

Bug 887733

Reviewed-on: http://git-master/r/77135

Change-Id: I966371bc5db34416de08c8dc2af9069b4bd34c5d
Signed-off-by: Kamal Kannan Balagopalan <kbalagopalan@nvidia.com>
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
Reviewed-on: http://git-master/r/77750
Reviewed-by: Automatic_Commit_Validation_User
Rebase-Id: Rad0e04efb1386d078f4359f85c0ba671a3f8c43a

drivers/watchdog/tegra_wdt.c

index c7ebab7a4512d3bfc9d757bd0bee18fa2073f1a1..986c3a0d57254de7d018dbca9f3f823afc2e423f 100644 (file)
@@ -91,6 +91,11 @@ static void tegra_wdt_disable(struct tegra_wdt *wdt)
        writel(0, wdt->wdt_timer + TIMER_PTV);
 }
 
+static inline void tegra_wdt_ping(struct tegra_wdt *wdt)
+{
+       return;
+}
+
 static irqreturn_t tegra_wdt_interrupt(int irq, void *dev_id)
 {
        struct tegra_wdt *wdt = dev_id;
@@ -134,15 +139,21 @@ static void tegra_wdt_set_timeout(struct tegra_wdt *wdt, int sec)
        }
 }
 
+static inline void tegra_wdt_ping(struct tegra_wdt *wdt)
+{
+       writel(WDT_CMD_START_COUNTER, wdt->wdt_source + WDT_CMD);
+}
+
 static void tegra_wdt_enable(struct tegra_wdt *wdt)
 {
        u32 val;
 
+       writel(TIMER_PCR_INTR, wdt->wdt_timer + TIMER_PCR);
        val = (wdt->timeout * 1000000ul) / 4;
        val |= (TIMER_EN | TIMER_PERIODIC);
        writel(val, wdt->wdt_timer + TIMER_PTV);
 
-       val = WDT_CFG_TMR_SRC | WDT_CFG_PERIOD | WDT_CFG_INT_EN |
+       val = WDT_CFG_TMR_SRC | WDT_CFG_PERIOD | /*WDT_CFG_INT_EN |*/
                /*WDT_CFG_SYS_RST_EN |*/ WDT_CFG_PMC2CAR_RST_EN;
        writel(val, wdt->wdt_source + WDT_CFG);
        writel(WDT_CMD_START_COUNTER, wdt->wdt_source + WDT_CMD);
@@ -160,7 +171,7 @@ static irqreturn_t tegra_wdt_interrupt(int irq, void *dev_id)
 {
        struct tegra_wdt *wdt = dev_id;
 
-       writel(WDT_CMD_START_COUNTER, wdt->wdt_source + WDT_CMD);
+       tegra_wdt_ping(wdt);
        return IRQ_HANDLED;
 }
 #endif
@@ -222,6 +233,9 @@ static long tegra_wdt_ioctl(struct file *file, unsigned int cmd,
                return put_user(0, (int __user *)arg);
 
        case WDIOC_KEEPALIVE:
+               spin_lock(&lock);
+               tegra_wdt_ping(wdt);
+               spin_unlock(&lock);
                return 0;
 
        case WDIOC_SETTIMEOUT: