watchdog: tangier: Convert to use WDT class

Convert legacy driver to use watchdog class.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Stefan Roese <sr@denx.de>
This commit is contained in:
Andy Shevchenko 2019-06-21 13:28:08 +03:00 committed by Bin Meng
parent 8b295a2026
commit c974a3d155
6 changed files with 60 additions and 39 deletions

View File

@ -10,7 +10,6 @@ config INTEL_TANGIER
imply MMC_SDHCI imply MMC_SDHCI
imply MMC_SDHCI_SDMA imply MMC_SDHCI_SDMA
imply MMC_SDHCI_TANGIER imply MMC_SDHCI_TANGIER
imply TANGIER_WATCHDOG
imply USB imply USB
imply USB_DWC3 imply USB_DWC3

View File

@ -104,6 +104,10 @@
reg = <0xff009000 0x1000>; reg = <0xff009000 0x1000>;
}; };
watchdog: wdt@0 {
compatible = "intel,tangier-wdt";
};
reset { reset {
compatible = "intel,reset-tangier"; compatible = "intel,reset-tangier";
u-boot,dm-pre-reloc; u-boot,dm-pre-reloc;

View File

@ -39,5 +39,7 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x8087
CONFIG_USB_GADGET_PRODUCT_NUM=0x0a99 CONFIG_USB_GADGET_PRODUCT_NUM=0x0a99
CONFIG_USB_GADGET_DOWNLOAD=y CONFIG_USB_GADGET_DOWNLOAD=y
# CONFIG_USB_HOST_ETHER is not set # CONFIG_USB_HOST_ETHER is not set
CONFIG_WDT=y
CONFIG_WDT_TANGIER=y
CONFIG_FAT_WRITE=y CONFIG_FAT_WRITE=y
CONFIG_SHA1=y CONFIG_SHA1=y

View File

@ -41,15 +41,6 @@ config OMAP_WATCHDOG
help help
Say Y here to enable the OMAP3+ watchdog driver. Say Y here to enable the OMAP3+ watchdog driver.
config TANGIER_WATCHDOG
bool "Intel Tangier watchdog"
depends on INTEL_MID
select HW_WATCHDOG
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 config ULP_WATCHDOG
bool "i.MX7ULP watchdog" bool "i.MX7ULP watchdog"
help help
@ -170,4 +161,12 @@ config XILINX_TB_WATCHDOG
Select this to enable Xilinx Axi watchdog timer, which can be found on some Select this to enable Xilinx Axi watchdog timer, which can be found on some
Xilinx Microblaze Platforms. Xilinx Microblaze Platforms.
config WDT_TANGIER
bool "Intel Tangier watchdog timer support"
depends on WDT && 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.
endmenu endmenu

View File

@ -14,7 +14,6 @@ obj-$(CONFIG_S5P) += s5p_wdt.o
obj-$(CONFIG_XILINX_TB_WATCHDOG) += xilinx_tb_wdt.o obj-$(CONFIG_XILINX_TB_WATCHDOG) += xilinx_tb_wdt.o
obj-$(CONFIG_OMAP_WATCHDOG) += omap_wdt.o obj-$(CONFIG_OMAP_WATCHDOG) += omap_wdt.o
obj-$(CONFIG_DESIGNWARE_WATCHDOG) += designware_wdt.o obj-$(CONFIG_DESIGNWARE_WATCHDOG) += designware_wdt.o
obj-$(CONFIG_TANGIER_WATCHDOG) += tangier_wdt.o
obj-$(CONFIG_ULP_WATCHDOG) += ulp_wdog.o obj-$(CONFIG_ULP_WATCHDOG) += ulp_wdog.o
obj-$(CONFIG_WDT) += wdt-uclass.o obj-$(CONFIG_WDT) += wdt-uclass.o
obj-$(CONFIG_WDT_SANDBOX) += sandbox_wdt.o obj-$(CONFIG_WDT_SANDBOX) += sandbox_wdt.o
@ -29,3 +28,4 @@ obj-$(CONFIG_WDT_MT7621) += mt7621_wdt.o
obj-$(CONFIG_WDT_MTK) += mtk_wdt.o obj-$(CONFIG_WDT_MTK) += mtk_wdt.o
obj-$(CONFIG_WDT_SP805) += sp805_wdt.o obj-$(CONFIG_WDT_SP805) += sp805_wdt.o
obj-$(CONFIG_WDT_STM32MP) += stm32mp_wdt.o obj-$(CONFIG_WDT_STM32MP) += stm32mp_wdt.o
obj-$(CONFIG_WDT_TANGIER) += tangier_wdt.o

View File

@ -3,7 +3,9 @@
* Copyright (c) 2017 Intel Corporation * Copyright (c) 2017 Intel Corporation
*/ */
#include <common.h> #include <common.h>
#include <watchdog.h> #include <dm.h>
#include <wdt.h>
#include <div64.h>
#include <asm/scu.h> #include <asm/scu.h>
/* Hardware timeout in seconds */ /* Hardware timeout in seconds */
@ -17,12 +19,6 @@
* the reboot will happen. * the reboot will happen.
*/ */
#ifndef CONFIG_WATCHDOG_TIMEOUT_MSECS
#define WATCHDOG_HEARTBEAT 60000
#else
#define WATCHDOG_HEARTBEAT CONFIG_WATCHDOG_TIMEOUT_MSECS
#endif
enum { enum {
SCU_WATCHDOG_START = 0, SCU_WATCHDOG_START = 0,
SCU_WATCHDOG_STOP = 1, SCU_WATCHDOG_STOP = 1,
@ -30,39 +26,33 @@ enum {
SCU_WATCHDOG_SET_ACTION_ON_TIMEOUT = 3, SCU_WATCHDOG_SET_ACTION_ON_TIMEOUT = 3,
}; };
void hw_watchdog_reset(void) static int tangier_wdt_reset(struct udevice *dev)
{ {
static unsigned long last; scu_ipc_simple_command(IPCMSG_WATCHDOG_TIMER, SCU_WATCHDOG_KEEPALIVE);
unsigned long now; return 0;
if (gd->timer)
now = timer_get_us();
else
now = rdtsc() / 1000;
/* Do not flood SCU */
if (last > now)
last = 0;
if (unlikely((now - last) > (WDT_PRETIMEOUT / 2) * 1000000)) {
last = now;
scu_ipc_simple_command(IPCMSG_WATCHDOG_TIMER, SCU_WATCHDOG_KEEPALIVE);
}
} }
int hw_watchdog_disable(void) static int tangier_wdt_stop(struct udevice *dev)
{ {
return scu_ipc_simple_command(IPCMSG_WATCHDOG_TIMER, SCU_WATCHDOG_STOP); return scu_ipc_simple_command(IPCMSG_WATCHDOG_TIMER, SCU_WATCHDOG_STOP);
} }
void hw_watchdog_init(void) static int tangier_wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags)
{ {
u32 timeout = WATCHDOG_HEARTBEAT / 1000; u32 timeout_sec;
int in_size; int in_size;
struct ipc_wd_start { struct ipc_wd_start {
u32 pretimeout; u32 pretimeout;
u32 timeout; u32 timeout;
} ipc_wd_start = { timeout - WDT_PRETIMEOUT, timeout }; } ipc_wd_start;
/* Calculate timeout in seconds and restrict to min and max value */
do_div(timeout_ms, 1000);
timeout_sec = clamp_t(u32, timeout_ms, WDT_TIMEOUT_MIN, WDT_TIMEOUT_MAX);
/* Update values in the IPC request */
ipc_wd_start.pretimeout = timeout_sec - WDT_PRETIMEOUT;
ipc_wd_start.timeout = timeout_sec;
/* /*
* SCU expects the input size for watchdog IPC * SCU expects the input size for watchdog IPC
@ -72,4 +62,31 @@ void hw_watchdog_init(void)
scu_ipc_command(IPCMSG_WATCHDOG_TIMER, SCU_WATCHDOG_START, scu_ipc_command(IPCMSG_WATCHDOG_TIMER, SCU_WATCHDOG_START,
(u32 *)&ipc_wd_start, in_size, NULL, 0); (u32 *)&ipc_wd_start, in_size, NULL, 0);
return 0;
} }
static const struct wdt_ops tangier_wdt_ops = {
.reset = tangier_wdt_reset,
.start = tangier_wdt_start,
.stop = tangier_wdt_stop,
};
static const struct udevice_id tangier_wdt_ids[] = {
{ .compatible = "intel,tangier-wdt" },
{ /* sentinel */ }
};
static int tangier_wdt_probe(struct udevice *dev)
{
debug("%s: Probing wdt%u\n", __func__, dev->seq);
return 0;
}
U_BOOT_DRIVER(wdt_tangier) = {
.name = "wdt_tangier",
.id = UCLASS_WDT,
.of_match = tangier_wdt_ids,
.ops = &tangier_wdt_ops,
.probe = tangier_wdt_probe,
};