projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
watchdog: ath79_wdt: switch to clk_prepare/clk_disable
[firefly-linux-kernel-4.4.55.git]
/
drivers
/
watchdog
/
ath79_wdt.c
diff --git
a/drivers/watchdog/ath79_wdt.c
b/drivers/watchdog/ath79_wdt.c
index 399c3fddecf6471ac12296ba028f296e54327e43..41ac4660fb891db2fba16b66c73c6293bfe2b3f4 100644
(file)
--- a/
drivers/watchdog/ath79_wdt.c
+++ b/
drivers/watchdog/ath79_wdt.c
@@
-20,6
+20,7
@@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/bitops.h>
#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>
#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();
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);
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);
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;
if (err)
return err;
@@
-286,14
+296,14
@@
static int ath79_wdt_probe(struct platform_device *pdev)
return 0;
err_clk_disable:
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);
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;
}
return 0;
}