LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH 0/5] Enhance support for the SP805 WDT
@ 2018-05-22 18:47 Ray Jui
2018-05-22 18:47 ` [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805 Ray Jui
` (4 more replies)
0 siblings, 5 replies; 26+ messages in thread
From: Ray Jui @ 2018-05-22 18:47 UTC (permalink / raw)
To: Wim Van Sebroeck, Guenter Roeck, Rob Herring, Mark Rutland,
Frank Rowand, Catalin Marinas, Will Deacon
Cc: linux-watchdog, devicetree, linux-arm-kernel, linux-kernel,
bcm-kernel-feedback-list, Ray Jui
This patch series enhances the support for the SP805 watchdog timer.
First of all, 'timeout-sec' devicetree property is added. In addition,
support is also added to allow the driver to reset the watchdog if it
has been detected that watchdot has been started in the bootloader. In
this case, the driver will initiate the ping service from the kernel
watchdog subsystem, before a user mode daemon takes over. This series
also enables SP805 in the default ARM64 defconfig
This patch series is based off v4.17-rc5 and is available on GIHUB:
repo: https://github.com/Broadcom/arm64-linux.git
branch: sp805-wdt-v1
Ray Jui (5):
Documentation: DT: Add optional 'timeout-sec' property for sp805
watchdog: sp805: add 'timeout-sec' DT property support
watchdog: sp805: set WDOG_HW_RUNNING when appropriate
arm64: dt: set initial SR watchdog timeout to 60 seconds
arm64: defconfig: add CONFIG_ARM_SP805_WATCHDOG
.../devicetree/bindings/watchdog/sp805-wdt.txt | 2 ++
.../arm64/boot/dts/broadcom/stingray/stingray.dtsi | 1 +
arch/arm64/configs/defconfig | 1 +
drivers/watchdog/sp805_wdt.c | 31 +++++++++++++++++++++-
4 files changed, 34 insertions(+), 1 deletion(-)
--
2.1.4
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805
2018-05-22 18:47 [PATCH 0/5] Enhance support for the SP805 WDT Ray Jui
@ 2018-05-22 18:47 ` Ray Jui
2018-05-22 20:56 ` Guenter Roeck
2018-05-23 10:57 ` Robin Murphy
2018-05-22 18:47 ` [PATCH 2/5] watchdog: sp805: add 'timeout-sec' DT property support Ray Jui
` (3 subsequent siblings)
4 siblings, 2 replies; 26+ messages in thread
From: Ray Jui @ 2018-05-22 18:47 UTC (permalink / raw)
To: Wim Van Sebroeck, Guenter Roeck, Rob Herring, Mark Rutland,
Frank Rowand, Catalin Marinas, Will Deacon
Cc: linux-watchdog, devicetree, linux-arm-kernel, linux-kernel,
bcm-kernel-feedback-list, Ray Jui
Update the SP805 binding document to add optional 'timeout-sec'
devicetree property
Signed-off-by: Ray Jui <ray.jui@broadcom.com>
Reviewed-by: Scott Branden <scott.branden@broadcom.com>
---
Documentation/devicetree/bindings/watchdog/sp805-wdt.txt | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
index edc4f0e..f898a86 100644
--- a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
+++ b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
@@ -19,6 +19,8 @@ Required properties:
Optional properties:
- interrupts : Should specify WDT interrupt number.
+- timeout-sec : Should specify default WDT timeout in seconds. If unset, the
+ default timeout is 30 seconds
Examples:
--
2.1.4
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 2/5] watchdog: sp805: add 'timeout-sec' DT property support
2018-05-22 18:47 [PATCH 0/5] Enhance support for the SP805 WDT Ray Jui
2018-05-22 18:47 ` [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805 Ray Jui
@ 2018-05-22 18:47 ` Ray Jui
2018-05-22 20:57 ` Guenter Roeck
2018-05-22 18:47 ` [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate Ray Jui
` (2 subsequent siblings)
4 siblings, 1 reply; 26+ messages in thread
From: Ray Jui @ 2018-05-22 18:47 UTC (permalink / raw)
To: Wim Van Sebroeck, Guenter Roeck, Rob Herring, Mark Rutland,
Frank Rowand, Catalin Marinas, Will Deacon
Cc: linux-watchdog, devicetree, linux-arm-kernel, linux-kernel,
bcm-kernel-feedback-list, Ray Jui
Add support for optional devicetree property 'timeout-sec'.
'timeout-sec' is used in the driver if specified in devicetree.
Otherwise, fall back to driver default, i.e., 60 seconds
Signed-off-by: Ray Jui <ray.jui@broadcom.com>
Reviewed-by: Scott Branden <scott.branden@broadcom.com>
---
drivers/watchdog/sp805_wdt.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c
index 03805bc..1484609 100644
--- a/drivers/watchdog/sp805_wdt.c
+++ b/drivers/watchdog/sp805_wdt.c
@@ -230,7 +230,14 @@ sp805_wdt_probe(struct amba_device *adev, const struct amba_id *id)
spin_lock_init(&wdt->lock);
watchdog_set_nowayout(&wdt->wdd, nowayout);
watchdog_set_drvdata(&wdt->wdd, wdt);
- wdt_setload(&wdt->wdd, DEFAULT_TIMEOUT);
+
+ /*
+ * If 'timeout-sec' devicetree property is specified, use that.
+ * Otherwise, use DEFAULT_TIMEOUT
+ */
+ wdt->wdd.timeout = DEFAULT_TIMEOUT;
+ watchdog_init_timeout(&wdt->wdd, 0, &adev->dev);
+ wdt_setload(&wdt->wdd, wdt->wdd.timeout);
ret = watchdog_register_device(&wdt->wdd);
if (ret) {
--
2.1.4
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate
2018-05-22 18:47 [PATCH 0/5] Enhance support for the SP805 WDT Ray Jui
2018-05-22 18:47 ` [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805 Ray Jui
2018-05-22 18:47 ` [PATCH 2/5] watchdog: sp805: add 'timeout-sec' DT property support Ray Jui
@ 2018-05-22 18:47 ` Ray Jui
2018-05-22 20:54 ` Guenter Roeck
2018-05-22 18:47 ` [PATCH 4/5] arm64: dt: set initial SR watchdog timeout to 60 seconds Ray Jui
2018-05-22 18:47 ` [PATCH 5/5] arm64: defconfig: add CONFIG_ARM_SP805_WATCHDOG Ray Jui
4 siblings, 1 reply; 26+ messages in thread
From: Ray Jui @ 2018-05-22 18:47 UTC (permalink / raw)
To: Wim Van Sebroeck, Guenter Roeck, Rob Herring, Mark Rutland,
Frank Rowand, Catalin Marinas, Will Deacon
Cc: linux-watchdog, devicetree, linux-arm-kernel, linux-kernel,
bcm-kernel-feedback-list, Ray Jui
If the watchdog hardware is already enabled during the boot process,
when the Linux watchdog driver loads, it should reset the watchdog and
tell the watchdog framework. As a result, ping can be generated from
the watchdog framework, until the userspace watchdog daemon takes over
control
Signed-off-by: Ray Jui <ray.jui@broadcom.com>
Reviewed-by: Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com>
Reviewed-by: Scott Branden <scott.branden@broadcom.com>
---
drivers/watchdog/sp805_wdt.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c
index 1484609..408ffbe 100644
--- a/drivers/watchdog/sp805_wdt.c
+++ b/drivers/watchdog/sp805_wdt.c
@@ -42,6 +42,7 @@
/* control register masks */
#define INT_ENABLE (1 << 0)
#define RESET_ENABLE (1 << 1)
+ #define ENABLE_MASK (INT_ENABLE | RESET_ENABLE)
#define WDTINTCLR 0x00C
#define WDTRIS 0x010
#define WDTMIS 0x014
@@ -74,6 +75,18 @@ module_param(nowayout, bool, 0);
MODULE_PARM_DESC(nowayout,
"Set to 1 to keep watchdog running after device release");
+/* returns true if wdt is running; otherwise returns false */
+static bool wdt_is_running(struct watchdog_device *wdd)
+{
+ struct sp805_wdt *wdt = watchdog_get_drvdata(wdd);
+
+ if ((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
+ ENABLE_MASK)
+ return true;
+ else
+ return false;
+}
+
/* This routine finds load value that will reset system in required timout */
static int wdt_setload(struct watchdog_device *wdd, unsigned int timeout)
{
@@ -239,6 +252,15 @@ sp805_wdt_probe(struct amba_device *adev, const struct amba_id *id)
watchdog_init_timeout(&wdt->wdd, 0, &adev->dev);
wdt_setload(&wdt->wdd, wdt->wdd.timeout);
+ /*
+ * If HW is already running, enable/reset the wdt and set the running
+ * bit to tell the wdt subsystem
+ */
+ if (wdt_is_running(&wdt->wdd)) {
+ wdt_enable(&wdt->wdd);
+ set_bit(WDOG_HW_RUNNING, &wdt->wdd.status);
+ }
+
ret = watchdog_register_device(&wdt->wdd);
if (ret) {
dev_err(&adev->dev, "watchdog_register_device() failed: %d\n",
--
2.1.4
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 4/5] arm64: dt: set initial SR watchdog timeout to 60 seconds
2018-05-22 18:47 [PATCH 0/5] Enhance support for the SP805 WDT Ray Jui
` (2 preceding siblings ...)
2018-05-22 18:47 ` [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate Ray Jui
@ 2018-05-22 18:47 ` Ray Jui
2018-05-22 18:47 ` [PATCH 5/5] arm64: defconfig: add CONFIG_ARM_SP805_WATCHDOG Ray Jui
4 siblings, 0 replies; 26+ messages in thread
From: Ray Jui @ 2018-05-22 18:47 UTC (permalink / raw)
To: Wim Van Sebroeck, Guenter Roeck, Rob Herring, Mark Rutland,
Frank Rowand, Catalin Marinas, Will Deacon
Cc: linux-watchdog, devicetree, linux-arm-kernel, linux-kernel,
bcm-kernel-feedback-list, Ray Jui
Set initial Stingray watchdog timeout to 60 seconds
By the time when the userspace watchdog daemon is ready and taking
control over, the watchdog timeout will then be reset to what's
configured in the daemon
Signed-off-by: Ray Jui <ray.jui@broadcom.com>
Reviewed-by: Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com>
Reviewed-by: Scott Branden <scott.branden@broadcom.com>
---
arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi b/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi
index 99aaff0..1e1cf49 100644
--- a/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi
+++ b/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi
@@ -420,6 +420,7 @@
interrupts = <GIC_SPI 189 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&hsls_25m_div2_clk>, <&hsls_div4_clk>;
clock-names = "wdogclk", "apb_pclk";
+ timeout-sec = <60>;
};
gpio_hsls: gpio@d0000 {
--
2.1.4
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 5/5] arm64: defconfig: add CONFIG_ARM_SP805_WATCHDOG
2018-05-22 18:47 [PATCH 0/5] Enhance support for the SP805 WDT Ray Jui
` (3 preceding siblings ...)
2018-05-22 18:47 ` [PATCH 4/5] arm64: dt: set initial SR watchdog timeout to 60 seconds Ray Jui
@ 2018-05-22 18:47 ` Ray Jui
4 siblings, 0 replies; 26+ messages in thread
From: Ray Jui @ 2018-05-22 18:47 UTC (permalink / raw)
To: Wim Van Sebroeck, Guenter Roeck, Rob Herring, Mark Rutland,
Frank Rowand, Catalin Marinas, Will Deacon
Cc: linux-watchdog, devicetree, linux-arm-kernel, linux-kernel,
bcm-kernel-feedback-list, Ray Jui
Enable the SP805 watchdog timer
Signed-off-by: Ray Jui <ray.jui@broadcom.com>
---
arch/arm64/configs/defconfig | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
index ecf6137..3fe5eb5 100644
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@ -351,6 +351,7 @@ CONFIG_ROCKCHIP_THERMAL=m
CONFIG_TEGRA_BPMP_THERMAL=m
CONFIG_UNIPHIER_THERMAL=y
CONFIG_WATCHDOG=y
+CONFIG_ARM_SP805_WATCHDOG=y
CONFIG_S3C2410_WATCHDOG=y
CONFIG_MESON_GXBB_WATCHDOG=m
CONFIG_MESON_WATCHDOG=m
--
2.1.4
^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate
2018-05-22 18:47 ` [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate Ray Jui
@ 2018-05-22 20:54 ` Guenter Roeck
2018-05-22 23:24 ` Ray Jui
0 siblings, 1 reply; 26+ messages in thread
From: Guenter Roeck @ 2018-05-22 20:54 UTC (permalink / raw)
To: Ray Jui
Cc: Wim Van Sebroeck, Rob Herring, Mark Rutland, Frank Rowand,
Catalin Marinas, Will Deacon, linux-watchdog, devicetree,
linux-arm-kernel, linux-kernel, bcm-kernel-feedback-list
On Tue, May 22, 2018 at 11:47:18AM -0700, Ray Jui wrote:
> If the watchdog hardware is already enabled during the boot process,
> when the Linux watchdog driver loads, it should reset the watchdog and
> tell the watchdog framework. As a result, ping can be generated from
> the watchdog framework, until the userspace watchdog daemon takes over
> control
>
> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
> Reviewed-by: Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com>
> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
> ---
> drivers/watchdog/sp805_wdt.c | 22 ++++++++++++++++++++++
> 1 file changed, 22 insertions(+)
>
> diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c
> index 1484609..408ffbe 100644
> --- a/drivers/watchdog/sp805_wdt.c
> +++ b/drivers/watchdog/sp805_wdt.c
> @@ -42,6 +42,7 @@
> /* control register masks */
> #define INT_ENABLE (1 << 0)
> #define RESET_ENABLE (1 << 1)
> + #define ENABLE_MASK (INT_ENABLE | RESET_ENABLE)
> #define WDTINTCLR 0x00C
> #define WDTRIS 0x010
> #define WDTMIS 0x014
> @@ -74,6 +75,18 @@ module_param(nowayout, bool, 0);
> MODULE_PARM_DESC(nowayout,
> "Set to 1 to keep watchdog running after device release");
>
> +/* returns true if wdt is running; otherwise returns false */
> +static bool wdt_is_running(struct watchdog_device *wdd)
> +{
> + struct sp805_wdt *wdt = watchdog_get_drvdata(wdd);
> +
> + if ((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
> + ENABLE_MASK)
> + return true;
> + else
> + return false;
return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
> +}
> +
> /* This routine finds load value that will reset system in required timout */
> static int wdt_setload(struct watchdog_device *wdd, unsigned int timeout)
> {
> @@ -239,6 +252,15 @@ sp805_wdt_probe(struct amba_device *adev, const struct amba_id *id)
> watchdog_init_timeout(&wdt->wdd, 0, &adev->dev);
> wdt_setload(&wdt->wdd, wdt->wdd.timeout);
>
> + /*
> + * If HW is already running, enable/reset the wdt and set the running
> + * bit to tell the wdt subsystem
> + */
> + if (wdt_is_running(&wdt->wdd)) {
> + wdt_enable(&wdt->wdd);
> + set_bit(WDOG_HW_RUNNING, &wdt->wdd.status);
> + }
> +
> ret = watchdog_register_device(&wdt->wdd);
> if (ret) {
> dev_err(&adev->dev, "watchdog_register_device() failed: %d\n",
> --
> 2.1.4
>
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805
2018-05-22 18:47 ` [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805 Ray Jui
@ 2018-05-22 20:56 ` Guenter Roeck
2018-05-23 10:57 ` Robin Murphy
1 sibling, 0 replies; 26+ messages in thread
From: Guenter Roeck @ 2018-05-22 20:56 UTC (permalink / raw)
To: Ray Jui
Cc: Wim Van Sebroeck, Rob Herring, Mark Rutland, Frank Rowand,
Catalin Marinas, Will Deacon, linux-watchdog, devicetree,
linux-arm-kernel, linux-kernel, bcm-kernel-feedback-list
On Tue, May 22, 2018 at 11:47:16AM -0700, Ray Jui wrote:
> Update the SP805 binding document to add optional 'timeout-sec'
> devicetree property
>
> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
> ---
> Documentation/devicetree/bindings/watchdog/sp805-wdt.txt | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> index edc4f0e..f898a86 100644
> --- a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> +++ b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> @@ -19,6 +19,8 @@ Required properties:
>
> Optional properties:
> - interrupts : Should specify WDT interrupt number.
> +- timeout-sec : Should specify default WDT timeout in seconds. If unset, the
> + default timeout is 30 seconds
>
> Examples:
>
> --
> 2.1.4
>
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 2/5] watchdog: sp805: add 'timeout-sec' DT property support
2018-05-22 18:47 ` [PATCH 2/5] watchdog: sp805: add 'timeout-sec' DT property support Ray Jui
@ 2018-05-22 20:57 ` Guenter Roeck
0 siblings, 0 replies; 26+ messages in thread
From: Guenter Roeck @ 2018-05-22 20:57 UTC (permalink / raw)
To: Ray Jui
Cc: Wim Van Sebroeck, Rob Herring, Mark Rutland, Frank Rowand,
Catalin Marinas, Will Deacon, linux-watchdog, devicetree,
linux-arm-kernel, linux-kernel, bcm-kernel-feedback-list
On Tue, May 22, 2018 at 11:47:17AM -0700, Ray Jui wrote:
> Add support for optional devicetree property 'timeout-sec'.
> 'timeout-sec' is used in the driver if specified in devicetree.
> Otherwise, fall back to driver default, i.e., 60 seconds
>
> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
> ---
> drivers/watchdog/sp805_wdt.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c
> index 03805bc..1484609 100644
> --- a/drivers/watchdog/sp805_wdt.c
> +++ b/drivers/watchdog/sp805_wdt.c
> @@ -230,7 +230,14 @@ sp805_wdt_probe(struct amba_device *adev, const struct amba_id *id)
> spin_lock_init(&wdt->lock);
> watchdog_set_nowayout(&wdt->wdd, nowayout);
> watchdog_set_drvdata(&wdt->wdd, wdt);
> - wdt_setload(&wdt->wdd, DEFAULT_TIMEOUT);
> +
> + /*
> + * If 'timeout-sec' devicetree property is specified, use that.
> + * Otherwise, use DEFAULT_TIMEOUT
> + */
> + wdt->wdd.timeout = DEFAULT_TIMEOUT;
> + watchdog_init_timeout(&wdt->wdd, 0, &adev->dev);
> + wdt_setload(&wdt->wdd, wdt->wdd.timeout);
>
> ret = watchdog_register_device(&wdt->wdd);
> if (ret) {
> --
> 2.1.4
>
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate
2018-05-22 20:54 ` Guenter Roeck
@ 2018-05-22 23:24 ` Ray Jui
2018-05-23 7:52 ` Scott Branden
0 siblings, 1 reply; 26+ messages in thread
From: Ray Jui @ 2018-05-22 23:24 UTC (permalink / raw)
To: Guenter Roeck
Cc: Wim Van Sebroeck, Rob Herring, Mark Rutland, Frank Rowand,
Catalin Marinas, Will Deacon, linux-watchdog, devicetree,
linux-arm-kernel, linux-kernel, bcm-kernel-feedback-list
Hi Guenter,
On 5/22/2018 1:54 PM, Guenter Roeck wrote:
> On Tue, May 22, 2018 at 11:47:18AM -0700, Ray Jui wrote:
>> If the watchdog hardware is already enabled during the boot process,
>> when the Linux watchdog driver loads, it should reset the watchdog and
>> tell the watchdog framework. As a result, ping can be generated from
>> the watchdog framework, until the userspace watchdog daemon takes over
>> control
>>
>> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
>> Reviewed-by: Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com>
>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>> ---
>> drivers/watchdog/sp805_wdt.c | 22 ++++++++++++++++++++++
>> 1 file changed, 22 insertions(+)
>>
>> diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c
>> index 1484609..408ffbe 100644
>> --- a/drivers/watchdog/sp805_wdt.c
>> +++ b/drivers/watchdog/sp805_wdt.c
>> @@ -42,6 +42,7 @@
>> /* control register masks */
>> #define INT_ENABLE (1 << 0)
>> #define RESET_ENABLE (1 << 1)
>> + #define ENABLE_MASK (INT_ENABLE | RESET_ENABLE)
>> #define WDTINTCLR 0x00C
>> #define WDTRIS 0x010
>> #define WDTMIS 0x014
>> @@ -74,6 +75,18 @@ module_param(nowayout, bool, 0);
>> MODULE_PARM_DESC(nowayout,
>> "Set to 1 to keep watchdog running after device release");
>>
>> +/* returns true if wdt is running; otherwise returns false */
>> +static bool wdt_is_running(struct watchdog_device *wdd)
>> +{
>> + struct sp805_wdt *wdt = watchdog_get_drvdata(wdd);
>> +
>> + if ((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
>> + ENABLE_MASK)
>> + return true;
>> + else
>> + return false;
>
> return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
>
Note ENABLE_MASK contains two bits (INT_ENABLE and RESET_ENABLE);
therefore, a simple !!(expression) would not work? That is, the masked
result needs to be compared against the mask again to ensure both bits
are set, right?
Thanks,
Ray
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate
2018-05-22 23:24 ` Ray Jui
@ 2018-05-23 7:52 ` Scott Branden
2018-05-23 11:48 ` Robin Murphy
0 siblings, 1 reply; 26+ messages in thread
From: Scott Branden @ 2018-05-23 7:52 UTC (permalink / raw)
To: Ray Jui, Guenter Roeck
Cc: Wim Van Sebroeck, Rob Herring, Mark Rutland, Frank Rowand,
Catalin Marinas, Will Deacon, linux-watchdog, devicetree,
linux-arm-kernel, linux-kernel, bcm-kernel-feedback-list
On 18-05-22 04:24 PM, Ray Jui wrote:
> Hi Guenter,
>
> On 5/22/2018 1:54 PM, Guenter Roeck wrote:
>> On Tue, May 22, 2018 at 11:47:18AM -0700, Ray Jui wrote:
>>> If the watchdog hardware is already enabled during the boot process,
>>> when the Linux watchdog driver loads, it should reset the watchdog and
>>> tell the watchdog framework. As a result, ping can be generated from
>>> the watchdog framework, until the userspace watchdog daemon takes over
>>> control
>>>
>>> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
>>> Reviewed-by: Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com>
>>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>>> ---
>>> drivers/watchdog/sp805_wdt.c | 22 ++++++++++++++++++++++
>>> 1 file changed, 22 insertions(+)
>>>
>>> diff --git a/drivers/watchdog/sp805_wdt.c
>>> b/drivers/watchdog/sp805_wdt.c
>>> index 1484609..408ffbe 100644
>>> --- a/drivers/watchdog/sp805_wdt.c
>>> +++ b/drivers/watchdog/sp805_wdt.c
>>> @@ -42,6 +42,7 @@
>>> /* control register masks */
>>> #define INT_ENABLE (1 << 0)
>>> #define RESET_ENABLE (1 << 1)
>>> + #define ENABLE_MASK (INT_ENABLE | RESET_ENABLE)
>>> #define WDTINTCLR 0x00C
>>> #define WDTRIS 0x010
>>> #define WDTMIS 0x014
>>> @@ -74,6 +75,18 @@ module_param(nowayout, bool, 0);
>>> MODULE_PARM_DESC(nowayout,
>>> "Set to 1 to keep watchdog running after device release");
>>> +/* returns true if wdt is running; otherwise returns false */
>>> +static bool wdt_is_running(struct watchdog_device *wdd)
>>> +{
>>> + struct sp805_wdt *wdt = watchdog_get_drvdata(wdd);
>>> +
>>> + if ((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
>>> + ENABLE_MASK)
>>> + return true;
>>> + else
>>> + return false;
>>
>> return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
>>
>
> Note ENABLE_MASK contains two bits (INT_ENABLE and RESET_ENABLE);
> therefore, a simple !!(expression) would not work? That is, the masked
> result needs to be compared against the mask again to ensure both bits
> are set, right?
Ray - your original code looks correct to me. Easier to read and less
prone to errors as shown in the attempted translation to a single statement.
>
> Thanks,
>
> Ray
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805
2018-05-22 18:47 ` [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805 Ray Jui
2018-05-22 20:56 ` Guenter Roeck
@ 2018-05-23 10:57 ` Robin Murphy
2018-05-23 16:25 ` Ray Jui
2018-05-23 18:10 ` Guenter Roeck
1 sibling, 2 replies; 26+ messages in thread
From: Robin Murphy @ 2018-05-23 10:57 UTC (permalink / raw)
To: Ray Jui, Wim Van Sebroeck, Guenter Roeck, Rob Herring,
Mark Rutland, Frank Rowand, Catalin Marinas, Will Deacon
Cc: devicetree, linux-watchdog, linux-kernel,
bcm-kernel-feedback-list, linux-arm-kernel
On 22/05/18 19:47, Ray Jui wrote:
> Update the SP805 binding document to add optional 'timeout-sec'
> devicetree property
>
> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
> ---
> Documentation/devicetree/bindings/watchdog/sp805-wdt.txt | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> index edc4f0e..f898a86 100644
> --- a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> +++ b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> @@ -19,6 +19,8 @@ Required properties:
>
> Optional properties:
> - interrupts : Should specify WDT interrupt number.
> +- timeout-sec : Should specify default WDT timeout in seconds. If unset, the
> + default timeout is 30 seconds
According to the SP805 TRM, the default interval is dependent on the
rate of WDOGCLK, but would typically be a lot longer than that :/
On a related note, anyone have any idea why we seem to have two subtly
different SP805 bindings defined?
Robin.
>
> Examples:
>
>
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate
2018-05-23 7:52 ` Scott Branden
@ 2018-05-23 11:48 ` Robin Murphy
2018-05-23 16:29 ` Ray Jui
2018-05-23 18:06 ` Guenter Roeck
0 siblings, 2 replies; 26+ messages in thread
From: Robin Murphy @ 2018-05-23 11:48 UTC (permalink / raw)
To: Scott Branden, Ray Jui, Guenter Roeck
Cc: Mark Rutland, devicetree, linux-watchdog, Catalin Marinas,
Will Deacon, linux-kernel, Rob Herring, bcm-kernel-feedback-list,
Wim Van Sebroeck, Frank Rowand, linux-arm-kernel
On 23/05/18 08:52, Scott Branden wrote:
>
>
> On 18-05-22 04:24 PM, Ray Jui wrote:
>> Hi Guenter,
>>
>> On 5/22/2018 1:54 PM, Guenter Roeck wrote:
>>> On Tue, May 22, 2018 at 11:47:18AM -0700, Ray Jui wrote:
>>>> If the watchdog hardware is already enabled during the boot process,
>>>> when the Linux watchdog driver loads, it should reset the watchdog and
>>>> tell the watchdog framework. As a result, ping can be generated from
>>>> the watchdog framework, until the userspace watchdog daemon takes over
>>>> control
>>>>
>>>> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
>>>> Reviewed-by: Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com>
>>>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>>>> ---
>>>> drivers/watchdog/sp805_wdt.c | 22 ++++++++++++++++++++++
>>>> 1 file changed, 22 insertions(+)
>>>>
>>>> diff --git a/drivers/watchdog/sp805_wdt.c
>>>> b/drivers/watchdog/sp805_wdt.c
>>>> index 1484609..408ffbe 100644
>>>> --- a/drivers/watchdog/sp805_wdt.c
>>>> +++ b/drivers/watchdog/sp805_wdt.c
>>>> @@ -42,6 +42,7 @@
>>>> /* control register masks */
>>>> #define INT_ENABLE (1 << 0)
>>>> #define RESET_ENABLE (1 << 1)
>>>> + #define ENABLE_MASK (INT_ENABLE | RESET_ENABLE)
>>>> #define WDTINTCLR 0x00C
>>>> #define WDTRIS 0x010
>>>> #define WDTMIS 0x014
>>>> @@ -74,6 +75,18 @@ module_param(nowayout, bool, 0);
>>>> MODULE_PARM_DESC(nowayout,
>>>> "Set to 1 to keep watchdog running after device release");
>>>> +/* returns true if wdt is running; otherwise returns false */
>>>> +static bool wdt_is_running(struct watchdog_device *wdd)
>>>> +{
>>>> + struct sp805_wdt *wdt = watchdog_get_drvdata(wdd);
>>>> +
>>>> + if ((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
>>>> + ENABLE_MASK)
>>>> + return true;
>>>> + else
>>>> + return false;
>>>
>>> return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
>>>
>>
>> Note ENABLE_MASK contains two bits (INT_ENABLE and RESET_ENABLE);
>> therefore, a simple !!(expression) would not work? That is, the masked
>> result needs to be compared against the mask again to ensure both bits
>> are set, right?
> Ray - your original code looks correct to me. Easier to read and less
> prone to errors as shown in the attempted translation to a single
> statement.
if (<boolean condition>)
return true;
else
return false;
still looks really dumb, though, and IMO is actually harder to read than
just "return <boolean condition>;" because it forces you to stop and
double-check that the logic is, in fact, only doing the obvious thing.
Robin.
p.s. No thanks for making me remember the mind-boggling horror of
briefly maintaining part of this legacy codebase... :P
$ grep -r '? true : false' --include=*.cpp . | wc -l
951
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805
2018-05-23 10:57 ` Robin Murphy
@ 2018-05-23 16:25 ` Ray Jui
2018-05-23 18:59 ` Rob Herring
2018-05-23 18:10 ` Guenter Roeck
1 sibling, 1 reply; 26+ messages in thread
From: Ray Jui @ 2018-05-23 16:25 UTC (permalink / raw)
To: Robin Murphy, Wim Van Sebroeck, Guenter Roeck, Rob Herring,
Mark Rutland, Frank Rowand, Catalin Marinas, Will Deacon
Cc: devicetree, linux-watchdog, linux-kernel,
bcm-kernel-feedback-list, linux-arm-kernel
On 5/23/2018 3:57 AM, Robin Murphy wrote:
> On 22/05/18 19:47, Ray Jui wrote:
>> Update the SP805 binding document to add optional 'timeout-sec'
>> devicetree property
>>
>> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>> ---
>> Documentation/devicetree/bindings/watchdog/sp805-wdt.txt | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>> b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>> index edc4f0e..f898a86 100644
>> --- a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>> +++ b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>> @@ -19,6 +19,8 @@ Required properties:
>> Optional properties:
>> - interrupts : Should specify WDT interrupt number.
>> +- timeout-sec : Should specify default WDT timeout in seconds. If
>> unset, the
>> + default timeout is 30 seconds
>
> According to the SP805 TRM, the default interval is dependent on the
> rate of WDOGCLK, but would typically be a lot longer than that :/
>
> On a related note, anyone have any idea why we seem to have two subtly
> different SP805 bindings defined?
Interesting, I did not even know that until you pointed this out (and
it's funny that I found that I actually reviewed arm,sp805.txt
internally in Broadcom code review).
It looks like one was done by Bhupesh Sharma (sp805-wdt.txt) and the
other was done by Anup Patel (arm,sp805.txt). Both were merged at the
same time around March 20, 2016: 915c56bc01d6. I'd assume both were sent
out at around the same time.
It sounds like we should definitely remove one of them. Given that
sp805-wdt.txt appears to have more detailed descriptions on the use of
the clocks, should we remove arm,sp805.txt?
Thanks,
Ray
>
> Robin.
>
>> Examples:
>>
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate
2018-05-23 11:48 ` Robin Murphy
@ 2018-05-23 16:29 ` Ray Jui
2018-05-23 17:15 ` Robin Murphy
2018-05-23 17:15 ` Scott Branden
2018-05-23 18:06 ` Guenter Roeck
1 sibling, 2 replies; 26+ messages in thread
From: Ray Jui @ 2018-05-23 16:29 UTC (permalink / raw)
To: Robin Murphy, Scott Branden, Guenter Roeck
Cc: Mark Rutland, devicetree, linux-watchdog, Catalin Marinas,
Will Deacon, linux-kernel, Rob Herring, bcm-kernel-feedback-list,
Wim Van Sebroeck, Frank Rowand, linux-arm-kernel
Hi Robin,
On 5/23/2018 4:48 AM, Robin Murphy wrote:
> On 23/05/18 08:52, Scott Branden wrote:
>>
>>
>> On 18-05-22 04:24 PM, Ray Jui wrote:
>>> Hi Guenter,
>>>
>>> On 5/22/2018 1:54 PM, Guenter Roeck wrote:
>>>> On Tue, May 22, 2018 at 11:47:18AM -0700, Ray Jui wrote:
>>>>> If the watchdog hardware is already enabled during the boot process,
>>>>> when the Linux watchdog driver loads, it should reset the watchdog and
>>>>> tell the watchdog framework. As a result, ping can be generated from
>>>>> the watchdog framework, until the userspace watchdog daemon takes over
>>>>> control
>>>>>
>>>>> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
>>>>> Reviewed-by: Vladimir Olovyannikov
>>>>> <vladimir.olovyannikov@broadcom.com>
>>>>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>>>>> ---
>>>>> drivers/watchdog/sp805_wdt.c | 22 ++++++++++++++++++++++
>>>>> 1 file changed, 22 insertions(+)
>>>>>
>>>>> diff --git a/drivers/watchdog/sp805_wdt.c
>>>>> b/drivers/watchdog/sp805_wdt.c
>>>>> index 1484609..408ffbe 100644
>>>>> --- a/drivers/watchdog/sp805_wdt.c
>>>>> +++ b/drivers/watchdog/sp805_wdt.c
>>>>> @@ -42,6 +42,7 @@
>>>>> /* control register masks */
>>>>> #define INT_ENABLE (1 << 0)
>>>>> #define RESET_ENABLE (1 << 1)
>>>>> + #define ENABLE_MASK (INT_ENABLE | RESET_ENABLE)
>>>>> #define WDTINTCLR 0x00C
>>>>> #define WDTRIS 0x010
>>>>> #define WDTMIS 0x014
>>>>> @@ -74,6 +75,18 @@ module_param(nowayout, bool, 0);
>>>>> MODULE_PARM_DESC(nowayout,
>>>>> "Set to 1 to keep watchdog running after device release");
>>>>> +/* returns true if wdt is running; otherwise returns false */
>>>>> +static bool wdt_is_running(struct watchdog_device *wdd)
>>>>> +{
>>>>> + struct sp805_wdt *wdt = watchdog_get_drvdata(wdd);
>>>>> +
>>>>> + if ((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
>>>>> + ENABLE_MASK)
>>>>> + return true;
>>>>> + else
>>>>> + return false;
>>>>
>>>> return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
>>>>
>>>
>>> Note ENABLE_MASK contains two bits (INT_ENABLE and RESET_ENABLE);
>>> therefore, a simple !!(expression) would not work? That is, the
>>> masked result needs to be compared against the mask again to ensure
>>> both bits are set, right?
>> Ray - your original code looks correct to me. Easier to read and less
>> prone to errors as shown in the attempted translation to a single
>> statement.
>
> if (<boolean condition>)
> return true;
> else
> return false;
>
> still looks really dumb, though, and IMO is actually harder to read than
> just "return <boolean condition>;" because it forces you to stop and
> double-check that the logic is, in fact, only doing the obvious thing.
If you can propose a way to modify my original code above to make it
more readable, I'm fine to make the change.
As I mentioned, I don't think the following change proposed by Guenter
will work due to the reason I pointed out:
return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
>
> Robin.
>
>
>
> p.s. No thanks for making me remember the mind-boggling horror of
> briefly maintaining part of this legacy codebase... :P
>
> $ grep -r '? true : false' --include=*.cpp . | wc -l
> 951
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate
2018-05-23 16:29 ` Ray Jui
@ 2018-05-23 17:15 ` Robin Murphy
2018-05-23 18:09 ` Guenter Roeck
2018-05-23 17:15 ` Scott Branden
1 sibling, 1 reply; 26+ messages in thread
From: Robin Murphy @ 2018-05-23 17:15 UTC (permalink / raw)
To: Ray Jui, Scott Branden, Guenter Roeck
Cc: Mark Rutland, devicetree, linux-watchdog, Catalin Marinas,
Will Deacon, linux-kernel, Rob Herring, bcm-kernel-feedback-list,
Wim Van Sebroeck, Frank Rowand, linux-arm-kernel
On 23/05/18 17:29, Ray Jui wrote:
> Hi Robin,
>
> On 5/23/2018 4:48 AM, Robin Murphy wrote:
>> On 23/05/18 08:52, Scott Branden wrote:
>>>
>>>
>>> On 18-05-22 04:24 PM, Ray Jui wrote:
>>>> Hi Guenter,
>>>>
>>>> On 5/22/2018 1:54 PM, Guenter Roeck wrote:
>>>>> On Tue, May 22, 2018 at 11:47:18AM -0700, Ray Jui wrote:
>>>>>> If the watchdog hardware is already enabled during the boot process,
>>>>>> when the Linux watchdog driver loads, it should reset the watchdog
>>>>>> and
>>>>>> tell the watchdog framework. As a result, ping can be generated from
>>>>>> the watchdog framework, until the userspace watchdog daemon takes
>>>>>> over
>>>>>> control
>>>>>>
>>>>>> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
>>>>>> Reviewed-by: Vladimir Olovyannikov
>>>>>> <vladimir.olovyannikov@broadcom.com>
>>>>>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>>>>>> ---
>>>>>> drivers/watchdog/sp805_wdt.c | 22 ++++++++++++++++++++++
>>>>>> 1 file changed, 22 insertions(+)
>>>>>>
>>>>>> diff --git a/drivers/watchdog/sp805_wdt.c
>>>>>> b/drivers/watchdog/sp805_wdt.c
>>>>>> index 1484609..408ffbe 100644
>>>>>> --- a/drivers/watchdog/sp805_wdt.c
>>>>>> +++ b/drivers/watchdog/sp805_wdt.c
>>>>>> @@ -42,6 +42,7 @@
>>>>>> /* control register masks */
>>>>>> #define INT_ENABLE (1 << 0)
>>>>>> #define RESET_ENABLE (1 << 1)
>>>>>> + #define ENABLE_MASK (INT_ENABLE | RESET_ENABLE)
>>>>>> #define WDTINTCLR 0x00C
>>>>>> #define WDTRIS 0x010
>>>>>> #define WDTMIS 0x014
>>>>>> @@ -74,6 +75,18 @@ module_param(nowayout, bool, 0);
>>>>>> MODULE_PARM_DESC(nowayout,
>>>>>> "Set to 1 to keep watchdog running after device release");
>>>>>> +/* returns true if wdt is running; otherwise returns false */
>>>>>> +static bool wdt_is_running(struct watchdog_device *wdd)
>>>>>> +{
>>>>>> + struct sp805_wdt *wdt = watchdog_get_drvdata(wdd);
>>>>>> +
>>>>>> + if ((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
>>>>>> + ENABLE_MASK)
>>>>>> + return true;
>>>>>> + else
>>>>>> + return false;
>>>>>
>>>>> return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
>>>>>
>>>>
>>>> Note ENABLE_MASK contains two bits (INT_ENABLE and RESET_ENABLE);
>>>> therefore, a simple !!(expression) would not work? That is, the
>>>> masked result needs to be compared against the mask again to ensure
>>>> both bits are set, right?
>>> Ray - your original code looks correct to me. Easier to read and
>>> less prone to errors as shown in the attempted translation to a
>>> single statement.
>>
>> if (<boolean condition>)
>> return true;
>> else
>> return false;
>>
>> still looks really dumb, though, and IMO is actually harder to read
>> than just "return <boolean condition>;" because it forces you to stop
>> and double-check that the logic is, in fact, only doing the obvious
>> thing.
>
> If you can propose a way to modify my original code above to make it
> more readable, I'm fine to make the change.
Well,
return readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK == ENABLE_MASK;
would probably be reasonable to anyone other than the 80-column zealots,
but removing the silly boolean-to-boolean translation idiom really only
emphasises the fact that it's fundamentally a big complex statement; for
maximum clarity I'd be inclined to separate the two logical operations
(read and comparison), e.g.:
u32 wdtcontrol = readl_relaxed(wdt->base + WDTCONTROL);
return wdtcontrol & ENABLE_MASK == ENABLE_MASK;
which is still -3 lines vs. the original.
> As I mentioned, I don't think the following change proposed by Guenter
> will work due to the reason I pointed out:
>
> return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
FWIW, getting the desired result should only need one logical not
swapping for a bitwise one there:
return !(~readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK);
but that's well into "too clever for its own good" territory ;)
Robin.
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate
2018-05-23 16:29 ` Ray Jui
2018-05-23 17:15 ` Robin Murphy
@ 2018-05-23 17:15 ` Scott Branden
1 sibling, 0 replies; 26+ messages in thread
From: Scott Branden @ 2018-05-23 17:15 UTC (permalink / raw)
To: Ray Jui, Robin Murphy, Guenter Roeck
Cc: Mark Rutland, devicetree, linux-watchdog, Catalin Marinas,
Will Deacon, linux-kernel, Rob Herring, bcm-kernel-feedback-list,
Wim Van Sebroeck, Frank Rowand, linux-arm-kernel
Raym
On 18-05-23 09:29 AM, Ray Jui wrote:
> Hi Robin,
>
> On 5/23/2018 4:48 AM, Robin Murphy wrote:
>> On 23/05/18 08:52, Scott Branden wrote:
>>>
>>>
>>> On 18-05-22 04:24 PM, Ray Jui wrote:
>>>> Hi Guenter,
>>>>
>>>> On 5/22/2018 1:54 PM, Guenter Roeck wrote:
>>>>> On Tue, May 22, 2018 at 11:47:18AM -0700, Ray Jui wrote:
>>>>>> If the watchdog hardware is already enabled during the boot process,
>>>>>> when the Linux watchdog driver loads, it should reset the
>>>>>> watchdog and
>>>>>> tell the watchdog framework. As a result, ping can be generated from
>>>>>> the watchdog framework, until the userspace watchdog daemon takes
>>>>>> over
>>>>>> control
>>>>>>
>>>>>> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
>>>>>> Reviewed-by: Vladimir Olovyannikov
>>>>>> <vladimir.olovyannikov@broadcom.com>
>>>>>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>>>>>> ---
>>>>>> drivers/watchdog/sp805_wdt.c | 22 ++++++++++++++++++++++
>>>>>> 1 file changed, 22 insertions(+)
>>>>>>
>>>>>> diff --git a/drivers/watchdog/sp805_wdt.c
>>>>>> b/drivers/watchdog/sp805_wdt.c
>>>>>> index 1484609..408ffbe 100644
>>>>>> --- a/drivers/watchdog/sp805_wdt.c
>>>>>> +++ b/drivers/watchdog/sp805_wdt.c
>>>>>> @@ -42,6 +42,7 @@
>>>>>> /* control register masks */
>>>>>> #define INT_ENABLE (1 << 0)
>>>>>> #define RESET_ENABLE (1 << 1)
>>>>>> + #define ENABLE_MASK (INT_ENABLE | RESET_ENABLE)
>>>>>> #define WDTINTCLR 0x00C
>>>>>> #define WDTRIS 0x010
>>>>>> #define WDTMIS 0x014
>>>>>> @@ -74,6 +75,18 @@ module_param(nowayout, bool, 0);
>>>>>> MODULE_PARM_DESC(nowayout,
>>>>>> "Set to 1 to keep watchdog running after device release");
>>>>>> +/* returns true if wdt is running; otherwise returns false */
>>>>>> +static bool wdt_is_running(struct watchdog_device *wdd)
>>>>>> +{
>>>>>> + struct sp805_wdt *wdt = watchdog_get_drvdata(wdd);
>>>>>> +
>>>>>> + if ((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
>>>>>> + ENABLE_MASK)
>>>>>> + return true;
>>>>>> + else
>>>>>> + return false;
>>>>>
>>>>> return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
>>>>>
>>>>
>>>> Note ENABLE_MASK contains two bits (INT_ENABLE and RESET_ENABLE);
>>>> therefore, a simple !!(expression) would not work? That is, the
>>>> masked result needs to be compared against the mask again to ensure
>>>> both bits are set, right?
>>> Ray - your original code looks correct to me. Easier to read and
>>> less prone to errors as shown in the attempted translation to a
>>> single statement.
>>
>> if (<boolean condition>)
>> return true;
>> else
>> return false;
>>
>> still looks really dumb, though, and IMO is actually harder to read
>> than just "return <boolean condition>;" because it forces you to stop
>> and double-check that the logic is, in fact, only doing the obvious
>> thing.
>
> If you can propose a way to modify my original code above to make it
> more readable, I'm fine to make the change.
>
> As I mentioned, I don't think the following change proposed by Guenter
> will work due to the reason I pointed out:
>
> return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
What they are looking for is:
return ((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
ENABLE_MASK);
or maybe:
return !!((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
ENABLE_MASK);
>
>>
>> Robin.
>>
>>
>>
>> p.s. No thanks for making me remember the mind-boggling horror of
>> briefly maintaining part of this legacy codebase... :P
>>
>> $ grep -r '? true : false' --include=*.cpp . | wc -l
>> 951
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate
2018-05-23 11:48 ` Robin Murphy
2018-05-23 16:29 ` Ray Jui
@ 2018-05-23 18:06 ` Guenter Roeck
1 sibling, 0 replies; 26+ messages in thread
From: Guenter Roeck @ 2018-05-23 18:06 UTC (permalink / raw)
To: Robin Murphy
Cc: Scott Branden, Ray Jui, Mark Rutland, devicetree, linux-watchdog,
Catalin Marinas, Will Deacon, linux-kernel, Rob Herring,
bcm-kernel-feedback-list, Wim Van Sebroeck, Frank Rowand,
linux-arm-kernel
On Wed, May 23, 2018 at 12:48:10PM +0100, Robin Murphy wrote:
> On 23/05/18 08:52, Scott Branden wrote:
> >
> >
> >On 18-05-22 04:24 PM, Ray Jui wrote:
> >>Hi Guenter,
> >>
> >>On 5/22/2018 1:54 PM, Guenter Roeck wrote:
> >>>On Tue, May 22, 2018 at 11:47:18AM -0700, Ray Jui wrote:
> >>>>If the watchdog hardware is already enabled during the boot process,
> >>>>when the Linux watchdog driver loads, it should reset the watchdog and
> >>>>tell the watchdog framework. As a result, ping can be generated from
> >>>>the watchdog framework, until the userspace watchdog daemon takes over
> >>>>control
> >>>>
> >>>>Signed-off-by: Ray Jui <ray.jui@broadcom.com>
> >>>>Reviewed-by: Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com>
> >>>>Reviewed-by: Scott Branden <scott.branden@broadcom.com>
> >>>>---
> >>>> drivers/watchdog/sp805_wdt.c | 22 ++++++++++++++++++++++
> >>>> 1 file changed, 22 insertions(+)
> >>>>
> >>>>diff --git a/drivers/watchdog/sp805_wdt.c
> >>>>b/drivers/watchdog/sp805_wdt.c
> >>>>index 1484609..408ffbe 100644
> >>>>--- a/drivers/watchdog/sp805_wdt.c
> >>>>+++ b/drivers/watchdog/sp805_wdt.c
> >>>>@@ -42,6 +42,7 @@
> >>>> /* control register masks */
> >>>> #define INT_ENABLE (1 << 0)
> >>>> #define RESET_ENABLE (1 << 1)
> >>>>+ #define ENABLE_MASK (INT_ENABLE | RESET_ENABLE)
> >>>> #define WDTINTCLR 0x00C
> >>>> #define WDTRIS 0x010
> >>>> #define WDTMIS 0x014
> >>>>@@ -74,6 +75,18 @@ module_param(nowayout, bool, 0);
> >>>> MODULE_PARM_DESC(nowayout,
> >>>> "Set to 1 to keep watchdog running after device release");
> >>>> +/* returns true if wdt is running; otherwise returns false */
> >>>>+static bool wdt_is_running(struct watchdog_device *wdd)
> >>>>+{
> >>>>+ struct sp805_wdt *wdt = watchdog_get_drvdata(wdd);
> >>>>+
> >>>>+ if ((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
> >>>>+ ENABLE_MASK)
> >>>>+ return true;
> >>>>+ else
> >>>>+ return false;
> >>>
> >>> return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
> >>>
> >>
> >>Note ENABLE_MASK contains two bits (INT_ENABLE and RESET_ENABLE);
> >>therefore, a simple !!(expression) would not work? That is, the masked
> >>result needs to be compared against the mask again to ensure both bits
> >>are set, right?
> >Ray - your original code looks correct to me. Easier to read and less
> >prone to errors as shown in the attempted translation to a single
> >statement.
>
> if (<boolean condition>)
> return true;
> else
> return false;
>
> still looks really dumb, though, and IMO is actually harder to read than
> just "return <boolean condition>;" because it forces you to stop and
> double-check that the logic is, in fact, only doing the obvious thing.
>
Yes, and I won't accept it, sorry.
Guenter
> Robin.
>
>
>
> p.s. No thanks for making me remember the mind-boggling horror of briefly
> maintaining part of this legacy codebase... :P
>
> $ grep -r '? true : false' --include=*.cpp . | wc -l
> 951
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate
2018-05-23 17:15 ` Robin Murphy
@ 2018-05-23 18:09 ` Guenter Roeck
2018-05-23 19:35 ` Ray Jui
0 siblings, 1 reply; 26+ messages in thread
From: Guenter Roeck @ 2018-05-23 18:09 UTC (permalink / raw)
To: Robin Murphy
Cc: Ray Jui, Scott Branden, Mark Rutland, devicetree, linux-watchdog,
Catalin Marinas, Will Deacon, linux-kernel, Rob Herring,
bcm-kernel-feedback-list, Wim Van Sebroeck, Frank Rowand,
linux-arm-kernel
On Wed, May 23, 2018 at 06:15:14PM +0100, Robin Murphy wrote:
> On 23/05/18 17:29, Ray Jui wrote:
> >Hi Robin,
> >
> >On 5/23/2018 4:48 AM, Robin Murphy wrote:
> >>On 23/05/18 08:52, Scott Branden wrote:
> >>>
> >>>
> >>>On 18-05-22 04:24 PM, Ray Jui wrote:
> >>>>Hi Guenter,
> >>>>
> >>>>On 5/22/2018 1:54 PM, Guenter Roeck wrote:
> >>>>>On Tue, May 22, 2018 at 11:47:18AM -0700, Ray Jui wrote:
> >>>>>>If the watchdog hardware is already enabled during the boot process,
> >>>>>>when the Linux watchdog driver loads, it should reset the
> >>>>>>watchdog and
> >>>>>>tell the watchdog framework. As a result, ping can be generated from
> >>>>>>the watchdog framework, until the userspace watchdog daemon
> >>>>>>takes over
> >>>>>>control
> >>>>>>
> >>>>>>Signed-off-by: Ray Jui <ray.jui@broadcom.com>
> >>>>>>Reviewed-by: Vladimir Olovyannikov
> >>>>>><vladimir.olovyannikov@broadcom.com>
> >>>>>>Reviewed-by: Scott Branden <scott.branden@broadcom.com>
> >>>>>>---
> >>>>>> drivers/watchdog/sp805_wdt.c | 22 ++++++++++++++++++++++
> >>>>>> 1 file changed, 22 insertions(+)
> >>>>>>
> >>>>>>diff --git a/drivers/watchdog/sp805_wdt.c
> >>>>>>b/drivers/watchdog/sp805_wdt.c
> >>>>>>index 1484609..408ffbe 100644
> >>>>>>--- a/drivers/watchdog/sp805_wdt.c
> >>>>>>+++ b/drivers/watchdog/sp805_wdt.c
> >>>>>>@@ -42,6 +42,7 @@
> >>>>>> /* control register masks */
> >>>>>> #define INT_ENABLE (1 << 0)
> >>>>>> #define RESET_ENABLE (1 << 1)
> >>>>>>+ #define ENABLE_MASK (INT_ENABLE | RESET_ENABLE)
> >>>>>> #define WDTINTCLR 0x00C
> >>>>>> #define WDTRIS 0x010
> >>>>>> #define WDTMIS 0x014
> >>>>>>@@ -74,6 +75,18 @@ module_param(nowayout, bool, 0);
> >>>>>> MODULE_PARM_DESC(nowayout,
> >>>>>> "Set to 1 to keep watchdog running after device release");
> >>>>>> +/* returns true if wdt is running; otherwise returns false */
> >>>>>>+static bool wdt_is_running(struct watchdog_device *wdd)
> >>>>>>+{
> >>>>>>+ struct sp805_wdt *wdt = watchdog_get_drvdata(wdd);
> >>>>>>+
> >>>>>>+ if ((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
> >>>>>>+ ENABLE_MASK)
> >>>>>>+ return true;
> >>>>>>+ else
> >>>>>>+ return false;
> >>>>>
> >>>>> return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
> >>>>>
> >>>>
> >>>>Note ENABLE_MASK contains two bits (INT_ENABLE and RESET_ENABLE);
> >>>>therefore, a simple !!(expression) would not work? That is, the
> >>>>masked result needs to be compared against the mask again to ensure
> >>>>both bits are set, right?
> >>>Ray - your original code looks correct to me. Easier to read and less
> >>>prone to errors as shown in the attempted translation to a single
> >>>statement.
> >>
> >> if (<boolean condition>)
> >> return true;
> >> else
> >> return false;
> >>
> >>still looks really dumb, though, and IMO is actually harder to read than
> >>just "return <boolean condition>;" because it forces you to stop and
> >>double-check that the logic is, in fact, only doing the obvious thing.
> >
> >If you can propose a way to modify my original code above to make it more
> >readable, I'm fine to make the change.
>
> Well,
>
> return readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK == ENABLE_MASK;
>
> would probably be reasonable to anyone other than the 80-column zealots, but
> removing the silly boolean-to-boolean translation idiom really only
> emphasises the fact that it's fundamentally a big complex statement; for
> maximum clarity I'd be inclined to separate the two logical operations (read
> and comparison), e.g.:
>
> u32 wdtcontrol = readl_relaxed(wdt->base + WDTCONTROL);
>
> return wdtcontrol & ENABLE_MASK == ENABLE_MASK;
== has higher precendence than bitwise &, so this will need ( ),
but otherwise I agree.
>
> which is still -3 lines vs. the original.
>
> >As I mentioned, I don't think the following change proposed by Guenter
> >will work due to the reason I pointed out:
> >
> >return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
>
> FWIW, getting the desired result should only need one logical not swapping
> for a bitwise one there:
>
> return !(~readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK);
>
> but that's well into "too clever for its own good" territory ;)
Yes, that would be confusing.
>
> Robin.
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805
2018-05-23 10:57 ` Robin Murphy
2018-05-23 16:25 ` Ray Jui
@ 2018-05-23 18:10 ` Guenter Roeck
2018-05-24 13:25 ` Robin Murphy
1 sibling, 1 reply; 26+ messages in thread
From: Guenter Roeck @ 2018-05-23 18:10 UTC (permalink / raw)
To: Robin Murphy
Cc: Ray Jui, Wim Van Sebroeck, Rob Herring, Mark Rutland,
Frank Rowand, Catalin Marinas, Will Deacon, devicetree,
linux-watchdog, linux-kernel, bcm-kernel-feedback-list,
linux-arm-kernel
On Wed, May 23, 2018 at 11:57:25AM +0100, Robin Murphy wrote:
> On 22/05/18 19:47, Ray Jui wrote:
> >Update the SP805 binding document to add optional 'timeout-sec'
> >devicetree property
> >
> >Signed-off-by: Ray Jui <ray.jui@broadcom.com>
> >Reviewed-by: Scott Branden <scott.branden@broadcom.com>
> >---
> > Documentation/devicetree/bindings/watchdog/sp805-wdt.txt | 2 ++
> > 1 file changed, 2 insertions(+)
> >
> >diff --git a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> >index edc4f0e..f898a86 100644
> >--- a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> >+++ b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> >@@ -19,6 +19,8 @@ Required properties:
> > Optional properties:
> > - interrupts : Should specify WDT interrupt number.
> >+- timeout-sec : Should specify default WDT timeout in seconds. If unset, the
> >+ default timeout is 30 seconds
>
> According to the SP805 TRM, the default interval is dependent on the rate of
> WDOGCLK, but would typically be a lot longer than that :/
>
Depends on the definition of "default". In the context of watchdog drivers,
it is (or should be) a driver default, not a chip default.
Guenter
> On a related note, anyone have any idea why we seem to have two subtly
> different SP805 bindings defined?
>
> Robin.
>
> > Examples:
> >
> --
> To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805
2018-05-23 16:25 ` Ray Jui
@ 2018-05-23 18:59 ` Rob Herring
2018-05-23 19:29 ` Ray Jui
0 siblings, 1 reply; 26+ messages in thread
From: Rob Herring @ 2018-05-23 18:59 UTC (permalink / raw)
To: Ray Jui
Cc: Robin Murphy, Wim Van Sebroeck, Guenter Roeck, Mark Rutland,
Frank Rowand, Catalin Marinas, Will Deacon, devicetree,
linux-watchdog, linux-kernel, bcm-kernel-feedback-list,
linux-arm-kernel
On Wed, May 23, 2018 at 09:25:49AM -0700, Ray Jui wrote:
>
>
> On 5/23/2018 3:57 AM, Robin Murphy wrote:
> > On 22/05/18 19:47, Ray Jui wrote:
> > > Update the SP805 binding document to add optional 'timeout-sec'
> > > devicetree property
> > >
> > > Signed-off-by: Ray Jui <ray.jui@broadcom.com>
> > > Reviewed-by: Scott Branden <scott.branden@broadcom.com>
> > > ---
> > > Documentation/devicetree/bindings/watchdog/sp805-wdt.txt | 2 ++
> > > 1 file changed, 2 insertions(+)
> > >
> > > diff --git
> > > a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> > > b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> > > index edc4f0e..f898a86 100644
> > > --- a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> > > +++ b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> > > @@ -19,6 +19,8 @@ Required properties:
> > > Optional properties:
> > > - interrupts : Should specify WDT interrupt number.
> > > +- timeout-sec : Should specify default WDT timeout in seconds. If
> > > unset, the
> > > + default timeout is 30 seconds
> >
> > According to the SP805 TRM, the default interval is dependent on the
> > rate of WDOGCLK, but would typically be a lot longer than that :/
> >
> > On a related note, anyone have any idea why we seem to have two subtly
> > different SP805 bindings defined?
Sigh.
> Interesting, I did not even know that until you pointed this out (and it's
> funny that I found that I actually reviewed arm,sp805.txt internally in
> Broadcom code review).
>
> It looks like one was done by Bhupesh Sharma (sp805-wdt.txt) and the other
> was done by Anup Patel (arm,sp805.txt). Both were merged at the same time
> around March 20, 2016: 915c56bc01d6. I'd assume both were sent out at around
> the same time.
>
> It sounds like we should definitely remove one of them. Given that
> sp805-wdt.txt appears to have more detailed descriptions on the use of the
> clocks, should we remove arm,sp805.txt?
Take whichever text you like, but I prefer filenames using the
compatible string and the correct string is 'arm,sp805' because '-wdt'
is redundant. You can probably safely just update all the dts files with
'arm,sp805' and just remove 'arm,sp805-wdt' because it is not actually
used (as the ID registers are).
Rob
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805
2018-05-23 18:59 ` Rob Herring
@ 2018-05-23 19:29 ` Ray Jui
2018-05-24 13:52 ` Robin Murphy
0 siblings, 1 reply; 26+ messages in thread
From: Ray Jui @ 2018-05-23 19:29 UTC (permalink / raw)
To: Rob Herring
Cc: Robin Murphy, Wim Van Sebroeck, Guenter Roeck, Mark Rutland,
Frank Rowand, Catalin Marinas, Will Deacon, devicetree,
linux-watchdog, linux-kernel, bcm-kernel-feedback-list,
linux-arm-kernel
On 5/23/2018 11:59 AM, Rob Herring wrote:
> On Wed, May 23, 2018 at 09:25:49AM -0700, Ray Jui wrote:
>>
>>
>> On 5/23/2018 3:57 AM, Robin Murphy wrote:
>>> On 22/05/18 19:47, Ray Jui wrote:
>>>> Update the SP805 binding document to add optional 'timeout-sec'
>>>> devicetree property
>>>>
>>>> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
>>>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>>>> ---
>>>> Documentation/devicetree/bindings/watchdog/sp805-wdt.txt | 2 ++
>>>> 1 file changed, 2 insertions(+)
>>>>
>>>> diff --git
>>>> a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>>>> b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>>>> index edc4f0e..f898a86 100644
>>>> --- a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>>>> +++ b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>>>> @@ -19,6 +19,8 @@ Required properties:
>>>> Optional properties:
>>>> - interrupts : Should specify WDT interrupt number.
>>>> +- timeout-sec : Should specify default WDT timeout in seconds. If
>>>> unset, the
>>>> + default timeout is 30 seconds
>>>
>>> According to the SP805 TRM, the default interval is dependent on the
>>> rate of WDOGCLK, but would typically be a lot longer than that :/
>>>
>>> On a related note, anyone have any idea why we seem to have two subtly
>>> different SP805 bindings defined?
>
> Sigh.
>
>> Interesting, I did not even know that until you pointed this out (and it's
>> funny that I found that I actually reviewed arm,sp805.txt internally in
>> Broadcom code review).
>>
>> It looks like one was done by Bhupesh Sharma (sp805-wdt.txt) and the other
>> was done by Anup Patel (arm,sp805.txt). Both were merged at the same time
>> around March 20, 2016: 915c56bc01d6. I'd assume both were sent out at around
>> the same time.
>>
>> It sounds like we should definitely remove one of them. Given that
>> sp805-wdt.txt appears to have more detailed descriptions on the use of the
>> clocks, should we remove arm,sp805.txt?
>
> Take whichever text you like, but I prefer filenames using the
> compatible string and the correct string is 'arm,sp805' because '-wdt'
> is redundant. You can probably safely just update all the dts files with
> 'arm,sp805' and just remove 'arm,sp805-wdt' because it is not actually
> used (as the ID registers are).
Okay. I'll consolidate everything into arm,sp805.txt. Will also fix all
DTS files to use "arm,sp805". The fix for actual DTS files will be in a
different patch series.
>
> Rob
>
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate
2018-05-23 18:09 ` Guenter Roeck
@ 2018-05-23 19:35 ` Ray Jui
0 siblings, 0 replies; 26+ messages in thread
From: Ray Jui @ 2018-05-23 19:35 UTC (permalink / raw)
To: Guenter Roeck, Robin Murphy
Cc: Scott Branden, Mark Rutland, devicetree, linux-watchdog,
Catalin Marinas, Will Deacon, linux-kernel, Rob Herring,
bcm-kernel-feedback-list, Wim Van Sebroeck, Frank Rowand,
linux-arm-kernel
Hi Guenter/Robin,
On 5/23/2018 11:09 AM, Guenter Roeck wrote:
> On Wed, May 23, 2018 at 06:15:14PM +0100, Robin Murphy wrote:
>> On 23/05/18 17:29, Ray Jui wrote:
>>> Hi Robin,
>>>
>>> On 5/23/2018 4:48 AM, Robin Murphy wrote:
>>>> On 23/05/18 08:52, Scott Branden wrote:
>>>>>
>>>>>
>>>>> On 18-05-22 04:24 PM, Ray Jui wrote:
>>>>>> Hi Guenter,
>>>>>>
>>>>>> On 5/22/2018 1:54 PM, Guenter Roeck wrote:
>>>>>>> On Tue, May 22, 2018 at 11:47:18AM -0700, Ray Jui wrote:
>>>>>>>> If the watchdog hardware is already enabled during the boot process,
>>>>>>>> when the Linux watchdog driver loads, it should reset the
>>>>>>>> watchdog and
>>>>>>>> tell the watchdog framework. As a result, ping can be generated from
>>>>>>>> the watchdog framework, until the userspace watchdog daemon
>>>>>>>> takes over
>>>>>>>> control
>>>>>>>>
>>>>>>>> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
>>>>>>>> Reviewed-by: Vladimir Olovyannikov
>>>>>>>> <vladimir.olovyannikov@broadcom.com>
>>>>>>>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>>>>>>>> ---
>>>>>>>> drivers/watchdog/sp805_wdt.c | 22 ++++++++++++++++++++++
>>>>>>>> 1 file changed, 22 insertions(+)
>>>>>>>>
>>>>>>>> diff --git a/drivers/watchdog/sp805_wdt.c
>>>>>>>> b/drivers/watchdog/sp805_wdt.c
>>>>>>>> index 1484609..408ffbe 100644
>>>>>>>> --- a/drivers/watchdog/sp805_wdt.c
>>>>>>>> +++ b/drivers/watchdog/sp805_wdt.c
>>>>>>>> @@ -42,6 +42,7 @@
>>>>>>>> /* control register masks */
>>>>>>>> #define INT_ENABLE (1 << 0)
>>>>>>>> #define RESET_ENABLE (1 << 1)
>>>>>>>> + #define ENABLE_MASK (INT_ENABLE | RESET_ENABLE)
>>>>>>>> #define WDTINTCLR 0x00C
>>>>>>>> #define WDTRIS 0x010
>>>>>>>> #define WDTMIS 0x014
>>>>>>>> @@ -74,6 +75,18 @@ module_param(nowayout, bool, 0);
>>>>>>>> MODULE_PARM_DESC(nowayout,
>>>>>>>> "Set to 1 to keep watchdog running after device release");
>>>>>>>> +/* returns true if wdt is running; otherwise returns false */
>>>>>>>> +static bool wdt_is_running(struct watchdog_device *wdd)
>>>>>>>> +{
>>>>>>>> + struct sp805_wdt *wdt = watchdog_get_drvdata(wdd);
>>>>>>>> +
>>>>>>>> + if ((readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK) ==
>>>>>>>> + ENABLE_MASK)
>>>>>>>> + return true;
>>>>>>>> + else
>>>>>>>> + return false;
>>>>>>>
>>>>>>> return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
>>>>>>>
>>>>>>
>>>>>> Note ENABLE_MASK contains two bits (INT_ENABLE and RESET_ENABLE);
>>>>>> therefore, a simple !!(expression) would not work? That is, the
>>>>>> masked result needs to be compared against the mask again to ensure
>>>>>> both bits are set, right?
>>>>> Ray - your original code looks correct to me. Easier to read and less
>>>>> prone to errors as shown in the attempted translation to a single
>>>>> statement.
>>>>
>>>> if (<boolean condition>)
>>>> return true;
>>>> else
>>>> return false;
>>>>
>>>> still looks really dumb, though, and IMO is actually harder to read than
>>>> just "return <boolean condition>;" because it forces you to stop and
>>>> double-check that the logic is, in fact, only doing the obvious thing.
>>>
>>> If you can propose a way to modify my original code above to make it more
>>> readable, I'm fine to make the change.
>>
>> Well,
>>
>> return readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK == ENABLE_MASK;
>>
>> would probably be reasonable to anyone other than the 80-column zealots, but
>> removing the silly boolean-to-boolean translation idiom really only
>> emphasises the fact that it's fundamentally a big complex statement; for
>> maximum clarity I'd be inclined to separate the two logical operations (read
>> and comparison), e.g.:
>>
>> u32 wdtcontrol = readl_relaxed(wdt->base + WDTCONTROL);
>>
>> return wdtcontrol & ENABLE_MASK == ENABLE_MASK;
>
> == has higher precendence than bitwise &, so this will need ( ),
> but otherwise I agree.
>
Sure. Let me change the code to the following:
u32 wdtcontrol = readl_relaxed(wdt->base + WDTCONTROL);
return (wdtcontrol & ENABLE_MASK) == ENABLE_MASK;
Thanks.
Ray
>>
>> which is still -3 lines vs. the original.
>>
>>> As I mentioned, I don't think the following change proposed by Guenter
>>> will work due to the reason I pointed out:
>>>
>>> return !!(readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK));
>>
>> FWIW, getting the desired result should only need one logical not swapping
>> for a bitwise one there:
>>
>> return !(~readl_relaxed(wdt->base + WDTCONTROL) & ENABLE_MASK);
>>
>> but that's well into "too clever for its own good" territory ;)
>
> Yes, that would be confusing.
>
>>
>> Robin.
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805
2018-05-23 18:10 ` Guenter Roeck
@ 2018-05-24 13:25 ` Robin Murphy
2018-05-24 16:07 ` Guenter Roeck
0 siblings, 1 reply; 26+ messages in thread
From: Robin Murphy @ 2018-05-24 13:25 UTC (permalink / raw)
To: Guenter Roeck
Cc: Mark Rutland, devicetree, linux-watchdog, Catalin Marinas,
Will Deacon, linux-kernel, Rob Herring, Ray Jui,
bcm-kernel-feedback-list, Wim Van Sebroeck, Frank Rowand,
linux-arm-kernel
On 23/05/18 19:10, Guenter Roeck wrote:
> On Wed, May 23, 2018 at 11:57:25AM +0100, Robin Murphy wrote:
>> On 22/05/18 19:47, Ray Jui wrote:
>>> Update the SP805 binding document to add optional 'timeout-sec'
>>> devicetree property
>>>
>>> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
>>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>>> ---
>>> Documentation/devicetree/bindings/watchdog/sp805-wdt.txt | 2 ++
>>> 1 file changed, 2 insertions(+)
>>>
>>> diff --git a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>>> index edc4f0e..f898a86 100644
>>> --- a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>>> +++ b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>>> @@ -19,6 +19,8 @@ Required properties:
>>> Optional properties:
>>> - interrupts : Should specify WDT interrupt number.
>>> +- timeout-sec : Should specify default WDT timeout in seconds. If unset, the
>>> + default timeout is 30 seconds
>>
>> According to the SP805 TRM, the default interval is dependent on the rate of
>> WDOGCLK, but would typically be a lot longer than that :/
>>
> Depends on the definition of "default". In the context of watchdog drivers,
> it is (or should be) a driver default, not a chip default.
DT describes hardware, not driver behaviour.
I appreciate that where a timeout *is* specified, that is effectively a
hardware aspect even if it's something an OS consuming the binding still
has to voluntarily program into the device. The notion of "this is the
longest period of time for which you can reasonably expect to see no
activity under normal operation" is indeed a property of the platform as
a whole - a system with user-accessible PCIe slots may need to reflect
the worst case of one CPU waiting for an ATS invalidation timeout with
interrupts disabled, whereas a much shorter period might be appropriate
for the same SoC in some closed-down embedded device.
The absence of the property, though, doesn't convey anything other than
"I don't know" and/or "it doesn't really matter", and in that situation
the default is always going to be "whatever the OS thinks is
appropriate". The binding itself can't possibly know, whereas an OS
might be configured for some pseudo-real-time application which it knows
warrants a maximum of 100ms regardless of what the DT does or doesn't
say. In the case of SP805, if the OS doesn't reconfigure it at all,
there happens to be an actual hardware default of (2^32 / WDOGCLK), but
since that's already implicit in the compatible it doesn't really need
saying either.
Optional properties don't need to explicitly state what their absence
might infer, especially when it's not directly meaningful (just imagine
trying to do that for bindings/regulator/regulator.txt...), so I would
suggest following the 93% of existing bindings which simply don't try to
claim some default value for this property.
I also think the fact that, within the context of this patch series, the
Linux driver doesn't even do what the binding claims only goes to help
make my point ;)
Robin.
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805
2018-05-23 19:29 ` Ray Jui
@ 2018-05-24 13:52 ` Robin Murphy
0 siblings, 0 replies; 26+ messages in thread
From: Robin Murphy @ 2018-05-24 13:52 UTC (permalink / raw)
To: Ray Jui, Rob Herring
Cc: Wim Van Sebroeck, Guenter Roeck, Mark Rutland, Frank Rowand,
Catalin Marinas, Will Deacon, devicetree, linux-watchdog,
linux-kernel, bcm-kernel-feedback-list, linux-arm-kernel
On 23/05/18 20:29, Ray Jui wrote:
>
>
> On 5/23/2018 11:59 AM, Rob Herring wrote:
>> On Wed, May 23, 2018 at 09:25:49AM -0700, Ray Jui wrote:
>>>
>>>
>>> On 5/23/2018 3:57 AM, Robin Murphy wrote:
>>>> On 22/05/18 19:47, Ray Jui wrote:
>>>>> Update the SP805 binding document to add optional 'timeout-sec'
>>>>> devicetree property
>>>>>
>>>>> Signed-off-by: Ray Jui <ray.jui@broadcom.com>
>>>>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>>>>> ---
>>>>> Documentation/devicetree/bindings/watchdog/sp805-wdt.txt | 2 ++
>>>>> 1 file changed, 2 insertions(+)
>>>>>
>>>>> diff --git
>>>>> a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>>>>> b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>>>>> index edc4f0e..f898a86 100644
>>>>> --- a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>>>>> +++ b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
>>>>> @@ -19,6 +19,8 @@ Required properties:
>>>>> Optional properties:
>>>>> - interrupts : Should specify WDT interrupt number.
>>>>> +- timeout-sec : Should specify default WDT timeout in seconds. If
>>>>> unset, the
>>>>> + default timeout is 30 seconds
>>>>
>>>> According to the SP805 TRM, the default interval is dependent on the
>>>> rate of WDOGCLK, but would typically be a lot longer than that :/
>>>>
>>>> On a related note, anyone have any idea why we seem to have two subtly
>>>> different SP805 bindings defined?
>>
>> Sigh.
>>
>>> Interesting, I did not even know that until you pointed this out (and
>>> it's
>>> funny that I found that I actually reviewed arm,sp805.txt internally in
>>> Broadcom code review).
>>>
>>> It looks like one was done by Bhupesh Sharma (sp805-wdt.txt) and the
>>> other
>>> was done by Anup Patel (arm,sp805.txt). Both were merged at the same
>>> time
>>> around March 20, 2016: 915c56bc01d6. I'd assume both were sent out at
>>> around
>>> the same time.
>>>
>>> It sounds like we should definitely remove one of them. Given that
>>> sp805-wdt.txt appears to have more detailed descriptions on the use
>>> of the
>>> clocks, should we remove arm,sp805.txt?
>>
>> Take whichever text you like, but I prefer filenames using the
>> compatible string and the correct string is 'arm,sp805' because '-wdt'
>> is redundant. You can probably safely just update all the dts files with
>> 'arm,sp805' and just remove 'arm,sp805-wdt' because it is not actually
>> used (as the ID registers are).
>
> Okay. I'll consolidate everything into arm,sp805.txt. Will also fix all
> DTS files to use "arm,sp805". The fix for actual DTS files will be in a
> different patch series.
Looking at the current in-tree DTs, for extra fun try to figure out
which binding each instance was following for the clocks. The most
common answer seems to be "neither"... :(
Robin.
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805
2018-05-24 13:25 ` Robin Murphy
@ 2018-05-24 16:07 ` Guenter Roeck
0 siblings, 0 replies; 26+ messages in thread
From: Guenter Roeck @ 2018-05-24 16:07 UTC (permalink / raw)
To: Robin Murphy
Cc: Mark Rutland, devicetree, linux-watchdog, Catalin Marinas,
Will Deacon, linux-kernel, Rob Herring, Ray Jui,
bcm-kernel-feedback-list, Wim Van Sebroeck, Frank Rowand,
linux-arm-kernel
On Thu, May 24, 2018 at 02:25:34PM +0100, Robin Murphy wrote:
> On 23/05/18 19:10, Guenter Roeck wrote:
> >On Wed, May 23, 2018 at 11:57:25AM +0100, Robin Murphy wrote:
> >>On 22/05/18 19:47, Ray Jui wrote:
> >>>Update the SP805 binding document to add optional 'timeout-sec'
> >>>devicetree property
> >>>
> >>>Signed-off-by: Ray Jui <ray.jui@broadcom.com>
> >>>Reviewed-by: Scott Branden <scott.branden@broadcom.com>
> >>>---
> >>> Documentation/devicetree/bindings/watchdog/sp805-wdt.txt | 2 ++
> >>> 1 file changed, 2 insertions(+)
> >>>
> >>>diff --git a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> >>>index edc4f0e..f898a86 100644
> >>>--- a/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> >>>+++ b/Documentation/devicetree/bindings/watchdog/sp805-wdt.txt
> >>>@@ -19,6 +19,8 @@ Required properties:
> >>> Optional properties:
> >>> - interrupts : Should specify WDT interrupt number.
> >>>+- timeout-sec : Should specify default WDT timeout in seconds. If unset, the
> >>>+ default timeout is 30 seconds
> >>
> >>According to the SP805 TRM, the default interval is dependent on the rate of
> >>WDOGCLK, but would typically be a lot longer than that :/
> >>
> >Depends on the definition of "default". In the context of watchdog drivers,
> >it is (or should be) a driver default, not a chip default.
>
> DT describes hardware, not driver behaviour.
>
In this case it describes expected system behavior. Most definitely
it does not describe some hardware default.
Please note that I do not engage in discussions I consider bike-shedding.
This is one of those. Dropping out.
Guenter
^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2018-05-24 16:07 UTC | newest]
Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-22 18:47 [PATCH 0/5] Enhance support for the SP805 WDT Ray Jui
2018-05-22 18:47 ` [PATCH 1/5] Documentation: DT: Add optional 'timeout-sec' property for sp805 Ray Jui
2018-05-22 20:56 ` Guenter Roeck
2018-05-23 10:57 ` Robin Murphy
2018-05-23 16:25 ` Ray Jui
2018-05-23 18:59 ` Rob Herring
2018-05-23 19:29 ` Ray Jui
2018-05-24 13:52 ` Robin Murphy
2018-05-23 18:10 ` Guenter Roeck
2018-05-24 13:25 ` Robin Murphy
2018-05-24 16:07 ` Guenter Roeck
2018-05-22 18:47 ` [PATCH 2/5] watchdog: sp805: add 'timeout-sec' DT property support Ray Jui
2018-05-22 20:57 ` Guenter Roeck
2018-05-22 18:47 ` [PATCH 3/5] watchdog: sp805: set WDOG_HW_RUNNING when appropriate Ray Jui
2018-05-22 20:54 ` Guenter Roeck
2018-05-22 23:24 ` Ray Jui
2018-05-23 7:52 ` Scott Branden
2018-05-23 11:48 ` Robin Murphy
2018-05-23 16:29 ` Ray Jui
2018-05-23 17:15 ` Robin Murphy
2018-05-23 18:09 ` Guenter Roeck
2018-05-23 19:35 ` Ray Jui
2018-05-23 17:15 ` Scott Branden
2018-05-23 18:06 ` Guenter Roeck
2018-05-22 18:47 ` [PATCH 4/5] arm64: dt: set initial SR watchdog timeout to 60 seconds Ray Jui
2018-05-22 18:47 ` [PATCH 5/5] arm64: defconfig: add CONFIG_ARM_SP805_WATCHDOG Ray Jui
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).