e4fc24a92e68535ae0e072b232ac6a2c6a2fbedb
[openwrt/staging/noltari.git] / target / linux / bmips / patches-5.10 / 204-wdt-bcm7038-add-big-endian-compatibility.patch
1 --- a/drivers/watchdog/bcm7038_wdt.c
2 +++ b/drivers/watchdog/bcm7038_wdt.c
3 @@ -34,6 +34,24 @@ struct bcm7038_watchdog {
4
5 static bool nowayout = WATCHDOG_NOWAYOUT;
6
7 +static inline void bcm7038_wdt_write(unsigned long data, void __iomem *reg)
8 +{
9 +#ifdef CONFIG_CPU_BIG_ENDIAN
10 + iowrite32be(data, reg);
11 +#else
12 + writel(data, reg);
13 +#endif
14 +}
15 +
16 +static inline unsigned long bcm7038_wdt_read(void __iomem *reg)
17 +{
18 +#ifdef CONFIG_CPU_BIG_ENDIAN
19 + return ioread32be(reg);
20 +#else
21 + return readl(reg);
22 +#endif
23 +}
24 +
25 static void bcm7038_wdt_set_timeout_reg(struct watchdog_device *wdog)
26 {
27 struct bcm7038_watchdog *wdt = watchdog_get_drvdata(wdog);
28 @@ -41,15 +59,15 @@ static void bcm7038_wdt_set_timeout_reg(
29
30 timeout = wdt->rate * wdog->timeout;
31
32 - writel(timeout, wdt->base + WDT_TIMEOUT_REG);
33 + bcm7038_wdt_write(timeout, wdt->base + WDT_TIMEOUT_REG);
34 }
35
36 static int bcm7038_wdt_ping(struct watchdog_device *wdog)
37 {
38 struct bcm7038_watchdog *wdt = watchdog_get_drvdata(wdog);
39
40 - writel(WDT_START_1, wdt->base + WDT_CMD_REG);
41 - writel(WDT_START_2, wdt->base + WDT_CMD_REG);
42 + bcm7038_wdt_write(WDT_START_1, wdt->base + WDT_CMD_REG);
43 + bcm7038_wdt_write(WDT_START_2, wdt->base + WDT_CMD_REG);
44
45 return 0;
46 }
47 @@ -66,8 +84,8 @@ static int bcm7038_wdt_stop(struct watch
48 {
49 struct bcm7038_watchdog *wdt = watchdog_get_drvdata(wdog);
50
51 - writel(WDT_STOP_1, wdt->base + WDT_CMD_REG);
52 - writel(WDT_STOP_2, wdt->base + WDT_CMD_REG);
53 + bcm7038_wdt_write(WDT_STOP_1, wdt->base + WDT_CMD_REG);
54 + bcm7038_wdt_write(WDT_STOP_2, wdt->base + WDT_CMD_REG);
55
56 return 0;
57 }
58 @@ -88,7 +106,7 @@ static unsigned int bcm7038_wdt_get_time
59 struct bcm7038_watchdog *wdt = watchdog_get_drvdata(wdog);
60 u32 time_left;
61
62 - time_left = readl(wdt->base + WDT_CMD_REG);
63 + time_left = bcm7038_wdt_read(wdt->base + WDT_CMD_REG);
64
65 return time_left / wdt->rate;
66 }