bmips: backport accepted watchdog patch
This patch has been accepted for linux v5.14. Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
This commit is contained in:
		| @@ -0,0 +1,86 @@ | |||||||
|  | From e379c2199de4280243e43118dceb4ea5e97059a3 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com> | ||||||
|  | Date: Tue, 23 Feb 2021 09:00:42 +0100 | ||||||
|  | Subject: [PATCH] watchdog: bcm7038_wdt: add big endian support | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | bcm7038_wdt can be used on bmips big endian (bcm63xx) devices too. | ||||||
|  |  | ||||||
|  | Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com> | ||||||
|  | Reviewed-by: Guenter Roeck <linux@roeck-us.net> | ||||||
|  | Link: https://lore.kernel.org/r/20210223080042.29569-1-noltari@gmail.com | ||||||
|  | Signed-off-by: Guenter Roeck <linux@roeck-us.net> | ||||||
|  | Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org> | ||||||
|  | --- | ||||||
|  |  drivers/watchdog/bcm7038_wdt.c | 31 +++++++++++++++++++++++++------ | ||||||
|  |  1 file changed, 25 insertions(+), 6 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/watchdog/bcm7038_wdt.c | ||||||
|  | +++ b/drivers/watchdog/bcm7038_wdt.c | ||||||
|  | @@ -34,6 +34,25 @@ struct bcm7038_watchdog { | ||||||
|  |   | ||||||
|  |  static bool nowayout = WATCHDOG_NOWAYOUT; | ||||||
|  |   | ||||||
|  | +static inline void bcm7038_wdt_write(u32 value, void __iomem *addr) | ||||||
|  | +{ | ||||||
|  | +	/* MIPS chips strapped for BE will automagically configure the | ||||||
|  | +	 * peripheral registers for CPU-native byte order. | ||||||
|  | +	 */ | ||||||
|  | +	if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)) | ||||||
|  | +		__raw_writel(value, addr); | ||||||
|  | +	else | ||||||
|  | +		writel_relaxed(value, addr); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static inline u32 bcm7038_wdt_read(void __iomem *addr) | ||||||
|  | +{ | ||||||
|  | +	if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)) | ||||||
|  | +		return __raw_readl(addr); | ||||||
|  | +	else | ||||||
|  | +		return readl_relaxed(addr); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  static void bcm7038_wdt_set_timeout_reg(struct watchdog_device *wdog) | ||||||
|  |  { | ||||||
|  |  	struct bcm7038_watchdog *wdt = watchdog_get_drvdata(wdog); | ||||||
|  | @@ -41,15 +60,15 @@ static void bcm7038_wdt_set_timeout_reg( | ||||||
|  |   | ||||||
|  |  	timeout = wdt->rate * wdog->timeout; | ||||||
|  |   | ||||||
|  | -	writel(timeout, wdt->base + WDT_TIMEOUT_REG); | ||||||
|  | +	bcm7038_wdt_write(timeout, wdt->base + WDT_TIMEOUT_REG); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static int bcm7038_wdt_ping(struct watchdog_device *wdog) | ||||||
|  |  { | ||||||
|  |  	struct bcm7038_watchdog *wdt = watchdog_get_drvdata(wdog); | ||||||
|  |   | ||||||
|  | -	writel(WDT_START_1, wdt->base + WDT_CMD_REG); | ||||||
|  | -	writel(WDT_START_2, wdt->base + WDT_CMD_REG); | ||||||
|  | +	bcm7038_wdt_write(WDT_START_1, wdt->base + WDT_CMD_REG); | ||||||
|  | +	bcm7038_wdt_write(WDT_START_2, wdt->base + WDT_CMD_REG); | ||||||
|  |   | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  | @@ -66,8 +85,8 @@ static int bcm7038_wdt_stop(struct watch | ||||||
|  |  { | ||||||
|  |  	struct bcm7038_watchdog *wdt = watchdog_get_drvdata(wdog); | ||||||
|  |   | ||||||
|  | -	writel(WDT_STOP_1, wdt->base + WDT_CMD_REG); | ||||||
|  | -	writel(WDT_STOP_2, wdt->base + WDT_CMD_REG); | ||||||
|  | +	bcm7038_wdt_write(WDT_STOP_1, wdt->base + WDT_CMD_REG); | ||||||
|  | +	bcm7038_wdt_write(WDT_STOP_2, wdt->base + WDT_CMD_REG); | ||||||
|  |   | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  | @@ -88,7 +107,7 @@ static unsigned int bcm7038_wdt_get_time | ||||||
|  |  	struct bcm7038_watchdog *wdt = watchdog_get_drvdata(wdog); | ||||||
|  |  	u32 time_left; | ||||||
|  |   | ||||||
|  | -	time_left = readl(wdt->base + WDT_CMD_REG); | ||||||
|  | +	time_left = bcm7038_wdt_read(wdt->base + WDT_CMD_REG); | ||||||
|  |   | ||||||
|  |  	return time_left / wdt->rate; | ||||||
|  |  } | ||||||
| @@ -1,66 +0,0 @@ | |||||||
| --- a/drivers/watchdog/bcm7038_wdt.c |  | ||||||
| +++ b/drivers/watchdog/bcm7038_wdt.c |  | ||||||
| @@ -34,6 +34,24 @@ struct bcm7038_watchdog { |  | ||||||
|   |  | ||||||
|  static bool nowayout = WATCHDOG_NOWAYOUT; |  | ||||||
|   |  | ||||||
| +static inline void bcm7038_wdt_write(unsigned long data, void __iomem *reg) |  | ||||||
| +{ |  | ||||||
| +#ifdef CONFIG_CPU_BIG_ENDIAN |  | ||||||
| +	iowrite32be(data, reg); |  | ||||||
| +#else |  | ||||||
| +	writel(data, reg); |  | ||||||
| +#endif |  | ||||||
| +} |  | ||||||
| + |  | ||||||
| +static inline unsigned long bcm7038_wdt_read(void __iomem *reg) |  | ||||||
| +{ |  | ||||||
| +#ifdef CONFIG_CPU_BIG_ENDIAN |  | ||||||
| +	return ioread32be(reg); |  | ||||||
| +#else |  | ||||||
| +	return readl(reg); |  | ||||||
| +#endif |  | ||||||
| +} |  | ||||||
| + |  | ||||||
|  static void bcm7038_wdt_set_timeout_reg(struct watchdog_device *wdog) |  | ||||||
|  { |  | ||||||
|  	struct bcm7038_watchdog *wdt = watchdog_get_drvdata(wdog); |  | ||||||
| @@ -41,15 +59,15 @@ static void bcm7038_wdt_set_timeout_reg( |  | ||||||
|   |  | ||||||
|  	timeout = wdt->rate * wdog->timeout; |  | ||||||
|   |  | ||||||
| -	writel(timeout, wdt->base + WDT_TIMEOUT_REG); |  | ||||||
| +	bcm7038_wdt_write(timeout, wdt->base + WDT_TIMEOUT_REG); |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|  static int bcm7038_wdt_ping(struct watchdog_device *wdog) |  | ||||||
|  { |  | ||||||
|  	struct bcm7038_watchdog *wdt = watchdog_get_drvdata(wdog); |  | ||||||
|   |  | ||||||
| -	writel(WDT_START_1, wdt->base + WDT_CMD_REG); |  | ||||||
| -	writel(WDT_START_2, wdt->base + WDT_CMD_REG); |  | ||||||
| +	bcm7038_wdt_write(WDT_START_1, wdt->base + WDT_CMD_REG); |  | ||||||
| +	bcm7038_wdt_write(WDT_START_2, wdt->base + WDT_CMD_REG); |  | ||||||
|   |  | ||||||
|  	return 0; |  | ||||||
|  } |  | ||||||
| @@ -66,8 +84,8 @@ static int bcm7038_wdt_stop(struct watch |  | ||||||
|  { |  | ||||||
|  	struct bcm7038_watchdog *wdt = watchdog_get_drvdata(wdog); |  | ||||||
|   |  | ||||||
| -	writel(WDT_STOP_1, wdt->base + WDT_CMD_REG); |  | ||||||
| -	writel(WDT_STOP_2, wdt->base + WDT_CMD_REG); |  | ||||||
| +	bcm7038_wdt_write(WDT_STOP_1, wdt->base + WDT_CMD_REG); |  | ||||||
| +	bcm7038_wdt_write(WDT_STOP_2, wdt->base + WDT_CMD_REG); |  | ||||||
|   |  | ||||||
|  	return 0; |  | ||||||
|  } |  | ||||||
| @@ -88,7 +106,7 @@ static unsigned int bcm7038_wdt_get_time |  | ||||||
|  	struct bcm7038_watchdog *wdt = watchdog_get_drvdata(wdog); |  | ||||||
|  	u32 time_left; |  | ||||||
|   |  | ||||||
| -	time_left = readl(wdt->base + WDT_CMD_REG); |  | ||||||
| +	time_left = bcm7038_wdt_read(wdt->base + WDT_CMD_REG); |  | ||||||
|   |  | ||||||
|  	return time_left / wdt->rate; |  | ||||||
|  } |  | ||||||
		Reference in New Issue
	
	Block a user
	 Álvaro Fernández Rojas
					Álvaro Fernández Rojas