[PATCH v1 15/15] board: ns3: start sp805 watchdog service
Simon Glass
sjg at chromium.org
Mon May 25 04:15:00 CEST 2020
Hi Rayagonda,
On Sun, 17 May 2020 at 02:21, Rayagonda Kokatanur
<rayagonda.kokatanur at broadcom.com> wrote:
>
> Start sp805 watchdog service.
>
> Parse wdt timeout from env and dts, give precedence to env
> timeout if defined. Set default timeout to 60s if both env
> and dts doesn't specifiy timeout.
>
> Stop the WDT in board late init and start the
> WDT service before giving control to Linux.
>
> Signed-off-by: Rayagonda Kokatanur <rayagonda.kokatanur at broadcom.com>
> Signed-off-by: Bharat Kumar Reddy Gooty <bharat.gooty at broadcom.com>
> Signed-off-by: Pramod Kumar <pramod.kumar at broadcom.com>
> ---
> board/broadcom/bcmns3/ns3.c | 56 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 56 insertions(+)
>
> diff --git a/board/broadcom/bcmns3/ns3.c b/board/broadcom/bcmns3/ns3.c
> index 51cab1aad3..37a3cf9d14 100644
> --- a/board/broadcom/bcmns3/ns3.c
> +++ b/board/broadcom/bcmns3/ns3.c
> @@ -11,9 +11,12 @@
> #include <asm/gic.h>
> #include <asm/gic-v3.h>
> #include <asm/system.h>
> +#include <dm/device.h>
> +#include <dm/uclass.h>
You can include <dm.h> and get both of those
> #include <dt-bindings/memory/bcm-ns3-mc.h>
> #include <fdtdec.h>
Hoping you don't need that?
> #include <fdt_support.h>
> +#include <wdt.h>
>
> #define BANK_OFFSET(bank) ((u64)BCM_NS3_DDR_INFO_BASE + 8 + ((bank) * 16))
Maybe you should change the BCM_NS3... to ULL? Then you shouldn't need
that cast.
>
> @@ -134,6 +137,14 @@ int board_init(void)
>
> int board_late_init(void)
> {
> +#if CONFIG_IS_ENABLED(WDT)
Is it possible to use if() instead of #if?
> + /*
> + * Default WDT service is started with 60 sec time out.
> + * Disable it and start before giving control to Linux.
> + */
> + wdt_stop(gd->watchdog_dev);
> +#endif
> +
> return 0;
> }
>
> @@ -185,12 +196,57 @@ void reset_cpu(ulong level)
> }
>
> #ifdef CONFIG_OF_BOARD_SETUP
> +#if CONFIG_IS_ENABLED(WDT)
> +
> +#ifndef CONFIG_WATCHDOG_TIMEOUT_MSECS
> +#define CONFIG_WATCHDOG_TIMEOUT_MSECS (60 * 1000)
> +#endif
> +#define DEF_TIMEOUT_SEC (CONFIG_WATCHDOG_TIMEOUT_MSECS / 1000)
> +
> +static int start_wdt(void)
> +{
> + u32 timeout = DEF_TIMEOUT_SEC;
> + struct udevice *udev;
> + int rc = 0;
> + u32 wdt_enable;
> +
> + wdt_enable = env_get_ulong("wdt_enable", 16, 0);
> + printf("wdt_enable :%u\n", wdt_enable);
> + if (!wdt_enable)
> + return rc;
> +
> + rc = uclass_get_device(UCLASS_WDT, 0, &udev);
> + if (rc) {
> + printf("Failed to get wdt rc:%d\n", rc);
I suggest return rc here, so you don't need the 'else' below, and the
extra indent/
> + } else {
> + timeout = env_get_ulong("wdt_timeout_sec", 10, 0);
> + if (!timeout) {
> + if (CONFIG_IS_ENABLED(OF_CONTROL))
> + timeout = dev_read_u32_default(gd->watchdog_dev,
> + "timeout-sec",
> + DEF_TIMEOUT_SEC);
> + }
> + wdt_start(udev, timeout * 1000, 0);
> + printf("Started wdt (%ds timeout)\n", timeout);
> + }
> +
> + return rc;
> +}
> +#else
Not sure why you need this:
> +static int start_wdt(void)
> +{
> + return 0;
> +}
> +#endif /* CONFIG_WDT */
> +
> int ft_board_setup(void *fdt, bd_t *bd)
> {
> gic_lpi_tables_init(BCM_NS3_GIC_LPI_BASE, MAX_GIC_REDISTRIBUTORS);
>
> mem_info_parse_fixup(fdt);
>
> + start_wdt();
Perhaps you could drop the #idefs above and do something like this here:
if (CONFIG_IS_ENABLED(WDT))
start_wdt();
> +
> return 0;
> }
> #endif /* CONFIG_OF_BOARD_SETUP */
> --
> 2.17.1
>
Regards,
Simon
More information about the U-Boot
mailing list