Merge git://www.linux-watchdog.org/linux-watchdog
[linux-3.10.git] / drivers / watchdog / orion_wdt.c
index 173ddf1..788aa15 100644 (file)
@@ -30,9 +30,9 @@
 /*
  * Watchdog timer block registers.
  */
-#define TIMER_CTRL             (TIMER_VIRT_BASE + 0x0000)
+#define TIMER_CTRL             0x0000
 #define  WDT_EN                        0x0010
-#define WDT_VAL                        (TIMER_VIRT_BASE + 0x0024)
+#define WDT_VAL                        0x0024
 
 #define WDT_MAX_CYCLE_COUNT    0xffffffff
 #define WDT_IN_USE             0
@@ -42,6 +42,7 @@ static bool nowayout = WATCHDOG_NOWAYOUT;
 static int heartbeat = -1;             /* module parameter (seconds) */
 static unsigned int wdt_max_duration;  /* (seconds) */
 static unsigned int wdt_tclk;
+static void __iomem *wdt_reg;
 static unsigned long wdt_status;
 static DEFINE_SPINLOCK(wdt_lock);
 
@@ -50,7 +51,7 @@ static void orion_wdt_ping(void)
        spin_lock(&wdt_lock);
 
        /* Reload watchdog duration */
-       writel(wdt_tclk * heartbeat, WDT_VAL);
+       writel(wdt_tclk * heartbeat, wdt_reg + WDT_VAL);
 
        spin_unlock(&wdt_lock);
 }
@@ -62,7 +63,7 @@ static void orion_wdt_enable(void)
        spin_lock(&wdt_lock);
 
        /* Set watchdog duration */
-       writel(wdt_tclk * heartbeat, WDT_VAL);
+       writel(wdt_tclk * heartbeat, wdt_reg + WDT_VAL);
 
        /* Clear watchdog timer interrupt */
        reg = readl(BRIDGE_CAUSE);
@@ -70,9 +71,9 @@ static void orion_wdt_enable(void)
        writel(reg, BRIDGE_CAUSE);
 
        /* Enable watchdog timer */
-       reg = readl(TIMER_CTRL);
+       reg = readl(wdt_reg + TIMER_CTRL);
        reg |= WDT_EN;
-       writel(reg, TIMER_CTRL);
+       writel(reg, wdt_reg + TIMER_CTRL);
 
        /* Enable reset on watchdog */
        reg = readl(RSTOUTn_MASK);
@@ -94,9 +95,9 @@ static void orion_wdt_disable(void)
        writel(reg, RSTOUTn_MASK);
 
        /* Disable watchdog timer */
-       reg = readl(TIMER_CTRL);
+       reg = readl(wdt_reg + TIMER_CTRL);
        reg &= ~WDT_EN;
-       writel(reg, TIMER_CTRL);
+       writel(reg, wdt_reg + TIMER_CTRL);
 
        spin_unlock(&wdt_lock);
 }
@@ -104,7 +105,7 @@ static void orion_wdt_disable(void)
 static int orion_wdt_get_timeleft(int *time_left)
 {
        spin_lock(&wdt_lock);
-       *time_left = readl(WDT_VAL) / wdt_tclk;
+       *time_left = readl(wdt_reg + WDT_VAL) / wdt_tclk;
        spin_unlock(&wdt_lock);
        return 0;
 }
@@ -237,6 +238,7 @@ static struct miscdevice orion_wdt_miscdev = {
 static int __devinit orion_wdt_probe(struct platform_device *pdev)
 {
        struct orion_wdt_platform_data *pdata = pdev->dev.platform_data;
+       struct resource *res;
        int ret;
 
        if (pdata) {
@@ -246,6 +248,10 @@ static int __devinit orion_wdt_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+       wdt_reg = ioremap(res->start, resource_size(res));
+
        if (orion_wdt_miscdev.parent)
                return -EBUSY;
        orion_wdt_miscdev.parent = &pdev->dev;