Merge tag 'vfio-v3.18-rc1' of git://github.com/awilliam/linux-vfio
[cascardo/linux.git] / drivers / watchdog / ath79_wdt.c
index 399c3fd..41ac466 100644 (file)
@@ -20,6 +20,7 @@
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/bitops.h>
+#include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/fs.h>
 #include <linux/io.h>
@@ -90,6 +91,15 @@ static inline void ath79_wdt_keepalive(void)
 static inline void ath79_wdt_enable(void)
 {
        ath79_wdt_keepalive();
+
+       /*
+        * Updating the TIMER register requires a few microseconds
+        * on the AR934x SoCs at least. Use a small delay to ensure
+        * that the TIMER register is updated within the hardware
+        * before enabling the watchdog.
+        */
+       udelay(2);
+
        ath79_wdt_wr(WDOG_REG_CTRL, WDOG_CTRL_ACTION_FCR);
        /* flush write */
        ath79_wdt_rr(WDOG_REG_CTRL);
@@ -255,7 +265,7 @@ static int ath79_wdt_probe(struct platform_device *pdev)
        if (IS_ERR(wdt_clk))
                return PTR_ERR(wdt_clk);
 
-       err = clk_enable(wdt_clk);
+       err = clk_prepare_enable(wdt_clk);
        if (err)
                return err;
 
@@ -286,14 +296,14 @@ static int ath79_wdt_probe(struct platform_device *pdev)
        return 0;
 
 err_clk_disable:
-       clk_disable(wdt_clk);
+       clk_disable_unprepare(wdt_clk);
        return err;
 }
 
 static int ath79_wdt_remove(struct platform_device *pdev)
 {
        misc_deregister(&ath79_wdt_miscdev);
-       clk_disable(wdt_clk);
+       clk_disable_unprepare(wdt_clk);
        return 0;
 }