summaryrefslogtreecommitdiffstats
path: root/drivers/watchdog/sbsa_gwdt.c
diff options
context:
space:
mode:
authorJayachandran C <jnair@caviumnetworks.com>2018-02-28 11:52:20 +0100
committerWim Van Sebroeck <wim@linux-watchdog.org>2018-03-03 15:52:32 +0100
commit93ac3deb7c220cbcec032a967220a1f109d58431 (patch)
tree8c2778bf30f3104d9a2dfecb008e7cdcddf3e0b3 /drivers/watchdog/sbsa_gwdt.c
parentwatchdog: f71808e_wdt: Fix magic close handling (diff)
downloadlinux-93ac3deb7c220cbcec032a967220a1f109d58431.tar.xz
linux-93ac3deb7c220cbcec032a967220a1f109d58431.zip
watchdog: sbsa: use 32-bit read for WCV
According to SBSA spec v3.1 section 5.3: All registers are 32 bits in size and should be accessed using 32-bit reads and writes. If an access size other than 32 bits is used then the results are IMPLEMENTATION DEFINED. [...] The Generic Watchdog is little-endian The current code uses readq to read the watchdog compare register which does a 64-bit access. This fails on ThunderX2 which does not implement 64-bit access to this register. Fix this by using lo_hi_readq() that does two 32-bit reads. Signed-off-by: Jayachandran C <jnair@caviumnetworks.com> Reviewed-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
Diffstat (limited to '')
-rw-r--r--drivers/watchdog/sbsa_gwdt.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/watchdog/sbsa_gwdt.c b/drivers/watchdog/sbsa_gwdt.c
index 316c2eb122d2..e8bd9887c566 100644
--- a/drivers/watchdog/sbsa_gwdt.c
+++ b/drivers/watchdog/sbsa_gwdt.c
@@ -50,6 +50,7 @@
*/
#include <linux/io.h>
+#include <linux/io-64-nonatomic-lo-hi.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
@@ -159,7 +160,7 @@ static unsigned int sbsa_gwdt_get_timeleft(struct watchdog_device *wdd)
!(readl(gwdt->control_base + SBSA_GWDT_WCS) & SBSA_GWDT_WCS_WS0))
timeleft += readl(gwdt->control_base + SBSA_GWDT_WOR);
- timeleft += readq(gwdt->control_base + SBSA_GWDT_WCV) -
+ timeleft += lo_hi_readq(gwdt->control_base + SBSA_GWDT_WCV) -
arch_counter_get_cntvct();
do_div(timeleft, gwdt->clk);