From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lukasz Majewski Date: Tue, 18 Apr 2017 16:49:26 +0200 Subject: [U-Boot] [PATCH v1] watchdog: Introduce watchdog driver for Intel Tangier In-Reply-To: <20170418135149.39798-1-andriy.shevchenko@linux.intel.com> References: <20170418135149.39798-1-andriy.shevchenko@linux.intel.com> Message-ID: <20170418164926.040301f7@jawa> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Andy, > From: Felipe Balbi > > Add watchdog driver for Intel Tangier based platforms. > > Signed-off-by: Vincent Tinelli > Signed-off-by: Felipe Balbi > Signed-off-by: Andy Shevchenko > --- > common/board_f.c | 1 + > drivers/watchdog/Kconfig | 8 ++++++ > drivers/watchdog/Makefile | 1 + > drivers/watchdog/tangier_wdt.c | 63 > ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 73 > insertions(+) create mode 100644 drivers/watchdog/tangier_wdt.c > > diff --git a/common/board_f.c b/common/board_f.c > index d9431ee79a..ad1eae98a5 100644 > --- a/common/board_f.c > +++ b/common/board_f.c > @@ -91,6 +91,7 @@ static int init_func_watchdog_init(void) > (defined(CONFIG_M68K) || defined(CONFIG_MICROBLAZE) || \ > defined(CONFIG_SH) || defined(CONFIG_AT91SAM9_WATCHDOG) || \ > defined(CONFIG_DESIGNWARE_WATCHDOG) || \ > + defined(CONFIG_TANGIER_WATCHDOG) || \ > defined(CONFIG_IMX_WATCHDOG)) I have stumbled upon similar patch... There should be new Kconfig option created and enabled in required SoCs. > hw_watchdog_init(); > puts(" Watchdog enabled\n"); > diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig > index dbdaafc149..66fe70dba1 100644 > --- a/drivers/watchdog/Kconfig > +++ b/drivers/watchdog/Kconfig > @@ -1,5 +1,13 @@ > menu "WATCHDOG support" > > +config TANGIER_WATCHDOG > + bool "Intel Tangier watchdog" > + depends on INTEL_MID > + help > + This enables support for watchdog controller available on > + Intel Tangier SoC. If you're using a board with Intel > Tangier > + SoC, say Y here. > + > config ULP_WATCHDOG > bool "i.MX7ULP watchdog" > help > diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile > index dea18363ca..7b77d8379f 100644 > --- a/drivers/watchdog/Makefile > +++ b/drivers/watchdog/Makefile > @@ -15,4 +15,5 @@ obj-$(CONFIG_XILINX_TB_WATCHDOG) += xilinx_tb_wdt.o > obj-$(CONFIG_BFIN_WATCHDOG) += bfin_wdt.o > obj-$(CONFIG_OMAP_WATCHDOG) += omap_wdt.o > obj-$(CONFIG_DESIGNWARE_WATCHDOG) += designware_wdt.o > +obj-$(CONFIG_TANGIER_WATCHDOG) += tangier_wdt.o > obj-$(CONFIG_ULP_WATCHDOG) += ulp_wdog.o > diff --git a/drivers/watchdog/tangier_wdt.c > b/drivers/watchdog/tangier_wdt.c new file mode 100644 > index 0000000000..23be71a42f > --- /dev/null > +++ b/drivers/watchdog/tangier_wdt.c > @@ -0,0 +1,63 @@ > +/* > + * Copyright (c) 2017 Intel Corporation > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > +#include > +#include > +#include > + > +/* Hardware timeout in seconds */ > +#ifndef CONFIG_WATCHDOG_TIMEOUT_MSECS > +#define WATCHDOG_HEARTBEAT 60000 > +#else > +#define WATCHDOG_HEARTBEAT CONFIG_WATCHDOG_TIMEOUT_MSECS > +#endif > + > +enum { > + SCU_WATCHDOG_START = 0, > + SCU_WATCHDOG_STOP = 1, > + SCU_WATCHDOG_KEEPALIVE = 2, > + SCU_WATCHDOG_SET_ACTION_ON_TIMEOUT = 3, > +}; > + > +void hw_watchdog_reset(void) > +{ > + static unsigned long prev; > + unsigned long now; > + > + if (gd->timer) > + now = timer_get_us(); > + else > + now = rdtsc() / 1000000; > + > + /* Do not flood SCU */ > + if (unlikely((now - prev) > (WATCHDOG_HEARTBEAT * 1000))) { > + prev = now; > + scu_ipc_simple_command(IPCMSG_WATCHDOG_TIMER, > SCU_WATCHDOG_KEEPALIVE); > + } > +} > + > +int hw_watchdog_disable(void) > +{ > + return scu_ipc_simple_command(IPCMSG_WATCHDOG_TIMER, > SCU_WATCHDOG_STOP); +} > + > +void hw_watchdog_init(void) > +{ > + u32 timeout = WATCHDOG_HEARTBEAT / 1000; > + int in_size; > + struct ipc_wd_start { > + u32 pretimeout; > + u32 timeout; > + } ipc_wd_start = { timeout, timeout }; > + > + /* > + * SCU expects the input size for watchdog IPC > + * to be based on 4 bytes > + */ > + in_size = DIV_ROUND_UP(sizeof(ipc_wd_start), 4); > + > + scu_ipc_command(IPCMSG_WATCHDOG_TIMER, SCU_WATCHDOG_START, > + (u32 *)&ipc_wd_start, in_size, NULL, 0); > +} The code seems OK, but recently patches to add wdt-uclass has been posted: http://patchwork.ozlabs.org/patch/751448/ http://patchwork.ozlabs.org/patch/751451/ Maybe it would be better to port this driver to the uclass from the very beginning? Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de