* [PATCH v2 0/8] watchdog: rtc: New driver(s) for ST's LPC IP @ 2014-12-17 16:45 Lee Jones 2014-12-17 16:45 ` [PATCH 1/8] mfd: dt-bindings: Provide human readable defines for LPC mode choosing Lee Jones ` (5 more replies) 0 siblings, 6 replies; 21+ messages in thread From: Lee Jones @ 2014-12-17 16:45 UTC (permalink / raw) To: linux-arm-kernel, linux-kernel Cc: a.zummo, kernel, rtc-linux, devicetree, wim, arnd, lee.jones, linux, linux-watchdog ST's Low Power Controller (LPC) controls two devices; watchdog and RTC. Only one of the devices can be used at any one time, which is enforced by a Device Tree property. This driver set provides everything you need to choose one (and only one) of the LPC devices to run per I/P block, of which there are two on the enabled STiH407 h/w. v1 => v2: Suggestions fixed up: Arnd: No need for a separate MFD driver. If you return -ENODEV really_probe() will continue looking for an suitable alternative. David: Power Management improvements. Guenter: Use Watchdog Framework's maximum timeout checker and only request clock rate once during .probe(), as the clock rate will not change. Lee Jones (8): mfd: dt-bindings: Provide human readable defines for LPC mode choosing ARM: multi_v7_defconfig: Enable support for ST's LPC Watchdog ARM: multi_v7_defconfig: Enable support for ST's LPC RTC ARM: STi: DT: STiH407: Add Device Tree node for the LPC watchdog: bindings: Provide ST bindings for ST's LPC Watchdog device watchdog: st_wdt: Add new driver for ST's LPC Watchdog rtc: bindings: Provide ST bindings for ST's LPC RTC device rtc: st: add new driver for ST's LPC RTC .../devicetree/bindings/rtc/rtc-st-lpc.txt | 25 ++ .../devicetree/bindings/watchdog/st_lpc_wdt.txt | 38 +++ arch/arm/boot/dts/stih407.dtsi | 20 ++ arch/arm/configs/multi_v7_defconfig | 2 + drivers/rtc/Kconfig | 13 + drivers/rtc/Makefile | 1 + drivers/rtc/rtc-st-lpc.c | 354 +++++++++++++++++++++ drivers/watchdog/Kconfig | 13 + drivers/watchdog/Makefile | 1 + drivers/watchdog/st_wdt.c | 329 +++++++++++++++++++ include/dt-bindings/mfd/st-lpc.h | 15 + 11 files changed, 811 insertions(+) create mode 100644 Documentation/devicetree/bindings/rtc/rtc-st-lpc.txt create mode 100644 Documentation/devicetree/bindings/watchdog/st_lpc_wdt.txt create mode 100644 drivers/rtc/rtc-st-lpc.c create mode 100644 drivers/watchdog/st_wdt.c create mode 100644 include/dt-bindings/mfd/st-lpc.h -- 1.9.1 ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 1/8] mfd: dt-bindings: Provide human readable defines for LPC mode choosing 2014-12-17 16:45 [PATCH v2 0/8] watchdog: rtc: New driver(s) for ST's LPC IP Lee Jones @ 2014-12-17 16:45 ` Lee Jones [not found] ` <1418834727-1602-1-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> ` (4 subsequent siblings) 5 siblings, 0 replies; 21+ messages in thread From: Lee Jones @ 2014-12-17 16:45 UTC (permalink / raw) To: linux-arm-kernel, linux-kernel Cc: lee.jones, kernel, a.zummo, rtc-linux, wim, linux-watchdog, devicetree, linux, arnd ST's Low Power Controller can currently operate in two supported modes; Watchdog and Real Time Clock. These defines will aid engineers to easily identify the selected mode. Signed-off-by: Lee Jones <lee.jones@linaro.org> --- include/dt-bindings/mfd/st-lpc.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 include/dt-bindings/mfd/st-lpc.h diff --git a/include/dt-bindings/mfd/st-lpc.h b/include/dt-bindings/mfd/st-lpc.h new file mode 100644 index 0000000..e3e6c75 --- /dev/null +++ b/include/dt-bindings/mfd/st-lpc.h @@ -0,0 +1,15 @@ +/* + * This header provides shared DT/Driver defines for ST's LPC device + * + * Copyright (C) 2014 STMicroelectronics -- All Rights Reserved + * + * Author: Lee Jones <lee.jones@linaro.org> for STMicroelectronics + */ + +#ifndef __DT_BINDINGS_ST_LPC_H__ +#define __DT_BINDINGS_ST_LPC_H__ + +#define ST_LPC_MODE_RTC 0 +#define ST_LPC_MODE_WDT 1 + +#endif /* __DT_BINDINGS_ST_LPC_H__ */ -- 1.9.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
[parent not found: <1418834727-1602-1-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>]
* [PATCH 2/8] ARM: multi_v7_defconfig: Enable support for ST's LPC Watchdog [not found] ` <1418834727-1602-1-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2014-12-17 16:45 ` Lee Jones 2014-12-17 16:45 ` [PATCH 6/8] watchdog: st_wdt: Add new driver " Lee Jones 2014-12-17 16:45 ` [PATCH 8/8] rtc: st: add new driver for ST's LPC RTC Lee Jones 2 siblings, 0 replies; 21+ messages in thread From: Lee Jones @ 2014-12-17 16:45 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-kernel-u79uwXL29TY76Z2rM5mHXA Cc: lee.jones-QSEj5FYQhm4dnm+yROfE0A, kernel-F5mvAk5X5gdBDgjK7y7TUQ, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, wim-IQzOog9fTRqzQB+pC5nmwQ, linux-watchdog-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-0h96xk9xTtrk1uMJSBkQmQ, arnd-r2nGTMty4D4 Signed-off-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> --- arch/arm/configs/multi_v7_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig index 99a8a4a..e34d5c6 100644 --- a/arch/arm/configs/multi_v7_defconfig +++ b/arch/arm/configs/multi_v7_defconfig @@ -238,6 +238,7 @@ CONFIG_ST_THERMAL_SYSCFG=y CONFIG_ST_THERMAL_MEMMAP=y CONFIG_WATCHDOG=y CONFIG_ORION_WATCHDOG=y +CONFIG_ST_WATCHDOG=y CONFIG_SUNXI_WATCHDOG=y CONFIG_MFD_AS3722=y CONFIG_MFD_BCM590XX=y -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 6/8] watchdog: st_wdt: Add new driver for ST's LPC Watchdog [not found] ` <1418834727-1602-1-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2014-12-17 16:45 ` [PATCH 2/8] ARM: multi_v7_defconfig: Enable support for ST's LPC Watchdog Lee Jones @ 2014-12-17 16:45 ` Lee Jones 2014-12-17 18:02 ` Guenter Roeck [not found] ` <1418834727-1602-7-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2014-12-17 16:45 ` [PATCH 8/8] rtc: st: add new driver for ST's LPC RTC Lee Jones 2 siblings, 2 replies; 21+ messages in thread From: Lee Jones @ 2014-12-17 16:45 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-kernel-u79uwXL29TY76Z2rM5mHXA Cc: lee.jones-QSEj5FYQhm4dnm+yROfE0A, kernel-F5mvAk5X5gdBDgjK7y7TUQ, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, wim-IQzOog9fTRqzQB+pC5nmwQ, linux-watchdog-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-0h96xk9xTtrk1uMJSBkQmQ, arnd-r2nGTMty4D4, David Paris Signed-off-by: David Paris <david.paris-qxv4g6HH51o@public.gmane.org> Signed-off-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> --- drivers/watchdog/Kconfig | 13 ++ drivers/watchdog/Makefile | 1 + drivers/watchdog/st_wdt.c | 323 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 337 insertions(+) create mode 100644 drivers/watchdog/st_wdt.c diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index f57312f..5a538af 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -432,6 +432,19 @@ config SIRFSOC_WATCHDOG Support for CSR SiRFprimaII and SiRFatlasVI watchdog. When the watchdog triggers the system will be reset. +config ST_WATCHDOG + tristate "STMicroelectronics LPC Watchdog" + depends on ARCH_STI + depends on OF + select WATCHDOG_CORE + select MFD_ST_LPC + help + Say Y here to include STMicroelectronics Low Power Controller + (LPC) based Watchdog timer support. + + To compile this driver as a module, choose M here: the + module will be called st_wdt. + config TEGRA_WATCHDOG tristate "Tegra watchdog" depends on ARCH_TEGRA || COMPILE_TEST diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile index 468c320..eb19937 100644 --- a/drivers/watchdog/Makefile +++ b/drivers/watchdog/Makefile @@ -57,6 +57,7 @@ obj-$(CONFIG_RETU_WATCHDOG) += retu_wdt.o obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o obj-$(CONFIG_MOXART_WDT) += moxart_wdt.o obj-$(CONFIG_SIRFSOC_WATCHDOG) += sirfsoc_wdt.o +obj-$(CONFIG_ST_WATCHDOG) += st_wdt.o obj-$(CONFIG_BCM_KONA_WDT) += bcm_kona_wdt.o obj-$(CONFIG_TEGRA_WATCHDOG) += tegra_wdt.o diff --git a/drivers/watchdog/st_wdt.c b/drivers/watchdog/st_wdt.c new file mode 100644 index 0000000..cf3a4f7 --- /dev/null +++ b/drivers/watchdog/st_wdt.c @@ -0,0 +1,323 @@ +/* + * st-wdt.c - ST's LPC Watchdog + * + * Copyright (C) 2014 STMicroelectronics -- All Rights Reserved + * + * Author: David Paris <david.paris-qxv4g6HH51o@public.gmane.org> for STMicroelectronics + * Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> for STMicroelectronics + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#include <linux/clk.h> +#include <linux/init.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/mfd/syscon.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_platform.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> +#include <linux/watchdog.h> + +#include <dt-bindings/mfd/st-lpc.h> + +/* Low Power Alarm */ +#define LPC_LPA_LSB_OFF 0x410 +#define LPC_LPA_START_OFF 0x418 + +/* LPC as WDT */ +#define LPC_WDT_OFF 0x510 + +static struct watchdog_device st_wdog_dev; + +struct st_wdog_syscfg { + struct regmap *regmap; + unsigned int reset_type_reg; + unsigned int reset_type_mask; + unsigned int enable_reg; + unsigned int enable_mask; +}; + +struct st_wdog { + void __iomem *base; + struct device *dev; + struct st_wdog_syscfg *syscfg; + struct clk *clk; + unsigned long clkrate; + bool warm_reset; +}; + +static struct st_wdog_syscfg stid127_syscfg = { + .reset_type_reg = 0x004, + .reset_type_mask = BIT(2), + .enable_reg = 0x000, + .enable_mask = BIT(2), +}; + +static struct st_wdog_syscfg stih415_syscfg = { + .reset_type_reg = 0x0B8, + .reset_type_mask = BIT(6), + .enable_reg = 0x0B4, + .enable_mask = BIT(7), +}; + +static struct st_wdog_syscfg stih416_syscfg = { + .reset_type_reg = 0x88C, + .reset_type_mask = BIT(6), + .enable_reg = 0x888, + .enable_mask = BIT(7), +}; + +static struct st_wdog_syscfg stih407_syscfg = { + .enable_reg = 0x204, + .enable_mask = BIT(19), +}; + +static struct of_device_id st_wdog_match[] = { + { + .compatible = "st,stih407-lpc", + .data = (void *)&stih407_syscfg, + }, + { + .compatible = "st,stih416-lpc", + .data = (void *)&stih416_syscfg, + }, + { + .compatible = "st,stih415-lpc", + .data = (void *)&stih415_syscfg, + }, + { + .compatible = "st,stid127-lpc", + .data = (void *)&stid127_syscfg, + }, + {}, +}; +MODULE_DEVICE_TABLE(of, st_wdog_match); + +static void st_wdog_setup(struct st_wdog *st_wdog, bool enable) +{ + /* Type of watchdog reset - 0: Cold 1: Warm */ + if (st_wdog->syscfg->reset_type_reg) + regmap_update_bits(st_wdog->syscfg->regmap, + st_wdog->syscfg->reset_type_reg, + st_wdog->syscfg->reset_type_mask, + st_wdog->warm_reset); + + /* Mask/unmask watchdog reset */ + regmap_update_bits(st_wdog->syscfg->regmap, + st_wdog->syscfg->enable_reg, + st_wdog->syscfg->enable_mask, + enable ? 0 : st_wdog->syscfg->enable_mask); +} + +static void st_wdog_load_timer(struct st_wdog *st_wdog, unsigned int timeout) +{ + unsigned long clkrate = st_wdog->clkrate; + + writel_relaxed(timeout * clkrate, st_wdog->base + LPC_LPA_LSB_OFF); + writel_relaxed(1, st_wdog->base + LPC_LPA_START_OFF); +} + +static int st_wdog_start(struct watchdog_device *wdd) +{ + struct st_wdog *st_wdog = watchdog_get_drvdata(wdd); + + writel_relaxed(1, st_wdog->base + LPC_WDT_OFF); + + return 0; +} + +static int st_wdog_stop(struct watchdog_device *wdd) +{ + struct st_wdog *st_wdog = watchdog_get_drvdata(wdd); + + writel_relaxed(0, st_wdog->base + LPC_WDT_OFF); + + return 0; +} + +static int st_wdog_set_timeout(struct watchdog_device *wdd, + unsigned int timeout) +{ + struct st_wdog *st_wdog = watchdog_get_drvdata(wdd); + + wdd->timeout = timeout; + st_wdog_load_timer(st_wdog, timeout); + + return 0; +} + +static int st_wdog_keepalive(struct watchdog_device *wdd) +{ + struct st_wdog *st_wdog = watchdog_get_drvdata(wdd); + + st_wdog_load_timer(st_wdog, wdd->timeout); + + return 0; +} + +static const struct watchdog_info st_wdog_info = { + .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE, + .identity = "ST LPC WDT", +}; + +static const struct watchdog_ops st_wdog_ops = { + .owner = THIS_MODULE, + .start = st_wdog_start, + .stop = st_wdog_stop, + .ping = st_wdog_keepalive, + .set_timeout = st_wdog_set_timeout, +}; + +static struct watchdog_device st_wdog_dev = { + .info = &st_wdog_info, + .ops = &st_wdog_ops, +}; + +static int st_wdog_probe(struct platform_device *pdev) +{ + const struct of_device_id *match; + struct device_node *np = pdev->dev.of_node; + struct st_wdog *st_wdog; + struct regmap *regmap; + struct resource *res; + struct clk *clk; + void __iomem *base; + uint32_t mode; + int ret; + + ret = of_property_read_u32(np, "st,lpc-mode", &mode); + if (ret) { + dev_err(&pdev->dev, "An LPC mode must be provided\n"); + return -EINVAL; + } + + /* LPC can either run in RTC or WDT mode */ + if (mode != ST_LPC_MODE_WDT) + return -ENODEV; + + st_wdog = devm_kzalloc(&pdev->dev, sizeof(*st_wdog), GFP_KERNEL); + if (!st_wdog) + return -ENOMEM; + + match = of_match_device(st_wdog_match, &pdev->dev); + if (!match) { + dev_err(&pdev->dev, "Couldn't match device\n"); + return -ENODEV; + } + st_wdog->syscfg = (struct st_wdog_syscfg *)match->data; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(base)) { + dev_err(&pdev->dev, "Failed to ioremap base\n"); + return PTR_ERR(base); + } + + regmap = syscon_regmap_lookup_by_phandle(np, "st,syscfg"); + if (IS_ERR(regmap)) { + dev_err(&pdev->dev, "No syscfg phandle specified\n"); + return PTR_ERR(regmap); + } + + clk = clk_get(&pdev->dev, NULL); + if (IS_ERR(clk)) { + dev_err(&pdev->dev, "Unable to request clock\n"); + return PTR_ERR(clk); + } + clk_prepare_enable(st_wdog->clk); + + st_wdog->dev = &pdev->dev; + st_wdog->base = base; + st_wdog->clk = clk; + st_wdog->syscfg->regmap = regmap; + st_wdog->warm_reset = of_property_read_bool(np, "st,warm_reset"); + st_wdog->clkrate = clk_get_rate(st_wdog->clk); + + if (!st_wdog->clkrate) { + dev_err(&pdev->dev, "Unable to fetch clock rate\n"); + return -EINVAL; + } + st_wdog_dev.max_timeout = 0xFFFFFFFF / st_wdog->clkrate; + + watchdog_set_drvdata(&st_wdog_dev, st_wdog); + watchdog_set_nowayout(&st_wdog_dev, WATCHDOG_NOWAYOUT); + + /* Init Watchdog timeout with value in DT */ + ret = watchdog_init_timeout(&st_wdog_dev, 0, &pdev->dev); + if (ret) { + dev_err(&pdev->dev, "Unable to initialise watchdog timeout\n"); + return ret; + } + + ret = watchdog_register_device(&st_wdog_dev); + if (ret) { + dev_err(&pdev->dev, "Unable to register watchdog\n"); + clk_disable_unprepare(clk); + return ret; + } + + st_wdog_setup(st_wdog, true); + + dev_info(&pdev->dev, "LPC Watchdog driver registered, reset type is %s", + st_wdog->warm_reset ? "warm" : "cold"); + + return ret; +} + +static int st_wdog_remove(struct platform_device *pdev) +{ + struct st_wdog *st_wdog = watchdog_get_drvdata(&st_wdog_dev); + + st_wdog_setup(st_wdog, false); + watchdog_unregister_device(&st_wdog_dev); + clk_disable_unprepare(st_wdog->clk); + + return 0; +} + +#ifdef CONFIG_PM +static int st_wdog_suspend(struct device *dev) +{ + if (watchdog_active(&st_wdog_dev)) + st_wdog_stop(&st_wdog_dev); + + return 0; +} + +static int st_wdog_resume(struct device *dev) +{ + struct st_wdog *st_wdog = watchdog_get_drvdata(&st_wdog_dev); + + if (watchdog_active(&st_wdog_dev)) { + st_wdog_load_timer(st_wdog, st_wdog_dev.timeout); + st_wdog_start(&st_wdog_dev); + } + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(st_wdog_pm_ops, + st_wdog_suspend, + st_wdog_resume); + +static struct platform_driver st_wdog_driver = { + .driver = { + .name = "st-lpc-wdt", + .pm = &st_wdog_pm_ops, + .of_match_table = st_wdog_match, + }, + .probe = st_wdog_probe, + .remove = st_wdog_remove, +}; +module_platform_driver(st_wdog_driver); + +MODULE_AUTHOR("David Paris <david.paris-qxv4g6HH51o@public.gmane.org>"); +MODULE_DESCRIPTION("ST LPC Watchdog Driver"); +MODULE_LICENSE("GPL v2"); -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 6/8] watchdog: st_wdt: Add new driver for ST's LPC Watchdog 2014-12-17 16:45 ` [PATCH 6/8] watchdog: st_wdt: Add new driver " Lee Jones @ 2014-12-17 18:02 ` Guenter Roeck [not found] ` <20141217180251.GA29914-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org> [not found] ` <1418834727-1602-7-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 1 sibling, 1 reply; 21+ messages in thread From: Guenter Roeck @ 2014-12-17 18:02 UTC (permalink / raw) To: Lee Jones Cc: linux-arm-kernel, linux-kernel, kernel, a.zummo, rtc-linux, wim, linux-watchdog, devicetree, arnd, David Paris On Wed, Dec 17, 2014 at 04:45:25PM +0000, Lee Jones wrote: > Signed-off-by: David Paris <david.paris@st.com> > Signed-off-by: Lee Jones <lee.jones@linaro.org> Hi Lee and David, I still have a couple of comments below. Sorry I didn't catch those earlier. Thanks, Guenter > --- > drivers/watchdog/Kconfig | 13 ++ > drivers/watchdog/Makefile | 1 + > drivers/watchdog/st_wdt.c | 323 ++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 337 insertions(+) > create mode 100644 drivers/watchdog/st_wdt.c > > diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig > index f57312f..5a538af 100644 > --- a/drivers/watchdog/Kconfig > +++ b/drivers/watchdog/Kconfig > @@ -432,6 +432,19 @@ config SIRFSOC_WATCHDOG > Support for CSR SiRFprimaII and SiRFatlasVI watchdog. When > the watchdog triggers the system will be reset. > > +config ST_WATCHDOG > + tristate "STMicroelectronics LPC Watchdog" > + depends on ARCH_STI > + depends on OF > + select WATCHDOG_CORE > + select MFD_ST_LPC > + help > + Say Y here to include STMicroelectronics Low Power Controller > + (LPC) based Watchdog timer support. > + > + To compile this driver as a module, choose M here: the > + module will be called st_wdt. > + > config TEGRA_WATCHDOG > tristate "Tegra watchdog" > depends on ARCH_TEGRA || COMPILE_TEST > diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile > index 468c320..eb19937 100644 > --- a/drivers/watchdog/Makefile > +++ b/drivers/watchdog/Makefile > @@ -57,6 +57,7 @@ obj-$(CONFIG_RETU_WATCHDOG) += retu_wdt.o > obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o > obj-$(CONFIG_MOXART_WDT) += moxart_wdt.o > obj-$(CONFIG_SIRFSOC_WATCHDOG) += sirfsoc_wdt.o > +obj-$(CONFIG_ST_WATCHDOG) += st_wdt.o > obj-$(CONFIG_BCM_KONA_WDT) += bcm_kona_wdt.o > obj-$(CONFIG_TEGRA_WATCHDOG) += tegra_wdt.o > > diff --git a/drivers/watchdog/st_wdt.c b/drivers/watchdog/st_wdt.c > new file mode 100644 > index 0000000..cf3a4f7 > --- /dev/null > +++ b/drivers/watchdog/st_wdt.c > @@ -0,0 +1,323 @@ > +/* > + * st-wdt.c - ST's LPC Watchdog > + * > + * Copyright (C) 2014 STMicroelectronics -- All Rights Reserved > + * > + * Author: David Paris <david.paris@st.com> for STMicroelectronics > + * Lee Jones <lee.jones@linaro.org> for STMicroelectronics > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public Licence > + * as published by the Free Software Foundation; either version > + * 2 of the Licence, or (at your option) any later version. > + */ > + > +#include <linux/clk.h> > +#include <linux/init.h> > +#include <linux/io.h> > +#include <linux/kernel.h> > +#include <linux/mfd/syscon.h> > +#include <linux/module.h> > +#include <linux/of.h> > +#include <linux/of_platform.h> > +#include <linux/platform_device.h> > +#include <linux/regmap.h> > +#include <linux/watchdog.h> > + > +#include <dt-bindings/mfd/st-lpc.h> > + > +/* Low Power Alarm */ > +#define LPC_LPA_LSB_OFF 0x410 > +#define LPC_LPA_START_OFF 0x418 > + > +/* LPC as WDT */ > +#define LPC_WDT_OFF 0x510 > + > +static struct watchdog_device st_wdog_dev; > + > +struct st_wdog_syscfg { > + struct regmap *regmap; > + unsigned int reset_type_reg; > + unsigned int reset_type_mask; > + unsigned int enable_reg; > + unsigned int enable_mask; > +}; > + > +struct st_wdog { > + void __iomem *base; > + struct device *dev; > + struct st_wdog_syscfg *syscfg; > + struct clk *clk; > + unsigned long clkrate; > + bool warm_reset; > +}; > + > +static struct st_wdog_syscfg stid127_syscfg = { > + .reset_type_reg = 0x004, > + .reset_type_mask = BIT(2), > + .enable_reg = 0x000, > + .enable_mask = BIT(2), > +}; > + > +static struct st_wdog_syscfg stih415_syscfg = { > + .reset_type_reg = 0x0B8, > + .reset_type_mask = BIT(6), > + .enable_reg = 0x0B4, > + .enable_mask = BIT(7), > +}; > + > +static struct st_wdog_syscfg stih416_syscfg = { > + .reset_type_reg = 0x88C, > + .reset_type_mask = BIT(6), > + .enable_reg = 0x888, > + .enable_mask = BIT(7), > +}; > + > +static struct st_wdog_syscfg stih407_syscfg = { > + .enable_reg = 0x204, > + .enable_mask = BIT(19), > +}; > + > +static struct of_device_id st_wdog_match[] = { > + { > + .compatible = "st,stih407-lpc", > + .data = (void *)&stih407_syscfg, Nitpick: typecast to and from void * is not necessary. > + }, > + { > + .compatible = "st,stih416-lpc", > + .data = (void *)&stih416_syscfg, > + }, > + { > + .compatible = "st,stih415-lpc", > + .data = (void *)&stih415_syscfg, > + }, > + { > + .compatible = "st,stid127-lpc", > + .data = (void *)&stid127_syscfg, > + }, > + {}, > +}; > +MODULE_DEVICE_TABLE(of, st_wdog_match); > + > +static void st_wdog_setup(struct st_wdog *st_wdog, bool enable) > +{ > + /* Type of watchdog reset - 0: Cold 1: Warm */ > + if (st_wdog->syscfg->reset_type_reg) > + regmap_update_bits(st_wdog->syscfg->regmap, > + st_wdog->syscfg->reset_type_reg, > + st_wdog->syscfg->reset_type_mask, > + st_wdog->warm_reset); > + > + /* Mask/unmask watchdog reset */ > + regmap_update_bits(st_wdog->syscfg->regmap, > + st_wdog->syscfg->enable_reg, > + st_wdog->syscfg->enable_mask, > + enable ? 0 : st_wdog->syscfg->enable_mask); > +} > + > +static void st_wdog_load_timer(struct st_wdog *st_wdog, unsigned int timeout) > +{ > + unsigned long clkrate = st_wdog->clkrate; > + > + writel_relaxed(timeout * clkrate, st_wdog->base + LPC_LPA_LSB_OFF); > + writel_relaxed(1, st_wdog->base + LPC_LPA_START_OFF); > +} > + > +static int st_wdog_start(struct watchdog_device *wdd) > +{ > + struct st_wdog *st_wdog = watchdog_get_drvdata(wdd); > + > + writel_relaxed(1, st_wdog->base + LPC_WDT_OFF); > + > + return 0; > +} > + > +static int st_wdog_stop(struct watchdog_device *wdd) > +{ > + struct st_wdog *st_wdog = watchdog_get_drvdata(wdd); > + > + writel_relaxed(0, st_wdog->base + LPC_WDT_OFF); > + > + return 0; > +} > + > +static int st_wdog_set_timeout(struct watchdog_device *wdd, > + unsigned int timeout) > +{ > + struct st_wdog *st_wdog = watchdog_get_drvdata(wdd); > + > + wdd->timeout = timeout; > + st_wdog_load_timer(st_wdog, timeout); > + > + return 0; > +} > + > +static int st_wdog_keepalive(struct watchdog_device *wdd) > +{ > + struct st_wdog *st_wdog = watchdog_get_drvdata(wdd); > + > + st_wdog_load_timer(st_wdog, wdd->timeout); > + > + return 0; > +} > + > +static const struct watchdog_info st_wdog_info = { > + .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE, > + .identity = "ST LPC WDT", > +}; > + > +static const struct watchdog_ops st_wdog_ops = { > + .owner = THIS_MODULE, > + .start = st_wdog_start, > + .stop = st_wdog_stop, > + .ping = st_wdog_keepalive, > + .set_timeout = st_wdog_set_timeout, > +}; > + > +static struct watchdog_device st_wdog_dev = { > + .info = &st_wdog_info, > + .ops = &st_wdog_ops, > +}; > + > +static int st_wdog_probe(struct platform_device *pdev) > +{ > + const struct of_device_id *match; > + struct device_node *np = pdev->dev.of_node; > + struct st_wdog *st_wdog; > + struct regmap *regmap; > + struct resource *res; > + struct clk *clk; > + void __iomem *base; > + uint32_t mode; > + int ret; > + > + ret = of_property_read_u32(np, "st,lpc-mode", &mode); > + if (ret) { > + dev_err(&pdev->dev, "An LPC mode must be provided\n"); > + return -EINVAL; > + } > + > + /* LPC can either run in RTC or WDT mode */ > + if (mode != ST_LPC_MODE_WDT) > + return -ENODEV; > + > + st_wdog = devm_kzalloc(&pdev->dev, sizeof(*st_wdog), GFP_KERNEL); > + if (!st_wdog) > + return -ENOMEM; > + > + match = of_match_device(st_wdog_match, &pdev->dev); > + if (!match) { > + dev_err(&pdev->dev, "Couldn't match device\n"); > + return -ENODEV; > + } > + st_wdog->syscfg = (struct st_wdog_syscfg *)match->data; > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + base = devm_ioremap_resource(&pdev->dev, res); > + if (IS_ERR(base)) { > + dev_err(&pdev->dev, "Failed to ioremap base\n"); > + return PTR_ERR(base); > + } > + > + regmap = syscon_regmap_lookup_by_phandle(np, "st,syscfg"); > + if (IS_ERR(regmap)) { > + dev_err(&pdev->dev, "No syscfg phandle specified\n"); > + return PTR_ERR(regmap); > + } > + > + clk = clk_get(&pdev->dev, NULL); > + if (IS_ERR(clk)) { > + dev_err(&pdev->dev, "Unable to request clock\n"); > + return PTR_ERR(clk); > + } > + clk_prepare_enable(st_wdog->clk); How does this work ? st_wdog->clk isn't set yet. > + > + st_wdog->dev = &pdev->dev; > + st_wdog->base = base; > + st_wdog->clk = clk; > + st_wdog->syscfg->regmap = regmap; > + st_wdog->warm_reset = of_property_read_bool(np, "st,warm_reset"); > + st_wdog->clkrate = clk_get_rate(st_wdog->clk); > + > + if (!st_wdog->clkrate) { > + dev_err(&pdev->dev, "Unable to fetch clock rate\n"); I think this is missing clk_disable_unprepare(); clk_put(); Same for the rest of the error path handling below. > + return -EINVAL; > + } > + st_wdog_dev.max_timeout = 0xFFFFFFFF / st_wdog->clkrate; > + > + watchdog_set_drvdata(&st_wdog_dev, st_wdog); > + watchdog_set_nowayout(&st_wdog_dev, WATCHDOG_NOWAYOUT); > + > + /* Init Watchdog timeout with value in DT */ > + ret = watchdog_init_timeout(&st_wdog_dev, 0, &pdev->dev); > + if (ret) { > + dev_err(&pdev->dev, "Unable to initialise watchdog timeout\n"); > + return ret; > + } > + > + ret = watchdog_register_device(&st_wdog_dev); > + if (ret) { > + dev_err(&pdev->dev, "Unable to register watchdog\n"); > + clk_disable_unprepare(clk); > + return ret; > + } > + > + st_wdog_setup(st_wdog, true); > + > + dev_info(&pdev->dev, "LPC Watchdog driver registered, reset type is %s", > + st_wdog->warm_reset ? "warm" : "cold"); > + > + return ret; > +} > + > +static int st_wdog_remove(struct platform_device *pdev) > +{ > + struct st_wdog *st_wdog = watchdog_get_drvdata(&st_wdog_dev); > + > + st_wdog_setup(st_wdog, false); > + watchdog_unregister_device(&st_wdog_dev); > + clk_disable_unprepare(st_wdog->clk); > + clk_put() ? > + return 0; > +} > + > +#ifdef CONFIG_PM I think this needs to be CONFIG_PM_SLEEP. Another option might be to drop the #ifdef entirely and use __maybe_unused instead. > +static int st_wdog_suspend(struct device *dev) > +{ > + if (watchdog_active(&st_wdog_dev)) > + st_wdog_stop(&st_wdog_dev); > + > + return 0; > +} > + > +static int st_wdog_resume(struct device *dev) > +{ > + struct st_wdog *st_wdog = watchdog_get_drvdata(&st_wdog_dev); > + > + if (watchdog_active(&st_wdog_dev)) { > + st_wdog_load_timer(st_wdog, st_wdog_dev.timeout); > + st_wdog_start(&st_wdog_dev); > + } > + > + return 0; > +} > +#endif > + > +static SIMPLE_DEV_PM_OPS(st_wdog_pm_ops, > + st_wdog_suspend, > + st_wdog_resume); > + > +static struct platform_driver st_wdog_driver = { > + .driver = { > + .name = "st-lpc-wdt", > + .pm = &st_wdog_pm_ops, > + .of_match_table = st_wdog_match, > + }, > + .probe = st_wdog_probe, > + .remove = st_wdog_remove, > +}; > +module_platform_driver(st_wdog_driver); > + > +MODULE_AUTHOR("David Paris <david.paris@st.com>"); > +MODULE_DESCRIPTION("ST LPC Watchdog Driver"); > +MODULE_LICENSE("GPL v2"); > -- > 1.9.1 > ^ permalink raw reply [flat|nested] 21+ messages in thread
[parent not found: <20141217180251.GA29914-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>]
* Re: [PATCH 6/8] watchdog: st_wdt: Add new driver for ST's LPC Watchdog [not found] ` <20141217180251.GA29914-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org> @ 2014-12-18 8:26 ` Lee Jones 2014-12-18 16:00 ` Guenter Roeck 0 siblings, 1 reply; 21+ messages in thread From: Lee Jones @ 2014-12-18 8:26 UTC (permalink / raw) To: Guenter Roeck Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-kernel-u79uwXL29TY76Z2rM5mHXA, kernel-F5mvAk5X5gdBDgjK7y7TUQ, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, wim-IQzOog9fTRqzQB+pC5nmwQ, linux-watchdog-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, arnd-r2nGTMty4D4, David Paris On Wed, 17 Dec 2014, Guenter Roeck wrote: > On Wed, Dec 17, 2014 at 04:45:25PM +0000, Lee Jones wrote: > > Signed-off-by: David Paris <david.paris-qxv4g6HH51o@public.gmane.org> > > Signed-off-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > > Hi Lee and David, > > I still have a couple of comments below. Sorry I didn't catch those earlier. > > Thanks, > Guenter > > > --- > > drivers/watchdog/Kconfig | 13 ++ > > drivers/watchdog/Makefile | 1 + > > drivers/watchdog/st_wdt.c | 323 ++++++++++++++++++++++++++++++++++++++++++++++ > > 3 files changed, 337 insertions(+) > > create mode 100644 drivers/watchdog/st_wdt.c Chopping all the crud. [...] > > +static struct of_device_id st_wdog_match[] = { > > + { > > + .compatible = "st,stih407-lpc", > > + .data = (void *)&stih407_syscfg, > > Nitpick: typecast to and from void * is not necessary. Actually that's not true, but it is superfluous in this case. I will fix-up. [...] > > +static int st_wdog_probe(struct platform_device *pdev) > > +{ > > + const struct of_device_id *match; > > + struct device_node *np = pdev->dev.of_node; > > + struct st_wdog *st_wdog; > > + struct regmap *regmap; > > + struct resource *res; > > + struct clk *clk; > > + void __iomem *base; > > + uint32_t mode; > > + int ret; [...] > > + clk = clk_get(&pdev->dev, NULL); > > + if (IS_ERR(clk)) { > > + dev_err(&pdev->dev, "Unable to request clock\n"); > > + return PTR_ERR(clk); > > + } > > + clk_prepare_enable(st_wdog->clk); > > How does this work ? st_wdog->clk isn't set yet. Great spot. That should be 'clk'. It works because the LPC clk is already on. > > + > > + st_wdog->dev = &pdev->dev; > > + st_wdog->base = base; > > + st_wdog->clk = clk; > > + st_wdog->syscfg->regmap = regmap; > > + st_wdog->warm_reset = of_property_read_bool(np, "st,warm_reset"); > > + st_wdog->clkrate = clk_get_rate(st_wdog->clk); > > + > > + if (!st_wdog->clkrate) { > > + dev_err(&pdev->dev, "Unable to fetch clock rate\n"); > > I think this is missing > clk_disable_unprepare(); > clk_put(); > > Same for the rest of the error path handling below. Actually instead of clk_put we should be using s/clk_get/devm_clk_get/. You're right about the error paths. I will enforce a better one. Thanks. [...] > > +#ifdef CONFIG_PM > > I think this needs to be CONFIG_PM_SLEEP. > Another option might be to drop the #ifdef entirely and use > __maybe_unused instead. Hmmm... what version is this? [2 mins pass] Oh rubbish. I've been a silly boy! [spoiler alert: take a look at the end of the RTC driver patch] Will be fixed in v3. [...] -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog -- To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 6/8] watchdog: st_wdt: Add new driver for ST's LPC Watchdog 2014-12-18 8:26 ` Lee Jones @ 2014-12-18 16:00 ` Guenter Roeck [not found] ` <20141218160014.GA16015-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org> 0 siblings, 1 reply; 21+ messages in thread From: Guenter Roeck @ 2014-12-18 16:00 UTC (permalink / raw) To: Lee Jones Cc: linux-arm-kernel, linux-kernel, kernel, a.zummo, rtc-linux, wim, linux-watchdog, devicetree, arnd, David Paris On Thu, Dec 18, 2014 at 08:26:52AM +0000, Lee Jones wrote: > On Wed, 17 Dec 2014, Guenter Roeck wrote: > > On Wed, Dec 17, 2014 at 04:45:25PM +0000, Lee Jones wrote: > > > Signed-off-by: David Paris <david.paris@st.com> > > > Signed-off-by: Lee Jones <lee.jones@linaro.org> > > > > Hi Lee and David, > > > > I still have a couple of comments below. Sorry I didn't catch those earlier. > > > > Thanks, > > Guenter > > > > > --- > > > drivers/watchdog/Kconfig | 13 ++ > > > drivers/watchdog/Makefile | 1 + > > > drivers/watchdog/st_wdt.c | 323 ++++++++++++++++++++++++++++++++++++++++++++++ > > > 3 files changed, 337 insertions(+) > > > create mode 100644 drivers/watchdog/st_wdt.c > > Chopping all the crud. > > [...] > > > > +static struct of_device_id st_wdog_match[] = { > > > + { > > > + .compatible = "st,stih407-lpc", > > > + .data = (void *)&stih407_syscfg, > > > > Nitpick: typecast to and from void * is not necessary. > > Actually that's not true, but it is superfluous in this case. > Point taken. Would you agree to a more detailed "typecasting a pointer to and from void * is not necessary" ? Guenter ^ permalink raw reply [flat|nested] 21+ messages in thread
[parent not found: <20141218160014.GA16015-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>]
* Re: [PATCH 6/8] watchdog: st_wdt: Add new driver for ST's LPC Watchdog [not found] ` <20141218160014.GA16015-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org> @ 2014-12-18 17:20 ` Lee Jones 0 siblings, 0 replies; 21+ messages in thread From: Lee Jones @ 2014-12-18 17:20 UTC (permalink / raw) To: Guenter Roeck Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-kernel-u79uwXL29TY76Z2rM5mHXA, kernel-F5mvAk5X5gdBDgjK7y7TUQ, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, wim-IQzOog9fTRqzQB+pC5nmwQ, linux-watchdog-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, arnd-r2nGTMty4D4, David Paris On Thu, 18 Dec 2014, Guenter Roeck wrote: > On Thu, Dec 18, 2014 at 08:26:52AM +0000, Lee Jones wrote: > > On Wed, 17 Dec 2014, Guenter Roeck wrote: > > > On Wed, Dec 17, 2014 at 04:45:25PM +0000, Lee Jones wrote: > > > > Signed-off-by: David Paris <david.paris-qxv4g6HH51o@public.gmane.org> > > > > Signed-off-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > > > > > > Hi Lee and David, > > > > > > I still have a couple of comments below. Sorry I didn't catch those earlier. > > > > > > Thanks, > > > Guenter > > > > > > > --- > > > > drivers/watchdog/Kconfig | 13 ++ > > > > drivers/watchdog/Makefile | 1 + > > > > drivers/watchdog/st_wdt.c | 323 ++++++++++++++++++++++++++++++++++++++++++++++ > > > > 3 files changed, 337 insertions(+) > > > > create mode 100644 drivers/watchdog/st_wdt.c > > > > Chopping all the crud. > > > > [...] > > > > > > +static struct of_device_id st_wdog_match[] = { > > > > + { > > > > + .compatible = "st,stih407-lpc", > > > > + .data = (void *)&stih407_syscfg, > > > > > > Nitpick: typecast to and from void * is not necessary. > > > > Actually that's not true, but it is superfluous in this case. > > > Point taken. Would you agree to a more detailed "typecasting a pointer > to and from void * is not necessary" ? Sure, why not? ;) -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog -- To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 21+ messages in thread
[parent not found: <1418834727-1602-7-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>]
* Re: [STLinux Kernel] [PATCH 6/8] watchdog: st_wdt: Add new driver for ST's LPC Watchdog [not found] ` <1418834727-1602-7-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2014-12-18 8:43 ` Peter Griffin 2014-12-18 9:08 ` Lee Jones 0 siblings, 1 reply; 21+ messages in thread From: Peter Griffin @ 2014-12-18 8:43 UTC (permalink / raw) To: Lee Jones Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-kernel-u79uwXL29TY76Z2rM5mHXA, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ, kernel-F5mvAk5X5gdBDgjK7y7TUQ, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, devicetree-u79uwXL29TY76Z2rM5mHXA, wim-IQzOog9fTRqzQB+pC5nmwQ, arnd-r2nGTMty4D4, linux-0h96xk9xTtrk1uMJSBkQmQ, linux-watchdog-u79uwXL29TY76Z2rM5mHXA Hi Lee, On Wed, 17 Dec 2014, Lee Jones wrote: > Signed-off-by: David Paris <david.paris-qxv4g6HH51o@public.gmane.org> > Signed-off-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > --- > drivers/watchdog/Kconfig | 13 ++ > drivers/watchdog/Makefile | 1 + > drivers/watchdog/st_wdt.c | 323 ++++++++++++++++++++++++++++++++++++++++++++++ You don't have a patch which adds the new files created in this series into the STI section of the MAINTAINERS file? regards, Peter. -- To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [STLinux Kernel] [PATCH 6/8] watchdog: st_wdt: Add new driver for ST's LPC Watchdog 2014-12-18 8:43 ` [STLinux Kernel] " Peter Griffin @ 2014-12-18 9:08 ` Lee Jones 0 siblings, 0 replies; 21+ messages in thread From: Lee Jones @ 2014-12-18 9:08 UTC (permalink / raw) To: Peter Griffin Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-kernel-u79uwXL29TY76Z2rM5mHXA, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ, kernel-F5mvAk5X5gdBDgjK7y7TUQ, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, devicetree-u79uwXL29TY76Z2rM5mHXA, wim-IQzOog9fTRqzQB+pC5nmwQ, arnd-r2nGTMty4D4, linux-0h96xk9xTtrk1uMJSBkQmQ, linux-watchdog-u79uwXL29TY76Z2rM5mHXA On Thu, 18 Dec 2014, Peter Griffin wrote: > Hi Lee, > > On Wed, 17 Dec 2014, Lee Jones wrote: > > > Signed-off-by: David Paris <david.paris-qxv4g6HH51o@public.gmane.org> > > Signed-off-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > > --- > > drivers/watchdog/Kconfig | 13 ++ > > drivers/watchdog/Makefile | 1 + > > drivers/watchdog/st_wdt.c | 323 ++++++++++++++++++++++++++++++++++++++++++++++ > > You don't have a patch which adds the new files created in this series into > the STI section of the MAINTAINERS file? Very true. I will supply one, thanks. -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 8/8] rtc: st: add new driver for ST's LPC RTC [not found] ` <1418834727-1602-1-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2014-12-17 16:45 ` [PATCH 2/8] ARM: multi_v7_defconfig: Enable support for ST's LPC Watchdog Lee Jones 2014-12-17 16:45 ` [PATCH 6/8] watchdog: st_wdt: Add new driver " Lee Jones @ 2014-12-17 16:45 ` Lee Jones 2 siblings, 0 replies; 21+ messages in thread From: Lee Jones @ 2014-12-17 16:45 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-kernel-u79uwXL29TY76Z2rM5mHXA Cc: lee.jones-QSEj5FYQhm4dnm+yROfE0A, kernel-F5mvAk5X5gdBDgjK7y7TUQ, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, wim-IQzOog9fTRqzQB+pC5nmwQ, linux-watchdog-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-0h96xk9xTtrk1uMJSBkQmQ, arnd-r2nGTMty4D4 ST's Low Power Controller (LPC) controls two devices; watchdog and RTC. Only one of the devices can be used at any one time. This is enforced by the correlating MFD driver. This portion of the driver-set controls the Real Time Clock. Signed-off-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> --- drivers/rtc/Kconfig | 13 ++ drivers/rtc/Makefile | 1 + drivers/rtc/rtc-st-lpc.c | 354 ++++++++++++++++++++++++++++++++++++++++++++++ drivers/watchdog/st_wdt.c | 8 +- 4 files changed, 375 insertions(+), 1 deletion(-) create mode 100644 drivers/rtc/rtc-st-lpc.c diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index a168e96..aa4bd90 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -1355,6 +1355,18 @@ config RTC_DRV_SIRFSOC Say "yes" here to support the real time clock on SiRF SOC chips. This driver can also be built as a module called rtc-sirfsoc. +config RTC_DRV_ST_LPC + tristate "STMicroelectronics LPC RTC" + depends on ARCH_STI + depends on OF + select MFD_ST_LPC + help + Say Y here to include STMicroelectronics Low Power Controller + (LPC) based RTC support. + + To compile this driver as a module, choose M here: the + module will be called rtc-st-lpc. + config RTC_DRV_MOXART tristate "MOXA ART RTC" depends on ARCH_MOXART || COMPILE_TEST @@ -1390,4 +1402,5 @@ config RTC_DRV_HID_SENSOR_TIME rtc-hid-sensor-time. + endif # RTC_CLASS diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 56f061c..ce5860b 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -145,4 +145,5 @@ obj-$(CONFIG_RTC_DRV_WM8350) += rtc-wm8350.o obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o obj-$(CONFIG_RTC_DRV_XGENE) += rtc-xgene.o obj-$(CONFIG_RTC_DRV_SIRFSOC) += rtc-sirfsoc.o +obj-$(CONFIG_RTC_DRV_ST_LPC) += rtc-st-lpc.o obj-$(CONFIG_RTC_DRV_MOXART) += rtc-moxart.o diff --git a/drivers/rtc/rtc-st-lpc.c b/drivers/rtc/rtc-st-lpc.c new file mode 100644 index 0000000..de28aca --- /dev/null +++ b/drivers/rtc/rtc-st-lpc.c @@ -0,0 +1,354 @@ +/* + * rtc-st-lpc.c - ST's LPC RTC, powered by the Low Power Timer + * + * Copyright (C) 2014 STMicroelectronics Limited + * + * Author: David Paris <david.paris-qxv4g6HH51o@public.gmane.org> for STMicroelectronics + * Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> for STMicroelectronics + * + * Based on the original driver written by Stuart Menefy. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#include <linux/clk.h> +#include <linux/delay.h> +#include <linux/init.h> +#include <linux/io.h> +#include <linux/irq.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_irq.h> +#include <linux/platform_device.h> +#include <linux/rtc.h> + +#include <dt-bindings/mfd/st-lpc.h> + +/* Low Power Timer */ +#define LPC_LPT_LSB_OFF 0x400 +#define LPC_LPT_MSB_OFF 0x404 +#define LPC_LPT_START_OFF 0x408 + +/* Low Power Alarm */ +#define LPC_LPA_LSB_OFF 0x410 +#define LPC_LPA_MSB_OFF 0x414 +#define LPC_LPA_START_OFF 0x418 + +/* LPC as WDT */ +#define LPC_WDT_OFF 0x510 +#define LPC_WDT_FLAG_OFF 0x514 + +struct st_rtc { + struct rtc_device *rtc_dev; + struct rtc_wkalrm alarm; + struct resource *res; + struct clk *clk; + unsigned long clkrate; + void __iomem *ioaddr; + bool irq_enabled:1; + spinlock_t lock; + short irq; +}; + +static void st_rtc_set_hw_alarm(struct st_rtc *rtc, + unsigned long msb, unsigned long lsb) +{ + unsigned long flags; + + spin_lock_irqsave(&rtc->lock, flags); + + writel(1, rtc->ioaddr + LPC_WDT_OFF); + + writel(msb, rtc->ioaddr + LPC_LPA_MSB_OFF); + writel(lsb, rtc->ioaddr + LPC_LPA_LSB_OFF); + writel(1, rtc->ioaddr + LPC_LPA_START_OFF); + + writel(0, rtc->ioaddr + LPC_WDT_OFF); + + spin_unlock_irqrestore(&rtc->lock, flags); +} + +static irqreturn_t st_rtc_handler(int this_irq, void *data) +{ + struct st_rtc *rtc = (struct st_rtc *)data; + + rtc_update_irq(rtc->rtc_dev, 1, RTC_AF); + + return IRQ_HANDLED; +} + +static int st_rtc_read_time(struct device *dev, struct rtc_time *tm) +{ + struct st_rtc *rtc = dev_get_drvdata(dev); + unsigned long lpt_lsb, lpt_msb; + unsigned long long lpt; + unsigned long flags; + + spin_lock_irqsave(&rtc->lock, flags); + + do { + lpt_msb = readl(rtc->ioaddr + LPC_LPT_MSB_OFF); + lpt_lsb = readl(rtc->ioaddr + LPC_LPT_LSB_OFF); + } while (readl(rtc->ioaddr + LPC_LPT_MSB_OFF) != lpt_msb); + + spin_unlock_irqrestore(&rtc->lock, flags); + + lpt = ((unsigned long long)lpt_msb << 32) | lpt_lsb; + do_div(lpt, rtc->clkrate); + rtc_time_to_tm(lpt, tm); + + return 0; +} + +static int st_rtc_set_time(struct device *dev, struct rtc_time *tm) +{ + struct st_rtc *rtc = dev_get_drvdata(dev); + unsigned long long lpt; + unsigned long secs, flags; + int ret; + + ret = rtc_tm_to_time(tm, &secs); + if (ret) + return ret; + + lpt = (unsigned long long)secs * rtc->clkrate; + + spin_lock_irqsave(&rtc->lock, flags); + + writel(lpt >> 32, rtc->ioaddr + LPC_LPT_MSB_OFF); + writel(lpt, rtc->ioaddr + LPC_LPT_LSB_OFF); + writel(1, rtc->ioaddr + LPC_LPT_START_OFF); + + spin_unlock_irqrestore(&rtc->lock, flags); + + return 0; +} + +static int st_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *wkalrm) +{ + struct st_rtc *rtc = dev_get_drvdata(dev); + unsigned long flags; + + spin_lock_irqsave(&rtc->lock, flags); + + memcpy(wkalrm, &rtc->alarm, sizeof(struct rtc_wkalrm)); + + spin_unlock_irqrestore(&rtc->lock, flags); + + return 0; +} + +static int st_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) +{ + struct st_rtc *rtc = dev_get_drvdata(dev); + + if (enabled && !rtc->irq_enabled) { + enable_irq(rtc->irq); + rtc->irq_enabled = true; + } else if (!enabled && rtc->irq_enabled) { + disable_irq(rtc->irq); + rtc->irq_enabled = false; + } + + return 0; +} + +static int st_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *t) +{ + struct st_rtc *rtc = dev_get_drvdata(dev); + struct rtc_time now; + unsigned long now_secs; + unsigned long alarm_secs; + unsigned long long lpa; + + st_rtc_read_time(dev, &now); + rtc_tm_to_time(&now, &now_secs); + rtc_tm_to_time(&t->time, &alarm_secs); + + /* Invalid alarm time */ + if (now_secs > alarm_secs) + return -EINVAL; + + memcpy(&rtc->alarm, t, sizeof(struct rtc_wkalrm)); + + /* Now many secs to fire */ + alarm_secs -= now_secs; + lpa = (unsigned long long)alarm_secs * rtc->clkrate; + + st_rtc_set_hw_alarm(rtc, lpa >> 32, lpa); + st_rtc_alarm_irq_enable(dev, t->enabled); + + return 0; +} + +static struct rtc_class_ops st_rtc_ops = { + .read_time = st_rtc_read_time, + .set_time = st_rtc_set_time, + .read_alarm = st_rtc_read_alarm, + .set_alarm = st_rtc_set_alarm, + .alarm_irq_enable = st_rtc_alarm_irq_enable, +}; + +static int st_rtc_probe(struct platform_device *pdev) +{ + struct device_node *np = pdev->dev.of_node; + struct st_rtc *rtc; + struct resource *res; + struct rtc_time tm_check; + uint32_t mode; + int ret = 0; + + ret = of_property_read_u32(np, "st,lpc-mode", &mode); + if (ret) { + dev_err(&pdev->dev, "An LPC mode must be provided\n"); + return -EINVAL; + } + + /* LPC can either run in RTC or WDT mode */ + if (mode != ST_LPC_MODE_RTC) + return -ENODEV; + + rtc = devm_kzalloc(&pdev->dev, sizeof(struct st_rtc), GFP_KERNEL); + if (!rtc) + return -ENOMEM; + + spin_lock_init(&rtc->lock); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + rtc->ioaddr = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(rtc->ioaddr)) + return PTR_ERR(rtc->ioaddr); + + rtc->irq = irq_of_parse_and_map(np, 0); + if (!rtc->irq) { + dev_err(&pdev->dev, "IRQ missing or invalid\n"); + return -EINVAL; + } + + ret = devm_request_irq(&pdev->dev, rtc->irq, st_rtc_handler, 0, + pdev->name, rtc); + if (ret) { + dev_err(&pdev->dev, "Failed to request irq %i\n", rtc->irq); + return ret; + } + + enable_irq_wake(rtc->irq); + disable_irq(rtc->irq); + + rtc->clk = clk_get(&pdev->dev, NULL); + if (IS_ERR(rtc->clk)) { + dev_err(&pdev->dev, "Unable to request clock\n"); + return PTR_ERR(rtc->clk); + } + + clk_prepare_enable(rtc->clk); + + rtc->clkrate = clk_get_rate(rtc->clk); + if (!rtc->clkrate) { + dev_err(&pdev->dev, "Unable to fetch clock rate\n"); + return -EINVAL; + } + + device_set_wakeup_capable(&pdev->dev, 1); + + platform_set_drvdata(pdev, rtc); + + /* + * The RTC-LPC is able to manage date.year > 2038 + * but currently the kernel can not manage this date! + * If the RTC-LPC has a date.year > 2038 then + * it's set to the epoch "Jan 1st 2000" + */ + st_rtc_read_time(&pdev->dev, &tm_check); + + if (tm_check.tm_year >= (2038 - 1900)) { + memset(&tm_check, 0, sizeof(tm_check)); + tm_check.tm_year = 100; + tm_check.tm_mday = 1; + st_rtc_set_time(&pdev->dev, &tm_check); + } + + rtc->rtc_dev = rtc_device_register("st-lpc-rtc", &pdev->dev, + &st_rtc_ops, THIS_MODULE); + if (IS_ERR(rtc->rtc_dev)) { + clk_disable_unprepare(rtc->clk); + return PTR_ERR(rtc->rtc_dev); + } + + return 0; +} + +static int st_rtc_remove(struct platform_device *pdev) +{ + struct st_rtc *rtc = platform_get_drvdata(pdev); + + if (likely(rtc->rtc_dev)) + rtc_device_unregister(rtc->rtc_dev); + + return 0; +} + +#ifdef CONFIG_PM +static int st_rtc_suspend(struct device *dev) +{ + struct st_rtc *rtc = dev_get_drvdata(dev); + + if (device_may_wakeup(dev)) + return 0; + + writel(1, rtc->ioaddr + LPC_WDT_OFF); + writel(0, rtc->ioaddr + LPC_LPA_START_OFF); + writel(0, rtc->ioaddr + LPC_WDT_OFF); + + return 0; +} + +static int st_rtc_resume(struct device *dev) +{ + struct st_rtc *rtc = dev_get_drvdata(dev); + + rtc_alarm_irq_enable(rtc->rtc_dev, 0); + + /* + * clean 'rtc->alarm' to allow a new + * .set_alarm to the upper RTC layer + */ + memset(&rtc->alarm, 0, sizeof(struct rtc_wkalrm)); + + writel(0, rtc->ioaddr + LPC_LPA_MSB_OFF); + writel(0, rtc->ioaddr + LPC_LPA_LSB_OFF); + writel(1, rtc->ioaddr + LPC_WDT_OFF); + writel(1, rtc->ioaddr + LPC_LPA_START_OFF); + writel(0, rtc->ioaddr + LPC_WDT_OFF); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(st_rtc_pm_ops, st_rtc_suspend, st_rtc_resume); + +static struct of_device_id st_rtc_match[] = { + { .compatible = "st,stih407-lpc" }, + {} +}; +MODULE_DEVICE_TABLE(of, st_wdog_match); + +static struct platform_driver st_rtc_platform_driver = { + .driver = { + .name = "st-lpc-rtc", + .pm = &st_rtc_pm_ops, + .of_match_table = st_rtc_match, + }, + .probe = st_rtc_probe, + .remove = st_rtc_remove, +}; + +module_platform_driver(st_rtc_platform_driver); + +MODULE_DESCRIPTION("STMicroelectronics LPC RTC driver"); +MODULE_AUTHOR("David Paris <david.paris-qxv4g6HH51o@public.gmane.org>"); +MODULE_LICENSE("GPLv2"); diff --git a/drivers/watchdog/st_wdt.c b/drivers/watchdog/st_wdt.c index cf3a4f7..166b57c 100644 --- a/drivers/watchdog/st_wdt.c +++ b/drivers/watchdog/st_wdt.c @@ -281,12 +281,16 @@ static int st_wdog_remove(struct platform_device *pdev) return 0; } -#ifdef CONFIG_PM +#ifdef CONFIG_PM_SLEEP static int st_wdog_suspend(struct device *dev) { + struct st_wdog *st_wdog = watchdog_get_drvdata(&st_wdog_dev); + if (watchdog_active(&st_wdog_dev)) st_wdog_stop(&st_wdog_dev); + st_wdog_setup(st_wdog, false); + return 0; } @@ -294,6 +298,8 @@ static int st_wdog_resume(struct device *dev) { struct st_wdog *st_wdog = watchdog_get_drvdata(&st_wdog_dev); + st_wdog_setup(st_wdog, true); + if (watchdog_active(&st_wdog_dev)) { st_wdog_load_timer(st_wdog, st_wdog_dev.timeout); st_wdog_start(&st_wdog_dev); -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 3/8] ARM: multi_v7_defconfig: Enable support for ST's LPC RTC 2014-12-17 16:45 [PATCH v2 0/8] watchdog: rtc: New driver(s) for ST's LPC IP Lee Jones 2014-12-17 16:45 ` [PATCH 1/8] mfd: dt-bindings: Provide human readable defines for LPC mode choosing Lee Jones [not found] ` <1418834727-1602-1-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2014-12-17 16:45 ` Lee Jones 2014-12-17 16:45 ` [PATCH 4/8] ARM: STi: DT: STiH407: Add Device Tree node for the LPC Lee Jones ` (2 subsequent siblings) 5 siblings, 0 replies; 21+ messages in thread From: Lee Jones @ 2014-12-17 16:45 UTC (permalink / raw) To: linux-arm-kernel, linux-kernel Cc: lee.jones, kernel, a.zummo, rtc-linux, wim, linux-watchdog, devicetree, linux, arnd Signed-off-by: Lee Jones <lee.jones@linaro.org> --- arch/arm/configs/multi_v7_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig index e34d5c6..09b8bce 100644 --- a/arch/arm/configs/multi_v7_defconfig +++ b/arch/arm/configs/multi_v7_defconfig @@ -344,6 +344,7 @@ CONFIG_RTC_DRV_AS3722=y CONFIG_RTC_DRV_DS1307=y CONFIG_RTC_DRV_MAX8907=y CONFIG_RTC_DRV_PALMAS=y +CONFIG_RTC_DRV_ST_LPC=y CONFIG_RTC_DRV_TWL4030=y CONFIG_RTC_DRV_TPS6586X=y CONFIG_RTC_DRV_TPS65910=y -- 1.9.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 4/8] ARM: STi: DT: STiH407: Add Device Tree node for the LPC 2014-12-17 16:45 [PATCH v2 0/8] watchdog: rtc: New driver(s) for ST's LPC IP Lee Jones ` (2 preceding siblings ...) 2014-12-17 16:45 ` [PATCH 3/8] ARM: multi_v7_defconfig: Enable support " Lee Jones @ 2014-12-17 16:45 ` Lee Jones 2014-12-17 16:45 ` [PATCH 5/8] watchdog: bindings: Provide ST bindings for ST's LPC Watchdog device Lee Jones 2014-12-17 16:45 ` [PATCH 7/8] rtc: bindings: Provide ST bindings for ST's LPC RTC device Lee Jones 5 siblings, 0 replies; 21+ messages in thread From: Lee Jones @ 2014-12-17 16:45 UTC (permalink / raw) To: linux-arm-kernel, linux-kernel Cc: lee.jones, kernel, a.zummo, rtc-linux, wim, linux-watchdog, devicetree, linux, arnd, David Paris On current ST platforms the LPC controls a number of functions. This patch enables support for the LPC Watchdog and LPC RTC devices on LPC1 and LPC2 respectively. Signed-off-by: David Paris <david.paris@st.com> Signed-off-by: Lee Jones <lee.jones@linaro.org> --- arch/arm/boot/dts/stih407.dtsi | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/arch/arm/boot/dts/stih407.dtsi b/arch/arm/boot/dts/stih407.dtsi index f539627a..97cc125 100644 --- a/arch/arm/boot/dts/stih407.dtsi +++ b/arch/arm/boot/dts/stih407.dtsi @@ -8,6 +8,7 @@ */ #include "stih407-clock.dtsi" #include "stih407-pinctrl.dtsi" +#include <dt-bindings/mfd/st-lpc.h> / { #address-cells = <1>; #size-cells = <1>; @@ -259,5 +260,24 @@ status = "disabled"; }; + + /* Watchdog and Real-Time Clock */ + lpc@8787000 { + compatible = "st,stih407-lpc"; + reg = <0x8787000 0x1000>; + interrupts = <GIC_SPI 129 IRQ_TYPE_EDGE_RISING>; + clocks = <&clk_s_d3_flexgen CLK_LPC_0>; + timeout-sec = <120>; + st,syscfg = <&syscfg_core>; + st,lpc-mode = <ST_LPC_MODE_WDT>; + }; + + lpc@8788000 { + compatible = "st,stih407-lpc"; + reg = <0x8788000 0x1000>; + interrupts = <GIC_SPI 130 IRQ_TYPE_EDGE_RISING>; + clocks = <&clk_s_d3_flexgen CLK_LPC_1>; + st,lpc-mode = <ST_LPC_MODE_RTC>; + }; }; }; -- 1.9.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 5/8] watchdog: bindings: Provide ST bindings for ST's LPC Watchdog device 2014-12-17 16:45 [PATCH v2 0/8] watchdog: rtc: New driver(s) for ST's LPC IP Lee Jones ` (3 preceding siblings ...) 2014-12-17 16:45 ` [PATCH 4/8] ARM: STi: DT: STiH407: Add Device Tree node for the LPC Lee Jones @ 2014-12-17 16:45 ` Lee Jones [not found] ` <1418834727-1602-6-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2014-12-17 16:45 ` [PATCH 7/8] rtc: bindings: Provide ST bindings for ST's LPC RTC device Lee Jones 5 siblings, 1 reply; 21+ messages in thread From: Lee Jones @ 2014-12-17 16:45 UTC (permalink / raw) To: linux-arm-kernel, linux-kernel Cc: lee.jones, kernel, a.zummo, rtc-linux, wim, linux-watchdog, devicetree, linux, arnd On current ST platforms the LPC controls a number of functions including Watchdog and Real Time Clock. This patch provides the bindings used to configure LPC in Watchdog mode. Signed-off-by: Lee Jones <lee.jones@linaro.org> --- .../devicetree/bindings/watchdog/st_lpc_wdt.txt | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Documentation/devicetree/bindings/watchdog/st_lpc_wdt.txt diff --git a/Documentation/devicetree/bindings/watchdog/st_lpc_wdt.txt b/Documentation/devicetree/bindings/watchdog/st_lpc_wdt.txt new file mode 100644 index 0000000..1bdf023 --- /dev/null +++ b/Documentation/devicetree/bindings/watchdog/st_lpc_wdt.txt @@ -0,0 +1,38 @@ +STMicroelectronics Low Power Controller (LPC) - Watchdog +======================================================== + +LPC currently supports Watchdog OR Real Time Clock functionality. + +[See: ../rtc/rtc-st-lpc.txt for RTC options] + +Required properties + +- compatible : Must be one of: "st,stih407-lpc" "st,stih416-lpc" + "st,stih415-lpc" "st,stid127-lpc" +- reg : LPC registers base address + size +- interrupts : LPC interrupt line number and associated flags +- clocks : Clock used by LPC device (See: ../clock/clock-bindings.txt) +- st,lpc-mode : The LPC can run either one of two modes ST_LPC_MODE_RTC [0] or + ST_LPC_MODE_WDT [1]. One (and only one) mode must be + selected. + +Required properties [watchdog mode] + +- st,syscfg : Phandle to syscfg node used to enable watchdog and configure + CPU reset type. +- timeout-sec : Watchdog timeout in seconds + +Optional properties [watchdog mode] + +- st,warm-reset : If present reset type will be 'warm' - if not it will be cold + +Example: + lpc@fde05000 { + compatible = "st,stih416-lpc-watchdog"; + reg = <0xfde05000 0x1000>; + clocks = <&clk_s_d3_flexgen CLK_LPC_0>; + st,syscfg = <&syscfg_core>; + timeout-sec = <120>; + st,lpc-mode = <ST_LPC_MODE_WDT>; + st,warm-reset; + }; -- 1.9.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
[parent not found: <1418834727-1602-6-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>]
* Re: [PATCH 5/8] watchdog: bindings: Provide ST bindings for ST's LPC Watchdog device [not found] ` <1418834727-1602-6-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2014-12-17 21:54 ` Arnd Bergmann 2014-12-18 8:13 ` Lee Jones 0 siblings, 1 reply; 21+ messages in thread From: Arnd Bergmann @ 2014-12-17 21:54 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: Lee Jones, linux-kernel-u79uwXL29TY76Z2rM5mHXA, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ, kernel-F5mvAk5X5gdBDgjK7y7TUQ, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, devicetree-u79uwXL29TY76Z2rM5mHXA, wim-IQzOog9fTRqzQB+pC5nmwQ, linux-0h96xk9xTtrk1uMJSBkQmQ, linux-watchdog-u79uwXL29TY76Z2rM5mHXA On Wednesday 17 December 2014 16:45:24 Lee Jones wrote: > +- compatible : Must be one of: "st,stih407-lpc" "st,stih416-lpc" > + "st,stih415-lpc" "st,stid127-lpc" > +- reg : LPC registers base address + size > +- interrupts : LPC interrupt line number and associated flags > +- clocks : Clock used by LPC device (See: ../clock/clock-bindings.txt) > +- st,lpc-mode : The LPC can run either one of two modes ST_LPC_MODE_RTC [0] or > + ST_LPC_MODE_WDT [1]. One (and only one) mode must be > + selected. > I'm glad you got it to work with two drivers for the same device. With this binding, I'm still a bit unhappy about the st,lpc-mode property, in particular since you rely on a shared include file for something that can only be set in one way or another and always has to be present. Why not just use a boolean property that enforces one mode when present and another mode when absent? Arnd -- To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 5/8] watchdog: bindings: Provide ST bindings for ST's LPC Watchdog device 2014-12-17 21:54 ` Arnd Bergmann @ 2014-12-18 8:13 ` Lee Jones 2014-12-18 8:46 ` Arnd Bergmann 0 siblings, 1 reply; 21+ messages in thread From: Lee Jones @ 2014-12-18 8:13 UTC (permalink / raw) To: Arnd Bergmann Cc: linux-arm-kernel, linux-kernel, a.zummo, kernel, rtc-linux, devicetree, wim, linux, linux-watchdog On Wed, 17 Dec 2014, Arnd Bergmann wrote: > On Wednesday 17 December 2014 16:45:24 Lee Jones wrote: > > +- compatible : Must be one of: "st,stih407-lpc" "st,stih416-lpc" > > + "st,stih415-lpc" "st,stid127-lpc" > > +- reg : LPC registers base address + size > > +- interrupts : LPC interrupt line number and associated flags > > +- clocks : Clock used by LPC device (See: ../clock/clock-bindings.txt) > > +- st,lpc-mode : The LPC can run either one of two modes ST_LPC_MODE_RTC [0] or > > + ST_LPC_MODE_WDT [1]. One (and only one) mode must be > > + selected. > > > > I'm glad you got it to work with two drivers for the same device. > > With this binding, I'm still a bit unhappy about the st,lpc-mode property, > in particular since you rely on a shared include file for something that > can only be set in one way or another and always has to be present. > > Why not just use a boolean property that enforces one mode when present > and another mode when absent? There is nothing stopping me from doing that, and it was a consideration. I concluded that this method would be more explicit however. Both when describing our choices in DT and at a functional level within each of the drivers. Let me know if you fundamentally disagree and I can fix-up. -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 5/8] watchdog: bindings: Provide ST bindings for ST's LPC Watchdog device 2014-12-18 8:13 ` Lee Jones @ 2014-12-18 8:46 ` Arnd Bergmann 2014-12-18 9:04 ` Lee Jones 0 siblings, 1 reply; 21+ messages in thread From: Arnd Bergmann @ 2014-12-18 8:46 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: Lee Jones, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ, kernel-F5mvAk5X5gdBDgjK7y7TUQ, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, wim-IQzOog9fTRqzQB+pC5nmwQ, linux-0h96xk9xTtrk1uMJSBkQmQ, linux-watchdog-u79uwXL29TY76Z2rM5mHXA On Thursday 18 December 2014 08:13:34 Lee Jones wrote: > On Wed, 17 Dec 2014, Arnd Bergmann wrote: > > > On Wednesday 17 December 2014 16:45:24 Lee Jones wrote: > > > +- compatible : Must be one of: "st,stih407-lpc" "st,stih416-lpc" > > > + "st,stih415-lpc" "st,stid127-lpc" > > > +- reg : LPC registers base address + size > > > +- interrupts : LPC interrupt line number and associated flags > > > +- clocks : Clock used by LPC device (See: ../clock/clock-bindings.txt) > > > +- st,lpc-mode : The LPC can run either one of two modes ST_LPC_MODE_RTC [0] or > > > + ST_LPC_MODE_WDT [1]. One (and only one) mode must be > > > + selected. > > > > > > > I'm glad you got it to work with two drivers for the same device. > > > > With this binding, I'm still a bit unhappy about the st,lpc-mode property, > > in particular since you rely on a shared include file for something that > > can only be set in one way or another and always has to be present. > > > > Why not just use a boolean property that enforces one mode when present > > and another mode when absent? > > There is nothing stopping me from doing that, and it was a > consideration. I concluded that this method would be more explicit > however. Both when describing our choices in DT and at a functional > level within each of the drivers. > > Let me know if you fundamentally disagree and I can fix-up. I generally don't like header files that define interfaces between C code and DT nodes. There are cases where it's the least ugly solution, but I don't think this is one of them. If you want to be more explicit about the modes, how about having one boolean property per mode? That would also allow devices that could be driven in either mode, e.g. if you have only one instance of this device. Arnd -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 5/8] watchdog: bindings: Provide ST bindings for ST's LPC Watchdog device 2014-12-18 8:46 ` Arnd Bergmann @ 2014-12-18 9:04 ` Lee Jones 2014-12-18 9:15 ` Arnd Bergmann 0 siblings, 1 reply; 21+ messages in thread From: Lee Jones @ 2014-12-18 9:04 UTC (permalink / raw) To: Arnd Bergmann Cc: linux-arm-kernel, a.zummo, kernel, rtc-linux, devicetree, linux-kernel, wim, linux, linux-watchdog We On Thu, 18 Dec 2014, Arnd Bergmann wrote: > On Thursday 18 December 2014 08:13:34 Lee Jones wrote: > > On Wed, 17 Dec 2014, Arnd Bergmann wrote: > > > > > On Wednesday 17 December 2014 16:45:24 Lee Jones wrote: > > > > +- compatible : Must be one of: "st,stih407-lpc" "st,stih416-lpc" > > > > + "st,stih415-lpc" "st,stid127-lpc" > > > > +- reg : LPC registers base address + size > > > > +- interrupts : LPC interrupt line number and associated flags > > > > +- clocks : Clock used by LPC device (See: ../clock/clock-bindings.txt) > > > > +- st,lpc-mode : The LPC can run either one of two modes ST_LPC_MODE_RTC [0] or > > > > + ST_LPC_MODE_WDT [1]. One (and only one) mode must be > > > > + selected. > > > > > > > > > > I'm glad you got it to work with two drivers for the same device. > > > > > > With this binding, I'm still a bit unhappy about the st,lpc-mode property, > > > in particular since you rely on a shared include file for something that > > > can only be set in one way or another and always has to be present. > > > > > > Why not just use a boolean property that enforces one mode when present > > > and another mode when absent? > > > > There is nothing stopping me from doing that, and it was a > > consideration. I concluded that this method would be more explicit > > however. Both when describing our choices in DT and at a functional > > level within each of the drivers. > > > > Let me know if you fundamentally disagree and I can fix-up. > > I generally don't like header files that define interfaces between C code > and DT nodes. There are cases where it's the least ugly solution, but I don't > think this is one of them. > > If you want to be more explicit about the modes, how about having one > boolean property per mode? That would also allow devices that could be > driven in either mode, e.g. if you have only one instance of this device. Isn't this was you suggested above? Making a decision on the absence is a property is what I'm calling not-explicit. If it's accidentally left off the driver(s) won't issue a warning, it'll just assume that the lack of this boolean property was intentional and go follow the Watchdog path for instance. But as I briefly mentioned to you elsewhere, there are actually 3 devices (Watchdog, RTC and Global Timer). How would you like to handle that with a Boolean property when we introduce this new driver? -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 5/8] watchdog: bindings: Provide ST bindings for ST's LPC Watchdog device 2014-12-18 9:04 ` Lee Jones @ 2014-12-18 9:15 ` Arnd Bergmann 2014-12-18 9:28 ` Lee Jones 0 siblings, 1 reply; 21+ messages in thread From: Arnd Bergmann @ 2014-12-18 9:15 UTC (permalink / raw) To: Lee Jones Cc: linux-arm-kernel, a.zummo, kernel, rtc-linux, devicetree, linux-kernel, wim, linux, linux-watchdog On Thursday 18 December 2014 09:04:04 Lee Jones wrote: > We > On Thu, 18 Dec 2014, Arnd Bergmann wrote: > > > On Thursday 18 December 2014 08:13:34 Lee Jones wrote: > > > On Wed, 17 Dec 2014, Arnd Bergmann wrote: > > > > > > > On Wednesday 17 December 2014 16:45:24 Lee Jones wrote: > > > > > +- compatible : Must be one of: "st,stih407-lpc" "st,stih416-lpc" > > > > > + "st,stih415-lpc" "st,stid127-lpc" > > > > > +- reg : LPC registers base address + size > > > > > +- interrupts : LPC interrupt line number and associated flags > > > > > +- clocks : Clock used by LPC device (See: ../clock/clock-bindings.txt) > > > > > +- st,lpc-mode : The LPC can run either one of two modes ST_LPC_MODE_RTC [0] or > > > > > + ST_LPC_MODE_WDT [1]. One (and only one) mode must be > > > > > + selected. > > > > > > > > > > > > > I'm glad you got it to work with two drivers for the same device. > > > > > > > > With this binding, I'm still a bit unhappy about the st,lpc-mode property, > > > > in particular since you rely on a shared include file for something that > > > > can only be set in one way or another and always has to be present. > > > > > > > > Why not just use a boolean property that enforces one mode when present > > > > and another mode when absent? > > > > > > There is nothing stopping me from doing that, and it was a > > > consideration. I concluded that this method would be more explicit > > > however. Both when describing our choices in DT and at a functional > > > level within each of the drivers. > > > > > > Let me know if you fundamentally disagree and I can fix-up. > > > > I generally don't like header files that define interfaces between C code > > and DT nodes. There are cases where it's the least ugly solution, but I don't > > think this is one of them. > > > > If you want to be more explicit about the modes, how about having one > > boolean property per mode? That would also allow devices that could be > > driven in either mode, e.g. if you have only one instance of this device. > > Isn't this was you suggested above? My first suggestion was to just have one boolean property, and use one driver if that is absent. The second one was to have two (or three) separate boolean properties that each refer to whether a particular driver is allowed to use this device or not. > But as I briefly mentioned to you elsewhere, there are actually 3 > devices (Watchdog, RTC and Global Timer). How would you like to > handle that with a Boolean property when we introduce this new driver? Right, this would require having more than one property, but I still think it's better than the header file. Arnd ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 5/8] watchdog: bindings: Provide ST bindings for ST's LPC Watchdog device 2014-12-18 9:15 ` Arnd Bergmann @ 2014-12-18 9:28 ` Lee Jones 0 siblings, 0 replies; 21+ messages in thread From: Lee Jones @ 2014-12-18 9:28 UTC (permalink / raw) To: Arnd Bergmann Cc: linux-arm-kernel, a.zummo, kernel, rtc-linux, devicetree, linux-kernel, wim, linux, linux-watchdog On Thu, 18 Dec 2014, Arnd Bergmann wrote: > On Thursday 18 December 2014 09:04:04 Lee Jones wrote: > > We > > On Thu, 18 Dec 2014, Arnd Bergmann wrote: > > > > > On Thursday 18 December 2014 08:13:34 Lee Jones wrote: > > > > On Wed, 17 Dec 2014, Arnd Bergmann wrote: > > > > > > > > > On Wednesday 17 December 2014 16:45:24 Lee Jones wrote: > > > > > > +- compatible : Must be one of: "st,stih407-lpc" "st,stih416-lpc" > > > > > > + "st,stih415-lpc" "st,stid127-lpc" > > > > > > +- reg : LPC registers base address + size > > > > > > +- interrupts : LPC interrupt line number and associated flags > > > > > > +- clocks : Clock used by LPC device (See: ../clock/clock-bindings.txt) > > > > > > +- st,lpc-mode : The LPC can run either one of two modes ST_LPC_MODE_RTC [0] or > > > > > > + ST_LPC_MODE_WDT [1]. One (and only one) mode must be > > > > > > + selected. > > > > > > > > > > > > > > > > I'm glad you got it to work with two drivers for the same device. > > > > > > > > > > With this binding, I'm still a bit unhappy about the st,lpc-mode property, > > > > > in particular since you rely on a shared include file for something that > > > > > can only be set in one way or another and always has to be present. > > > > > > > > > > Why not just use a boolean property that enforces one mode when present > > > > > and another mode when absent? > > > > > > > > There is nothing stopping me from doing that, and it was a > > > > consideration. I concluded that this method would be more explicit > > > > however. Both when describing our choices in DT and at a functional > > > > level within each of the drivers. > > > > > > > > Let me know if you fundamentally disagree and I can fix-up. > > > > > > I generally don't like header files that define interfaces between C code > > > and DT nodes. There are cases where it's the least ugly solution, but I don't > > > think this is one of them. > > > > > > If you want to be more explicit about the modes, how about having one > > > boolean property per mode? That would also allow devices that could be > > > driven in either mode, e.g. if you have only one instance of this device. > > > > Isn't this was you suggested above? > > My first suggestion was to just have one boolean property, and use one > driver if that is absent. The second one was to have two (or three) separate > boolean properties that each refer to whether a particular driver is allowed > to use this device or not. > > > But as I briefly mentioned to you elsewhere, there are actually 3 > > devices (Watchdog, RTC and Global Timer). How would you like to > > handle that with a Boolean property when we introduce this new driver? > > Right, this would require having more than one property, but I still think > it's better than the header file. I'll put my point across just once and then become subservient once more. I don't agree that defining 3 properties is better than creating just 1. We have lots of properties containing indexes and flags. Just because we've decided to #define them in order to read them easily shouldn't detract from the fact that it's a better setup. st,lpc-mode <1|2|3>; Must be better than: st,lpc-globaltimer-mode; st,lpc-watchdog-mode; st,lpc-rtc-mode; If each of the drivers only checks for it's own property and fails to probe if it's not present how will we detect and warn about a lack of any of the 3 properties without a central, all-knowing (MFD) driver? This is likely to cause someone [why isn't my driver probing] issues and subsequently waste valuable engineering time in the future. -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 7/8] rtc: bindings: Provide ST bindings for ST's LPC RTC device 2014-12-17 16:45 [PATCH v2 0/8] watchdog: rtc: New driver(s) for ST's LPC IP Lee Jones ` (4 preceding siblings ...) 2014-12-17 16:45 ` [PATCH 5/8] watchdog: bindings: Provide ST bindings for ST's LPC Watchdog device Lee Jones @ 2014-12-17 16:45 ` Lee Jones 5 siblings, 0 replies; 21+ messages in thread From: Lee Jones @ 2014-12-17 16:45 UTC (permalink / raw) To: linux-arm-kernel, linux-kernel Cc: lee.jones, kernel, a.zummo, rtc-linux, wim, linux-watchdog, devicetree, linux, arnd On current ST platforms the LPC controls a number of functions including Watchdog and Real Time Clock. This patch provides the bindings used to configure LPC in RTC mode. Signed-off-by: Lee Jones <lee.jones@linaro.org> --- .../devicetree/bindings/rtc/rtc-st-lpc.txt | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Documentation/devicetree/bindings/rtc/rtc-st-lpc.txt diff --git a/Documentation/devicetree/bindings/rtc/rtc-st-lpc.txt b/Documentation/devicetree/bindings/rtc/rtc-st-lpc.txt new file mode 100644 index 0000000..aaf9855 --- /dev/null +++ b/Documentation/devicetree/bindings/rtc/rtc-st-lpc.txt @@ -0,0 +1,25 @@ +STMicroelectronics Low Power Controller (LPC) - RTC +=================================================== + +LPC currently supports Watchdog OR Real Time Clock functionality. + +[See: ../watchdog/st_lpc_wdt.txt for Watchdog options] + +Required properties + +- compatible : Must be one of: "st,stih407-lpc" "st,stih416-lpc" + "st,stih415-lpc" "st,stid127-lpc" +- reg : LPC registers base address + size +- interrupts : LPC interrupt line number and associated flags +- clocks : Clock used by LPC device (See: ../clock/clock-bindings.txt) +- st,lpc-mode : The LPC can run either one of two modes ST_LPC_MODE_RTC [0] or + ST_LPC_MODE_WDT [1]. One (and only one) mode must be + selected. + +Example: + lpc@fde05000 { + compatible = "st,stih416-lpc-watchdog"; + reg = <0xfde05000 0x1000>; + clocks = <&clk_s_d3_flexgen CLK_LPC_0>; + st,lpc-mode = <ST_LPC_MODE_RTC>; + }; -- 1.9.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
end of thread, other threads:[~2014-12-18 17:20 UTC | newest] Thread overview: 21+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-12-17 16:45 [PATCH v2 0/8] watchdog: rtc: New driver(s) for ST's LPC IP Lee Jones 2014-12-17 16:45 ` [PATCH 1/8] mfd: dt-bindings: Provide human readable defines for LPC mode choosing Lee Jones [not found] ` <1418834727-1602-1-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2014-12-17 16:45 ` [PATCH 2/8] ARM: multi_v7_defconfig: Enable support for ST's LPC Watchdog Lee Jones 2014-12-17 16:45 ` [PATCH 6/8] watchdog: st_wdt: Add new driver " Lee Jones 2014-12-17 18:02 ` Guenter Roeck [not found] ` <20141217180251.GA29914-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org> 2014-12-18 8:26 ` Lee Jones 2014-12-18 16:00 ` Guenter Roeck [not found] ` <20141218160014.GA16015-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org> 2014-12-18 17:20 ` Lee Jones [not found] ` <1418834727-1602-7-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2014-12-18 8:43 ` [STLinux Kernel] " Peter Griffin 2014-12-18 9:08 ` Lee Jones 2014-12-17 16:45 ` [PATCH 8/8] rtc: st: add new driver for ST's LPC RTC Lee Jones 2014-12-17 16:45 ` [PATCH 3/8] ARM: multi_v7_defconfig: Enable support " Lee Jones 2014-12-17 16:45 ` [PATCH 4/8] ARM: STi: DT: STiH407: Add Device Tree node for the LPC Lee Jones 2014-12-17 16:45 ` [PATCH 5/8] watchdog: bindings: Provide ST bindings for ST's LPC Watchdog device Lee Jones [not found] ` <1418834727-1602-6-git-send-email-lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2014-12-17 21:54 ` Arnd Bergmann 2014-12-18 8:13 ` Lee Jones 2014-12-18 8:46 ` Arnd Bergmann 2014-12-18 9:04 ` Lee Jones 2014-12-18 9:15 ` Arnd Bergmann 2014-12-18 9:28 ` Lee Jones 2014-12-17 16:45 ` [PATCH 7/8] rtc: bindings: Provide ST bindings for ST's LPC RTC device Lee Jones
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).