diff options
author | Imre Kaloz <kaloz@openwrt.org> | 2012-02-11 15:58:14 +0000 |
---|---|---|
committer | Imre Kaloz <kaloz@openwrt.org> | 2012-02-11 15:58:14 +0000 |
commit | 1fb5ff4e04818660b188e90d1b33908b30e1df2d (patch) | |
tree | de85fd26d97fab8bd4b54864f5750a2e1855a0c8 /target/linux/cns3xxx/patches-2.6.39/053-cns3xxx_wdt.patch | |
parent | 34a9ccf544d7456fd05863f226ba955d4867c208 (diff) | |
download | master-31e0f0ae-1fb5ff4e04818660b188e90d1b33908b30e1df2d.tar.gz master-31e0f0ae-1fb5ff4e04818660b188e90d1b33908b30e1df2d.tar.bz2 master-31e0f0ae-1fb5ff4e04818660b188e90d1b33908b30e1df2d.zip |
rename 2.6.39 patches directory
SVN-Revision: 30453
Diffstat (limited to 'target/linux/cns3xxx/patches-2.6.39/053-cns3xxx_wdt.patch')
-rw-r--r-- | target/linux/cns3xxx/patches-2.6.39/053-cns3xxx_wdt.patch | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/target/linux/cns3xxx/patches-2.6.39/053-cns3xxx_wdt.patch b/target/linux/cns3xxx/patches-2.6.39/053-cns3xxx_wdt.patch new file mode 100644 index 0000000000..85a73ab1dd --- /dev/null +++ b/target/linux/cns3xxx/patches-2.6.39/053-cns3xxx_wdt.patch @@ -0,0 +1,77 @@ +--- a/drivers/watchdog/Kconfig ++++ b/drivers/watchdog/Kconfig +@@ -188,7 +188,7 @@ config SA1100_WATCHDOG + + config MPCORE_WATCHDOG + tristate "MPcore watchdog" +- depends on HAVE_ARM_TWD ++ depends on ARCH_CNS3XXX + help + Watchdog timer embedded into the MPcore system. + +--- a/drivers/watchdog/mpcore_wdt.c ++++ b/drivers/watchdog/mpcore_wdt.c +@@ -32,11 +32,14 @@ + #include <linux/uaccess.h> + #include <linux/slab.h> + #include <linux/io.h> ++#include <linux/jiffies.h> ++#include <linux/delay.h> + + #include <asm/smp_twd.h> + + struct mpcore_wdt { + unsigned long timer_alive; ++ unsigned long timer_rate; + struct device *dev; + void __iomem *base; + int irq; +@@ -98,14 +101,12 @@ static void mpcore_wdt_keepalive(struct + unsigned long count; + + spin_lock(&wdt_lock); +- /* Assume prescale is set to 256 */ +- count = __raw_readl(wdt->base + TWD_WDOG_COUNTER); +- count = (0xFFFFFFFFU - count) * (HZ / 5); +- count = (count / 256) * mpcore_margin; ++ count = (wdt->timer_rate / 256) * mpcore_margin; + + /* Reload the counter */ + writel(count + wdt->perturb, wdt->base + TWD_WDOG_LOAD); + wdt->perturb = wdt->perturb ? 0 : 1; ++ + spin_unlock(&wdt_lock); + } + +@@ -329,6 +330,8 @@ static int __devinit mpcore_wdt_probe(st + struct mpcore_wdt *wdt; + struct resource *res; + int ret; ++ unsigned long count; ++ u64 waitjiffies; + + /* We only accept one device, and it must have an id of -1 */ + if (dev->id != -1) +@@ -375,6 +378,22 @@ static int __devinit mpcore_wdt_probe(st + goto err_irq; + } + ++ waitjiffies = get_jiffies_64() + 1; ++ while (get_jiffies_64() < waitjiffies) ++ udelay(10); ++ ++ waitjiffies += 5; ++ ++ __raw_writel(0x00000001, wdt->base + TWD_WDOG_CONTROL); ++ __raw_writel(0xFFFFFFFFU, wdt->base + TWD_WDOG_LOAD); ++ ++ while (get_jiffies_64() < waitjiffies) ++ udelay(10); ++ ++ count = __raw_readl(wdt->base + TWD_WDOG_COUNTER); ++ ++ wdt->timer_rate = (0xFFFFFFFFU - count) * (HZ / 5); ++ + mpcore_wdt_stop(wdt); + platform_set_drvdata(dev, wdt); + mpcore_wdt_dev = dev; |