Re: [PATCH v2 3/4] watchdog: simatic-ipc-wdt: add new driver for Siemens Industrial PCs
Am Mon, 15 Mar 2021 08:10:25 -0700 schrieb Guenter Roeck : > On 3/15/21 2:57 AM, Henning Schild wrote: > > This driver adds initial support for several devices from Siemens. > > It is based on a platform driver introduced in an earlier commit. > > > > Signed-off-by: Henning Schild > > Reviewed-by: Guenter Roeck I assume that means i should insert this into v3, will do. The diff between v2 and v3 is only going to be a name change -module_platform_driver(wdt_driver); +module_platform_driver(simatic_ipc_wdt_driver); Henning > > --- > > drivers/watchdog/Kconfig | 11 ++ > > drivers/watchdog/Makefile | 1 + > > drivers/watchdog/simatic-ipc-wdt.c | 215 > > + 3 files changed, 227 insertions(+) > > create mode 100644 drivers/watchdog/simatic-ipc-wdt.c > > > > diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig > > index 1fe0042a48d2..948497eb4bef 100644 > > --- a/drivers/watchdog/Kconfig > > +++ b/drivers/watchdog/Kconfig > > @@ -1575,6 +1575,17 @@ config NIC7018_WDT > > To compile this driver as a module, choose M here: the > > module will be called nic7018_wdt. > > > > +config SIEMENS_SIMATIC_IPC_WDT > > + tristate "Siemens Simatic IPC Watchdog" > > + depends on SIEMENS_SIMATIC_IPC > > + select WATCHDOG_CORE > > + help > > + This driver adds support for several watchdogs found in > > Industrial > > + PCs from Siemens. > > + > > + To compile this driver as a module, choose M here: the > > module will be > > + called simatic-ipc-wdt. > > + > > # M68K Architecture > > > > config M54xx_WATCHDOG > > diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile > > index f3a6540e725e..7f5c73ec058c 100644 > > --- a/drivers/watchdog/Makefile > > +++ b/drivers/watchdog/Makefile > > @@ -142,6 +142,7 @@ obj-$(CONFIG_NI903X_WDT) += ni903x_wdt.o > > obj-$(CONFIG_NIC7018_WDT) += nic7018_wdt.o > > obj-$(CONFIG_MLX_WDT) += mlx_wdt.o > > obj-$(CONFIG_KEEMBAY_WATCHDOG) += keembay_wdt.o > > +obj-$(CONFIG_SIEMENS_SIMATIC_IPC_WDT) += simatic-ipc-wdt.o > > > > # M68K Architecture > > obj-$(CONFIG_M54xx_WATCHDOG) += m54xx_wdt.o > > diff --git a/drivers/watchdog/simatic-ipc-wdt.c > > b/drivers/watchdog/simatic-ipc-wdt.c new file mode 100644 > > index ..f0f948968db3 > > --- /dev/null > > +++ b/drivers/watchdog/simatic-ipc-wdt.c > > @@ -0,0 +1,215 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Siemens SIMATIC IPC driver for Watchdogs > > + * > > + * Copyright (c) Siemens AG, 2020-2021 > > + * > > + * Authors: > > + * Gerd Haeussler > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#define WD_ENABLE_IOADR0x62 > > +#define WD_TRIGGER_IOADR 0x66 > > +#define GPIO_COMMUNITY0_PORT_ID0xaf > > +#define PAD_CFG_DW0_GPP_A_23 0x4b8 > > +#define SAFE_EN_N_427E 0x01 > > +#define SAFE_EN_N_227E 0x04 > > +#define WD_ENABLED 0x01 > > +#define WD_TRIGGERED 0x80 > > +#define WD_MACROMODE 0x02 > > + > > +#define TIMEOUT_MIN2 > > +#define TIMEOUT_DEF64 > > +#define TIMEOUT_MAX64 > > + > > +#define GP_STATUS_REG_227E 0x404D /* IO PORT for > > SAFE_EN_N on 227E */ + > > +static bool nowayout = WATCHDOG_NOWAYOUT; > > +module_param(nowayout, bool, ); > > +MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once > > started (default=" > > +__MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); > > + > > +static struct resource gp_status_reg_227e_res = > > + DEFINE_RES_IO_NAMED(GP_STATUS_REG_227E, SZ_1, > > KBUILD_MODNAME); + > > +static struct resource io_resource = > > + DEFINE_RES_IO_NAMED(WD_ENABLE_IOADR, SZ_1, > > + KBUILD_MODNAME " WD_ENABLE_IOADR"); > > + > > +/* the actual start will be discovered with pci, 0 is a > > placeholder */ +static struct resource mem_resource = > > + DEFINE_RES_MEM_NAMED(0, SZ_4, "WD_RESET_BASE_ADR"); > > + > > +static u32 wd_timeout_table[] = {2, 4, 6, 8, 16, 32, 48, 64 }; > > +static void __iomem *wd_reset_base_addr; > > + > > +static int wd_start(struct watchdog_device *wdd) > > +{ > > + outb(inb(WD_ENABLE_IOADR) | WD_ENABLED, WD_ENABLE_IOADR); > > + return 0; > > +} > > + > > +static int wd_stop(struct watchdog_device *wdd) > > +{ > > + outb(inb(WD_ENABLE_IOADR) & ~WD_ENABLED, WD_ENABLE_IOADR); > > + return 0; > > +} > > + > > +static int wd_ping(struct watchdog_device *wdd) > > +{ > > + inb(WD_TRIGGER_IOADR); > > + return 0; > > +} > > + > > +static int wd_set_timeout(struct watchdog_device *wdd, unsigned > > int t) +{ > > + int timeout_idx = find_closest(t, wd_timeout_table, > > + > > ARRAY_SIZE(wd_timeout_table)); + > > + outb((inb(WD_ENABLE_IOADR) & 0xc7) | timeout_idx << 3, >
Re: [PATCH v2 3/4] watchdog: simatic-ipc-wdt: add new driver for Siemens Industrial PCs
On 3/15/21 2:57 AM, Henning Schild wrote: > This driver adds initial support for several devices from Siemens. It is > based on a platform driver introduced in an earlier commit. > > Signed-off-by: Henning Schild Reviewed-by: Guenter Roeck > --- > drivers/watchdog/Kconfig | 11 ++ > drivers/watchdog/Makefile | 1 + > drivers/watchdog/simatic-ipc-wdt.c | 215 + > 3 files changed, 227 insertions(+) > create mode 100644 drivers/watchdog/simatic-ipc-wdt.c > > diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig > index 1fe0042a48d2..948497eb4bef 100644 > --- a/drivers/watchdog/Kconfig > +++ b/drivers/watchdog/Kconfig > @@ -1575,6 +1575,17 @@ config NIC7018_WDT > To compile this driver as a module, choose M here: the module will be > called nic7018_wdt. > > +config SIEMENS_SIMATIC_IPC_WDT > + tristate "Siemens Simatic IPC Watchdog" > + depends on SIEMENS_SIMATIC_IPC > + select WATCHDOG_CORE > + help > + This driver adds support for several watchdogs found in Industrial > + PCs from Siemens. > + > + To compile this driver as a module, choose M here: the module will be > + called simatic-ipc-wdt. > + > # M68K Architecture > > config M54xx_WATCHDOG > diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile > index f3a6540e725e..7f5c73ec058c 100644 > --- a/drivers/watchdog/Makefile > +++ b/drivers/watchdog/Makefile > @@ -142,6 +142,7 @@ obj-$(CONFIG_NI903X_WDT) += ni903x_wdt.o > obj-$(CONFIG_NIC7018_WDT) += nic7018_wdt.o > obj-$(CONFIG_MLX_WDT) += mlx_wdt.o > obj-$(CONFIG_KEEMBAY_WATCHDOG) += keembay_wdt.o > +obj-$(CONFIG_SIEMENS_SIMATIC_IPC_WDT) += simatic-ipc-wdt.o > > # M68K Architecture > obj-$(CONFIG_M54xx_WATCHDOG) += m54xx_wdt.o > diff --git a/drivers/watchdog/simatic-ipc-wdt.c > b/drivers/watchdog/simatic-ipc-wdt.c > new file mode 100644 > index ..f0f948968db3 > --- /dev/null > +++ b/drivers/watchdog/simatic-ipc-wdt.c > @@ -0,0 +1,215 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Siemens SIMATIC IPC driver for Watchdogs > + * > + * Copyright (c) Siemens AG, 2020-2021 > + * > + * Authors: > + * Gerd Haeussler > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define WD_ENABLE_IOADR 0x62 > +#define WD_TRIGGER_IOADR 0x66 > +#define GPIO_COMMUNITY0_PORT_ID 0xaf > +#define PAD_CFG_DW0_GPP_A_23 0x4b8 > +#define SAFE_EN_N_427E 0x01 > +#define SAFE_EN_N_227E 0x04 > +#define WD_ENABLED 0x01 > +#define WD_TRIGGERED 0x80 > +#define WD_MACROMODE 0x02 > + > +#define TIMEOUT_MIN 2 > +#define TIMEOUT_DEF 64 > +#define TIMEOUT_MAX 64 > + > +#define GP_STATUS_REG_227E 0x404D /* IO PORT for SAFE_EN_N on 227E */ > + > +static bool nowayout = WATCHDOG_NOWAYOUT; > +module_param(nowayout, bool, ); > +MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started > (default=" > + __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); > + > +static struct resource gp_status_reg_227e_res = > + DEFINE_RES_IO_NAMED(GP_STATUS_REG_227E, SZ_1, KBUILD_MODNAME); > + > +static struct resource io_resource = > + DEFINE_RES_IO_NAMED(WD_ENABLE_IOADR, SZ_1, > + KBUILD_MODNAME " WD_ENABLE_IOADR"); > + > +/* the actual start will be discovered with pci, 0 is a placeholder */ > +static struct resource mem_resource = > + DEFINE_RES_MEM_NAMED(0, SZ_4, "WD_RESET_BASE_ADR"); > + > +static u32 wd_timeout_table[] = {2, 4, 6, 8, 16, 32, 48, 64 }; > +static void __iomem *wd_reset_base_addr; > + > +static int wd_start(struct watchdog_device *wdd) > +{ > + outb(inb(WD_ENABLE_IOADR) | WD_ENABLED, WD_ENABLE_IOADR); > + return 0; > +} > + > +static int wd_stop(struct watchdog_device *wdd) > +{ > + outb(inb(WD_ENABLE_IOADR) & ~WD_ENABLED, WD_ENABLE_IOADR); > + return 0; > +} > + > +static int wd_ping(struct watchdog_device *wdd) > +{ > + inb(WD_TRIGGER_IOADR); > + return 0; > +} > + > +static int wd_set_timeout(struct watchdog_device *wdd, unsigned int t) > +{ > + int timeout_idx = find_closest(t, wd_timeout_table, > +ARRAY_SIZE(wd_timeout_table)); > + > + outb((inb(WD_ENABLE_IOADR) & 0xc7) | timeout_idx << 3, WD_ENABLE_IOADR); > + wdd->timeout = wd_timeout_table[timeout_idx]; > + return 0; > +} > + > +static const struct watchdog_info wdt_ident = { > + .options= WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING | > + WDIOF_SETTIMEOUT, > + .identity = KBUILD_MODNAME, > +}; > + > +static const struct watchdog_ops wdt_ops = { > + .owner = THIS_MODULE, > + .start = wd_start, > + .stop = wd_stop, > + .ping