[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <eaaf63ce-148e-60dd-6213-c4dc0e6422b4@roeck-us.net>
Date: Sat, 24 Dec 2016 07:59:22 -0800
From: Guenter Roeck <linux@...ck-us.net>
To: Wim Van Sebroeck <wim@...ana.be>,
Linus Torvalds <torvalds@...ux-foundation.org>
Cc: Andrew Morton <akpm@...ux-foundation.org>,
LKML <linux-kernel@...r.kernel.org>,
Linux Watchdog Mailing List <linux-watchdog@...r.kernel.org>
Subject: Re: [GIT PULL REQUEST] watchdog - v4.10 merge window
On 12/24/2016 06:39 AM, Wim Van Sebroeck wrote:
> Hi Linus,
>
> Due to time constraints and personal issues Guenter and I decided that this window will be a pull from another location.
> We got it wrong the first time, so here is our second request (together with our humble apologies).
> (I also hope that Guenters tree is signed, it normally is, but if it isn't then you have another thing to blame us...).
>
> So could you please pull from the 'watchdog-for-linus-v4.10' branch of
> git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
That is a tag, not a branch, and, yes, it is signed :-)
Guenter
>
> It contains the following patches:
> * Add Loongson1 SoC watchdog driver
> * Add da9061 watchdog device
> * Add IT8620E watchdog device
> * module load /unload fixes for bcm7083_wdt, max77620_wdt and jz4740
> * intel-mid_wdt fixes
> * and other fixes and cleanups
>
> This will update the following files:
>
> MAINTAINERS | 2
> drivers/watchdog/Kconfig | 49 ++++++----
> drivers/watchdog/Makefile | 1
> drivers/watchdog/bcm2835_wdt.c | 20 ++++
> drivers/watchdog/bcm7038_wdt.c | 1
> drivers/watchdog/cpwd.c | 23 +----
> drivers/watchdog/da9062_wdt.c | 12 ++
> drivers/watchdog/davinci_wdt.c | 6 +
> drivers/watchdog/intel-mid_wdt.c | 22 ++--
> drivers/watchdog/it87_wdt.c | 4
> drivers/watchdog/jz4740_wdt.c | 2
> drivers/watchdog/loongson1_wdt.c | 170 +++++++++++++++++++++++++++++++++++++
> drivers/watchdog/max77620_wdt.c | 1
> drivers/watchdog/mei_wdt.c | 2
> drivers/watchdog/meson_gxbb_wdt.c | 1
> drivers/watchdog/mpc8xxx_wdt.c | 1
> drivers/watchdog/octeon-wdt-main.c | 1
> drivers/watchdog/qcom-wdt.c | 2
> 18 files changed, 262 insertions(+), 58 deletions(-)
>
> with these Changes:
>
> commit 067161281f428aa7c6e153e06aab7b5fe1ed1e98
> Author: Maciej S. Szmigiero <mail@...iej.szmigiero.name>
> Date: Thu Dec 15 23:52:36 2016 +0100
>
> watchdog: it87_wdt: add IT8620E ID
>
> This adds IT8620E chip ID to it87_wdt driver.
> Such chip is often found on current Gigabyte motherboards, it is allegedly
> custom made for this manufacturer.
>
> Upon testing it looks like it has a 16-bit timer and cannot be reset via
> game port (only via CIR), so it is similar to IT87{18,20,21,28,83} chips.
>
> Tested on GA-F2A88XM-HD3P board.
>
> Signed-off-by: Maciej S. Szmigiero <mail@...iej.szmigiero.name>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit f01d74cc5a2aefa0ba16e2821086a1f2d0a2c899
> Author: Corentin Labbe <clabbe.montjoie@...il.com>
> Date: Thu Dec 15 19:03:44 2016 +0100
>
> watchdog: mpc8xxx: Remove unneeded linux/miscdevice.h include
>
> watchdog/mpc8xxx_wdt.c does not use any miscdevice so this patch remove
> this unnecessary inclusion.
>
> Signed-off-by: Corentin Labbe <clabbe.montjoie@...il.com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit 724284a323c4cdea6c1bb1448247ffc858f2bd1d
> Author: Corentin Labbe <clabbe.montjoie@...il.com>
> Date: Thu Dec 15 18:49:29 2016 +0100
>
> watchdog: octeon: Remove unneeded linux/miscdevice.h include
>
> watchdog/octeon-wdt-main.c does not use any miscdevice so this patch
> remove this unnecessary inclusion.
>
> Signed-off-by: Corentin Labbe <clabbe.montjoie@...il.com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit 054ae19422859c394d5f26a8756ed57d332f6284
> Author: Rasmus Villemoes <rasmus.villemoes@...vas.dk>
> Date: Mon Dec 12 10:48:43 2016 +0100
>
> watchdog: bcm2835_wdt: set WDOG_HW_RUNNING bit when appropriate
>
> A bootloader may start the watchdog device before handing control to
> the kernel - in that case, we should tell the kernel about it so the
> watchdog framework can keep it alive until userspace opens
> /dev/watchdog0.
>
> Signed-off-by: Rasmus Villemoes <rasmus.villemoes@...vas.dk>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Acked-by: Eric Anholt <eric@...olt.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit 1d8565ee4f5bd9fccb738e53d6b9fc7a559f7d2b
> Author: Yang Ling <gnaygnil@...il.com>
> Date: Thu Dec 8 00:10:58 2016 +0800
>
> watchdog: loongson1: Add Loongson1 SoC watchdog driver
>
> Add watchdog timer specific driver for Loongson1 SoC.
>
> Signed-off-by: Yang Ling <gnaygnil@...il.com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit b6621df5c87603310c3f94903bb30adbfeb9aa69
> Author: Amit Kushwaha <akkushwaha9896@...il.com>
> Date: Tue Dec 6 10:19:48 2016 -0800
>
> watchdog: cpwd: remove memory allocate failure message
>
> Replaced goto with a return statement and dropped the kfree()
> calls because memory allocated with devm_kzalloc() is
> automatically freed on driver detach
>
> Signed-off-by: Amit Kushwaha <akkushwaha9896@...il.com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit 72106c1894aa4e26ab403282cc7617fcb07d3d4d
> Author: Steve Twiss <stwiss.opensource@...semi.com>
> Date: Mon Nov 14 08:22:45 2016 +0000
>
> watchdog: da9062/61: watchdog driver
>
> The of_device_id match array is added to support "dlg,da9062-watchdog"
> as a valid .compatible string. A MODULE_DEVICE_TABLE() macro is added.
>
> This patch assumes the use of a DA9062 fallback compatible string for the
> DTS to pick up the DA9062 device driver for use with the DA9061 watchdog
> hardware
>
> Copyright header is updated to add DA9061 in its description and the module
> description macro is extended to include DA9061.
>
> Kconfig is updated to reflect support for DA9061/62.
>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Steve Twiss <stwiss.opensource@...semi.com>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit bb79036215e2ca9d7ef5bd1461981396989c40da
> Author: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
> Date: Fri Nov 18 17:24:41 2016 +0200
>
> intel-mid_wdt: Error code is just an integer
>
> Error code when printed is more readable if it's represented as plain decimal
> integer. Otherwise user will see something like
> intel_mid_wdt: Error stopping watchdog: 0xffffffed
> which is not quite understandable ("Should I interpret it as a bitfield?").
>
> Make it clear to use plaint integer specifier.
>
> While here, move struct device *dev local variable definition to the top of
> functions.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit 31ecad65b011d64dfc80cab7c968078171aa2642
> Author: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
> Date: Fri Nov 18 16:50:02 2016 +0200
>
> intel-mid_wdt: make sure watchdog is not running at startup
>
> Make sure that the watchdog is not running after loading
> and before it is started by opening /dev/watchdog.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit 9eff1140a82db8c5520f76e51c21827b4af670b3
> Author: Alexander Usyskin <alexander.usyskin@...el.com>
> Date: Tue Nov 8 17:55:52 2016 +0200
>
> watchdog: mei_wdt: request stop on reboot to prevent false positive event
>
> Systemd on reboot enables shutdown watchdog that leaves the watchdog
> device open to ensure that even if power down process get stuck the
> platform reboots nonetheless.
> The iamt_wdt is an alarm-only watchdog and can't reboot system, but the
> FW will generate an alarm event reboot was completed in time, as the
> watchdog is not automatically disabled during power cycle.
> So we should request stop watchdog on reboot to eliminate wrong alarm
> from the FW.
>
> Cc: <stable@...r.kernel.org>
> Signed-off-by: Alexander Usyskin <alexander.usyskin@...el.com>
> Signed-off-by: Tomas Winkler <tomas.winkler@...el.com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit 4cfccbdaa234b6564326ed3bf18c38f73693fe14
> Author: Jimmy Vance <jimmy.vance@....com>
> Date: Thu Nov 10 15:25:27 2016 -0500
>
> watchdog: hpwdt: changed maintainer information
>
> Signed-off-by: Jimmy Vance <jimmy.vance@....com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit 35ffa961df7ed13b3701bdb546f08849921e50dc
> Author: Stephen Boyd <sboyd@...eaurora.org>
> Date: Thu Nov 10 16:02:20 2016 -0800
>
> watchdog: jz4740: Fix modular build
>
> Compiling this driver as a module causes a build error because a
> semicolon is missing after MODULE_DEVICE_TABLE. Add it.
>
> CC [M] drivers/watchdog/jz4740_wdt.o
> drivers/watchdog/jz4740_wdt.c:154:1: error: expected ‘,’ or ‘;’ before ‘static’
> drivers/watchdog/jz4740_wdt.c:218:11: error: ‘jz4740_wdt_probe’ undeclared here (not in a function)
>
> Cc: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@...tec.com>
> Cc: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Stephen Boyd <sboyd@...eaurora.org>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit f06f35c66fdbd5ac38901a3305ce763a0cd59375
> Author: Christian Lamparter <chunkeey@...glemail.com>
> Date: Mon Nov 14 02:11:16 2016 +0100
>
> watchdog: qcom: fix kernel panic due to external abort on non-linefetch
>
> This patch fixes a off-by-one in the "watchdog: qcom: add option for
> standalone watchdog not in timer block" patch that causes the
> following panic on boot:
>
> > Unhandled fault: external abort on non-linefetch (0x1008) at 0xc8874002
> > pgd = c0204000
> > [c8874002] *pgd=87806811, *pte=0b017653, *ppte=0b017453
> > Internal error: : 1008 [#1] SMP ARM
> > CPU: 2 PID: 1 Comm: swapper/0 Not tainted 4.8.6 #0
> > Hardware name: Generic DT based system
> > PC is at 0xc02222f4
> > LR is at 0x1
> > pc : [<c02222f4>] lr : [<00000001>] psr: 00000113
> > sp : c782fc98 ip : 00000003 fp : 00000000
> > r10: 00000004 r9 : c782e000 r8 : c04ab98c
> > r7 : 00000001 r6 : c8874002 r5 : c782fe00 r4 : 00000002
> > r3 : 00000000 r2 : c782fe00 r1 : 00100000 r0 : c8874002
> > Flags: nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none
> > Control: 10c5387d Table: 8020406a DAC: 00000051
> > Process swapper/0 (pid: 1, stack limit = 0xc782e210)
> > Stack: (0xc782fc98 to 0xc7830000)
> > [...]
>
> The WDT_STS (status) needs to be translated via wdt_addr as well.
>
> fixes: f0d9d0f4b44a ("watchdog: qcom: add option for standalone watchdog not in timer block")
> Cc: stable@...r.kernel.org # 4.8
> Signed-off-by: Christian Lamparter <chunkeey@...il.com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit 9b3865749589d67f612d71b447847223b2321408
> Author: Tero Kristo <t-kristo@...com>
> Date: Thu Nov 24 14:58:28 2016 +0200
>
> watchdog: davinci: add support for deferred probing
>
> devm_clk_get can fail with EPROBE_DEFER in case the clock provider is
> not ready yet. Handle this case gracefully, rather than dumping out
> a huge warning.
>
> Signed-off-by: Tero Kristo <t-kristo@...com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit 807f0b2d22b0934fc1c67df8a4961044bd76b081
> Author: Javier Martinez Canillas <javier@....samsung.com>
> Date: Wed Oct 19 16:49:42 2016 -0300
>
> watchdog: meson: Remove unneeded platform MODULE_ALIAS
>
> The Amlogic Meson is a DT-only platform, which means the devices are
> registered via OF and not using the legacy platform devices support.
>
> So there's no need to have a MODULE_ALIAS("platform:meson-gxbb-wdt")
> since the reported uevent MODALIAS to user-space will be the OF one.
>
> Signed-off-by: Javier Martinez Canillas <javier@....samsung.com>
> Acked-by: Kevin Hilman <khilman@...libre.com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit 0f3871f8a535d7e79512fe56f4a5a161b3a03422
> Author: Robert P. J. Day <rpjday@...shcourse.ca>
> Date: Sun Oct 16 08:10:37 2016 -0400
>
> watchdog: Standardize leading tabs and spaces in Kconfig file
>
> Replace small number of lines using leading spaces with proper leading
> tabs and spaces -- purely an aesthetic fix.
>
> Signed-off-by: Robert P. J. Day <rpjday@...shcourse.ca>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit f99524dced4c89af52a82a369cb61a111b9169b3
> Author: Javier Martinez Canillas <javier@....samsung.com>
> Date: Fri Oct 14 12:23:51 2016 -0300
>
> watchdog: max77620_wdt: fix module autoload
>
> If the driver is built as a module, autoload won't work because the module
> alias information is not filled. So user-space can't match the registered
> device with the corresponding module.
>
> Export the module alias information using the MODULE_DEVICE_TABLE() macro.
>
> Before this patch:
>
> $ $ modinfo drivers/watchdog/max77620_wdt.ko | grep alias
> $
>
> After this patch:
>
> modinfo drivers/watchdog/max77620_wdt.ko | grep alias
> alias: platform:max77620-watchdog
>
> Signed-off-by: Javier Martinez Canillas <javier@....samsung.com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
> commit 57d77c62536ea0f388c840c8ac7e94be54425308
> Author: Javier Martinez Canillas <javier@....samsung.com>
> Date: Fri Oct 14 12:23:50 2016 -0300
>
> watchdog: bcm7038_wdt: fix module autoload
>
> If the driver is built as a module, autoload won't work because the module
> alias information is not filled. So user-space can't match the registered
> device with the corresponding module.
>
> Export the module alias information using the MODULE_DEVICE_TABLE() macro.
>
> Before this patch:
>
> $ modinfo drivers/watchdog/bcm7038_wdt.ko | grep alias
> $
>
> After this patch:
>
> $ modinfo drivers/watchdog/bcm7038_wdt.ko | grep alias
> alias: of:N*T*Cbrcm,bcm7038-wdtC*
> alias: of:N*T*Cbrcm,bcm7038-wdt
>
> Signed-off-by: Javier Martinez Canillas <javier@....samsung.com>
> Reviewed-by: Guenter Roeck <linux@...ck-us.net>
> Signed-off-by: Guenter Roeck <linux@...ck-us.net>
>
>
> For completeness, I added the overal diff below.
>
> Greetings,
> Wim.
>
> ================================================================================
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 63cefa6..f5e05d5 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -5613,7 +5613,7 @@ S: Maintained
> F: drivers/media/dvb-frontends/hd29l2*
>
> HEWLETT PACKARD ENTERPRISE ILO NMI WATCHDOG DRIVER
> -M: Brian Boylston <brian.boylston@....com>
> +M: Jimmy Vance <jimmy.vance@....com>
> S: Supported
> F: Documentation/watchdog/hpwdt.txt
> F: drivers/watchdog/hpwdt.c
> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
> index 3eb58cb..acb00b5 100644
> --- a/drivers/watchdog/Kconfig
> +++ b/drivers/watchdog/Kconfig
> @@ -72,16 +72,16 @@ config SOFT_WATCHDOG
> module will be called softdog.
>
> config DA9052_WATCHDOG
> - tristate "Dialog DA9052 Watchdog"
> - depends on PMIC_DA9052
> - select WATCHDOG_CORE
> - help
> - Support for the watchdog in the DA9052 PMIC. Watchdog trigger
> - cause system reset.
> + tristate "Dialog DA9052 Watchdog"
> + depends on PMIC_DA9052
> + select WATCHDOG_CORE
> + help
> + Support for the watchdog in the DA9052 PMIC. Watchdog trigger
> + cause system reset.
>
> - Say Y here to include support for the DA9052 watchdog.
> - Alternatively say M to compile the driver as a module,
> - which will be called da9052_wdt.
> + Say Y here to include support for the DA9052 watchdog.
> + Alternatively say M to compile the driver as a module,
> + which will be called da9052_wdt.
>
> config DA9055_WATCHDOG
> tristate "Dialog Semiconductor DA9055 Watchdog"
> @@ -104,11 +104,11 @@ config DA9063_WATCHDOG
> This driver can be built as a module. The module name is da9063_wdt.
>
> config DA9062_WATCHDOG
> - tristate "Dialog DA9062 Watchdog"
> + tristate "Dialog DA9062/61 Watchdog"
> depends on MFD_DA9062
> select WATCHDOG_CORE
> help
> - Support for the watchdog in the DA9062 PMIC.
> + Support for the watchdog in the DA9062 and DA9061 PMICs.
>
> This driver can be built as a module. The module name is da9062_wdt.
>
> @@ -1008,8 +1008,8 @@ config IT87_WDT
> tristate "IT87 Watchdog Timer"
> depends on X86
> ---help---
> - This is the driver for the hardware watchdog on the ITE IT8702,
> - IT8712, IT8716, IT8718, IT8720, IT8721, IT8726 and IT8728
> + This is the driver for the hardware watchdog on the ITE IT8620,
> + IT8702, IT8712, IT8716, IT8718, IT8720, IT8721, IT8726 and IT8728
> Super I/O chips.
>
> If the driver does not work, then make sure that the game port in
> @@ -1514,6 +1514,13 @@ config LANTIQ_WDT
> help
> Hardware driver for the Lantiq SoC Watchdog Timer.
>
> +config LOONGSON1_WDT
> + tristate "Loongson1 SoC hardware watchdog"
> + depends on MACH_LOONGSON32
> + select WATCHDOG_CORE
> + help
> + Hardware driver for the Loongson1 SoC Watchdog Timer.
> +
> config RALINK_WDT
> tristate "Ralink SoC watchdog"
> select WATCHDOG_CORE
> @@ -1624,16 +1631,16 @@ config BOOKE_WDT_DEFAULT_TIMEOUT
> The value can be overridden by the wdt_period command-line parameter.
>
> config MEN_A21_WDT
> - tristate "MEN A21 VME CPU Carrier Board Watchdog Timer"
> - select WATCHDOG_CORE
> - depends on GPIOLIB || COMPILE_TEST
> - help
> - Watchdog driver for MEN A21 VMEbus CPU Carrier Boards.
> + tristate "MEN A21 VME CPU Carrier Board Watchdog Timer"
> + select WATCHDOG_CORE
> + depends on GPIOLIB || COMPILE_TEST
> + help
> + Watchdog driver for MEN A21 VMEbus CPU Carrier Boards.
>
> - The driver can also be built as a module. If so, the module will be
> - called mena21_wdt.
> + The driver can also be built as a module. If so, the module will be
> + called mena21_wdt.
>
> - If unsure select N here.
> + If unsure select N here.
>
> # PPC64 Architecture
>
> diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
> index caa9f4a..0c3d35e 100644
> --- a/drivers/watchdog/Makefile
> +++ b/drivers/watchdog/Makefile
> @@ -163,6 +163,7 @@ obj-$(CONFIG_TXX9_WDT) += txx9wdt.o
> obj-$(CONFIG_OCTEON_WDT) += octeon-wdt.o
> octeon-wdt-y := octeon-wdt-main.o octeon-wdt-nmi.o
> obj-$(CONFIG_LANTIQ_WDT) += lantiq_wdt.o
> +obj-$(CONFIG_LOONGSON1_WDT) += loongson1_wdt.o
> obj-$(CONFIG_RALINK_WDT) += rt2880_wdt.o
> obj-$(CONFIG_IMGPDC_WDT) += imgpdc_wdt.o
> obj-$(CONFIG_MT7621_WDT) += mt7621_wdt.o
> diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c
> index 4dddd82..c32c45b 100644
> --- a/drivers/watchdog/bcm2835_wdt.c
> +++ b/drivers/watchdog/bcm2835_wdt.c
> @@ -55,6 +55,15 @@ struct bcm2835_wdt {
> static unsigned int heartbeat;
> static bool nowayout = WATCHDOG_NOWAYOUT;
>
> +static bool bcm2835_wdt_is_running(struct bcm2835_wdt *wdt)
> +{
> + uint32_t cur;
> +
> + cur = readl(wdt->base + PM_RSTC);
> +
> + return !!(cur & PM_RSTC_WRCFG_FULL_RESET);
> +}
> +
> static int bcm2835_wdt_start(struct watchdog_device *wdog)
> {
> struct bcm2835_wdt *wdt = watchdog_get_drvdata(wdog);
> @@ -181,6 +190,17 @@ static int bcm2835_wdt_probe(struct platform_device *pdev)
> watchdog_init_timeout(&bcm2835_wdt_wdd, heartbeat, dev);
> watchdog_set_nowayout(&bcm2835_wdt_wdd, nowayout);
> bcm2835_wdt_wdd.parent = &pdev->dev;
> + if (bcm2835_wdt_is_running(wdt)) {
> + /*
> + * The currently active timeout value (set by the
> + * bootloader) may be different from the module
> + * heartbeat parameter or the value in device
> + * tree. But we just need to set WDOG_HW_RUNNING,
> + * because then the framework will "immediately" ping
> + * the device, updating the timeout.
> + */
> + set_bit(WDOG_HW_RUNNING, &bcm2835_wdt_wdd.status);
> + }
> err = watchdog_register_device(&bcm2835_wdt_wdd);
> if (err) {
> dev_err(dev, "Failed to register watchdog device");
> diff --git a/drivers/watchdog/bcm7038_wdt.c b/drivers/watchdog/bcm7038_wdt.c
> index e238df4..4814c00 100644
> --- a/drivers/watchdog/bcm7038_wdt.c
> +++ b/drivers/watchdog/bcm7038_wdt.c
> @@ -216,6 +216,7 @@ static const struct of_device_id bcm7038_wdt_match[] = {
> { .compatible = "brcm,bcm7038-wdt" },
> {},
> };
> +MODULE_DEVICE_TABLE(of, bcm7038_wdt_match);
>
> static struct platform_driver bcm7038_wdt_driver = {
> .probe = bcm7038_wdt_probe,
> diff --git a/drivers/watchdog/cpwd.c b/drivers/watchdog/cpwd.c
> index 71ee079..3d43775 100644
> --- a/drivers/watchdog/cpwd.c
> +++ b/drivers/watchdog/cpwd.c
> @@ -538,12 +538,9 @@ static int cpwd_probe(struct platform_device *op)
> if (cpwd_device)
> return -EINVAL;
>
> - p = kzalloc(sizeof(*p), GFP_KERNEL);
> - err = -ENOMEM;
> - if (!p) {
> - pr_err("Unable to allocate struct cpwd\n");
> - goto out;
> - }
> + p = devm_kzalloc(&op->dev, sizeof(*p), GFP_KERNEL);
> + if (!p)
> + return -ENOMEM;
>
> p->irq = op->archdata.irqs[0];
>
> @@ -553,12 +550,12 @@ static int cpwd_probe(struct platform_device *op)
> 4 * WD_TIMER_REGSZ, DRIVER_NAME);
> if (!p->regs) {
> pr_err("Unable to map registers\n");
> - goto out_free;
> + return -ENOMEM;
> }
>
> options = of_find_node_by_path("/options");
> - err = -ENODEV;
> if (!options) {
> + err = -ENODEV;
> pr_err("Unable to find /options node\n");
> goto out_iounmap;
> }
> @@ -620,10 +617,7 @@ static int cpwd_probe(struct platform_device *op)
>
> platform_set_drvdata(op, p);
> cpwd_device = p;
> - err = 0;
> -
> -out:
> - return err;
> + return 0;
>
> out_unregister:
> for (i--; i >= 0; i--)
> @@ -632,9 +626,7 @@ out_unregister:
> out_iounmap:
> of_iounmap(&op->resource[0], p->regs, 4 * WD_TIMER_REGSZ);
>
> -out_free:
> - kfree(p);
> - goto out;
> + return err;
> }
>
> static int cpwd_remove(struct platform_device *op)
> @@ -659,7 +651,6 @@ static int cpwd_remove(struct platform_device *op)
> free_irq(p->irq, p);
>
> of_iounmap(&op->resource[0], p->regs, 4 * WD_TIMER_REGSZ);
> - kfree(p);
>
> cpwd_device = NULL;
>
> diff --git a/drivers/watchdog/da9062_wdt.c b/drivers/watchdog/da9062_wdt.c
> index 7386111..a02cee6 100644
> --- a/drivers/watchdog/da9062_wdt.c
> +++ b/drivers/watchdog/da9062_wdt.c
> @@ -1,5 +1,5 @@
> /*
> - * da9062_wdt.c - WDT device driver for DA9062
> + * Watchdog device driver for DA9062 and DA9061 PMICs
> * Copyright (C) 2015 Dialog Semiconductor Ltd.
> *
> * This program is free software; you can redistribute it and/or
> @@ -188,6 +188,13 @@ static const struct watchdog_ops da9062_watchdog_ops = {
> .set_timeout = da9062_wdt_set_timeout,
> };
>
> +static const struct of_device_id da9062_compatible_id_table[] = {
> + { .compatible = "dlg,da9062-watchdog", },
> + { },
> +};
> +
> +MODULE_DEVICE_TABLE(of, da9062_compatible_id_table);
> +
> static int da9062_wdt_probe(struct platform_device *pdev)
> {
> int ret;
> @@ -244,11 +251,12 @@ static struct platform_driver da9062_wdt_driver = {
> .remove = da9062_wdt_remove,
> .driver = {
> .name = "da9062-watchdog",
> + .of_match_table = da9062_compatible_id_table,
> },
> };
> module_platform_driver(da9062_wdt_driver);
>
> MODULE_AUTHOR("S Twiss <stwiss.opensource@...semi.com>");
> -MODULE_DESCRIPTION("WDT device driver for Dialog DA9062");
> +MODULE_DESCRIPTION("WDT device driver for Dialog DA9062 and DA9061");
> MODULE_LICENSE("GPL");
> MODULE_ALIAS("platform:da9062-watchdog");
> diff --git a/drivers/watchdog/davinci_wdt.c b/drivers/watchdog/davinci_wdt.c
> index 17454ca..0e731d7 100644
> --- a/drivers/watchdog/davinci_wdt.c
> +++ b/drivers/watchdog/davinci_wdt.c
> @@ -166,8 +166,12 @@ static int davinci_wdt_probe(struct platform_device *pdev)
> return -ENOMEM;
>
> davinci_wdt->clk = devm_clk_get(dev, NULL);
> - if (WARN_ON(IS_ERR(davinci_wdt->clk)))
> +
> + if (IS_ERR(davinci_wdt->clk)) {
> + if (PTR_ERR(davinci_wdt->clk) != -EPROBE_DEFER)
> + dev_err(&pdev->dev, "failed to get clock node\n");
> return PTR_ERR(davinci_wdt->clk);
> + }
>
> clk_prepare_enable(davinci_wdt->clk);
>
> diff --git a/drivers/watchdog/intel-mid_wdt.c b/drivers/watchdog/intel-mid_wdt.c
> index db36d12..a4b7292 100644
> --- a/drivers/watchdog/intel-mid_wdt.c
> +++ b/drivers/watchdog/intel-mid_wdt.c
> @@ -43,6 +43,7 @@ static inline int wdt_command(int sub, u32 *in, int inlen)
>
> static int wdt_start(struct watchdog_device *wd)
> {
> + struct device *dev = watchdog_get_drvdata(wd);
> int ret, in_size;
> int timeout = wd->timeout;
> struct ipc_wd_start {
> @@ -57,36 +58,32 @@ static int wdt_start(struct watchdog_device *wd)
> in_size = DIV_ROUND_UP(sizeof(ipc_wd_start), 4);
>
> ret = wdt_command(SCU_WATCHDOG_START, (u32 *)&ipc_wd_start, in_size);
> - if (ret) {
> - struct device *dev = watchdog_get_drvdata(wd);
> + if (ret)
> dev_crit(dev, "error starting watchdog: %d\n", ret);
> - }
>
> return ret;
> }
>
> static int wdt_ping(struct watchdog_device *wd)
> {
> + struct device *dev = watchdog_get_drvdata(wd);
> int ret;
>
> ret = wdt_command(SCU_WATCHDOG_KEEPALIVE, NULL, 0);
> - if (ret) {
> - struct device *dev = watchdog_get_drvdata(wd);
> - dev_crit(dev, "Error executing keepalive: 0x%x\n", ret);
> - }
> + if (ret)
> + dev_crit(dev, "Error executing keepalive: %d\n", ret);
>
> return ret;
> }
>
> static int wdt_stop(struct watchdog_device *wd)
> {
> + struct device *dev = watchdog_get_drvdata(wd);
> int ret;
>
> ret = wdt_command(SCU_WATCHDOG_STOP, NULL, 0);
> - if (ret) {
> - struct device *dev = watchdog_get_drvdata(wd);
> - dev_crit(dev, "Error stopping watchdog: 0x%x\n", ret);
> - }
> + if (ret)
> + dev_crit(dev, "Error stopping watchdog: %d\n", ret);
>
> return ret;
> }
> @@ -151,6 +148,9 @@ static int mid_wdt_probe(struct platform_device *pdev)
> return ret;
> }
>
> + /* Make sure the watchdog is not running */
> + wdt_stop(wdt_dev);
> +
> ret = watchdog_register_device(wdt_dev);
> if (ret) {
> dev_err(&pdev->dev, "error registering watchdog device\n");
> diff --git a/drivers/watchdog/it87_wdt.c b/drivers/watchdog/it87_wdt.c
> index e54839b..b9878c4 100644
> --- a/drivers/watchdog/it87_wdt.c
> +++ b/drivers/watchdog/it87_wdt.c
> @@ -12,7 +12,7 @@
> * http://www.ite.com.tw/
> *
> * Support of the watchdog timers, which are available on
> - * IT8702, IT8712, IT8716, IT8718, IT8720, IT8721, IT8726,
> + * IT8620, IT8702, IT8712, IT8716, IT8718, IT8720, IT8721, IT8726,
> * IT8728 and IT8783.
> *
> * This program is free software; you can redistribute it and/or
> @@ -78,6 +78,7 @@
>
> /* Chip Id numbers */
> #define NO_DEV_ID 0xffff
> +#define IT8620_ID 0x8620
> #define IT8702_ID 0x8702
> #define IT8705_ID 0x8705
> #define IT8712_ID 0x8712
> @@ -630,6 +631,7 @@ static int __init it87_wdt_init(void)
> case IT8726_ID:
> max_units = 65535;
> break;
> + case IT8620_ID:
> case IT8718_ID:
> case IT8720_ID:
> case IT8721_ID:
> diff --git a/drivers/watchdog/jz4740_wdt.c b/drivers/watchdog/jz4740_wdt.c
> index c8d51dd..20627f2 100644
> --- a/drivers/watchdog/jz4740_wdt.c
> +++ b/drivers/watchdog/jz4740_wdt.c
> @@ -148,7 +148,7 @@ static const struct of_device_id jz4740_wdt_of_matches[] = {
> { .compatible = "ingenic,jz4740-watchdog", },
> { /* sentinel */ }
> };
> -MODULE_DEVICE_TABLE(of, jz4740_wdt_of_matches)
> +MODULE_DEVICE_TABLE(of, jz4740_wdt_of_matches);
> #endif
>
> static int jz4740_wdt_probe(struct platform_device *pdev)
> diff --git a/drivers/watchdog/loongson1_wdt.c b/drivers/watchdog/loongson1_wdt.c
> new file mode 100644
> index 0000000..3aee50c
> --- /dev/null
> +++ b/drivers/watchdog/loongson1_wdt.c
> @@ -0,0 +1,170 @@
> +/*
> + * Copyright (c) 2016 Yang Ling <gnaygnil@...il.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/watchdog.h>
> +#include <loongson1.h>
> +
> +#define DEFAULT_HEARTBEAT 30
> +
> +static bool nowayout = WATCHDOG_NOWAYOUT;
> +module_param(nowayout, bool, 0444);
> +
> +static unsigned int heartbeat;
> +module_param(heartbeat, uint, 0444);
> +
> +struct ls1x_wdt_drvdata {
> + void __iomem *base;
> + struct clk *clk;
> + unsigned long clk_rate;
> + struct watchdog_device wdt;
> +};
> +
> +static int ls1x_wdt_ping(struct watchdog_device *wdt_dev)
> +{
> + struct ls1x_wdt_drvdata *drvdata = watchdog_get_drvdata(wdt_dev);
> +
> + writel(0x1, drvdata->base + WDT_SET);
> +
> + return 0;
> +}
> +
> +static int ls1x_wdt_set_timeout(struct watchdog_device *wdt_dev,
> + unsigned int timeout)
> +{
> + struct ls1x_wdt_drvdata *drvdata = watchdog_get_drvdata(wdt_dev);
> + unsigned int max_hw_heartbeat = wdt_dev->max_hw_heartbeat_ms / 1000;
> + unsigned int counts;
> +
> + wdt_dev->timeout = timeout;
> +
> + counts = drvdata->clk_rate * min(timeout, max_hw_heartbeat);
> + writel(counts, drvdata->base + WDT_TIMER);
> +
> + return 0;
> +}
> +
> +static int ls1x_wdt_start(struct watchdog_device *wdt_dev)
> +{
> + struct ls1x_wdt_drvdata *drvdata = watchdog_get_drvdata(wdt_dev);
> +
> + writel(0x1, drvdata->base + WDT_EN);
> +
> + return 0;
> +}
> +
> +static int ls1x_wdt_stop(struct watchdog_device *wdt_dev)
> +{
> + struct ls1x_wdt_drvdata *drvdata = watchdog_get_drvdata(wdt_dev);
> +
> + writel(0x0, drvdata->base + WDT_EN);
> +
> + return 0;
> +}
> +
> +static const struct watchdog_info ls1x_wdt_info = {
> + .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
> + .identity = "Loongson1 Watchdog",
> +};
> +
> +static const struct watchdog_ops ls1x_wdt_ops = {
> + .owner = THIS_MODULE,
> + .start = ls1x_wdt_start,
> + .stop = ls1x_wdt_stop,
> + .ping = ls1x_wdt_ping,
> + .set_timeout = ls1x_wdt_set_timeout,
> +};
> +
> +static int ls1x_wdt_probe(struct platform_device *pdev)
> +{
> + struct ls1x_wdt_drvdata *drvdata;
> + struct watchdog_device *ls1x_wdt;
> + unsigned long clk_rate;
> + struct resource *res;
> + int err;
> +
> + drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL);
> + if (!drvdata)
> + return -ENOMEM;
> +
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + drvdata->base = devm_ioremap_resource(&pdev->dev, res);
> + if (IS_ERR(drvdata->base))
> + return PTR_ERR(drvdata->base);
> +
> + drvdata->clk = devm_clk_get(&pdev->dev, pdev->name);
> + if (IS_ERR(drvdata->clk))
> + return PTR_ERR(drvdata->clk);
> +
> + err = clk_prepare_enable(drvdata->clk);
> + if (err) {
> + dev_err(&pdev->dev, "clk enable failed\n");
> + return err;
> + }
> +
> + clk_rate = clk_get_rate(drvdata->clk);
> + if (!clk_rate) {
> + err = -EINVAL;
> + goto err0;
> + }
> + drvdata->clk_rate = clk_rate;
> +
> + ls1x_wdt = &drvdata->wdt;
> + ls1x_wdt->info = &ls1x_wdt_info;
> + ls1x_wdt->ops = &ls1x_wdt_ops;
> + ls1x_wdt->timeout = DEFAULT_HEARTBEAT;
> + ls1x_wdt->min_timeout = 1;
> + ls1x_wdt->max_hw_heartbeat_ms = U32_MAX / clk_rate * 1000;
> + ls1x_wdt->parent = &pdev->dev;
> +
> + watchdog_init_timeout(ls1x_wdt, heartbeat, &pdev->dev);
> + watchdog_set_nowayout(ls1x_wdt, nowayout);
> + watchdog_set_drvdata(ls1x_wdt, drvdata);
> +
> + err = watchdog_register_device(&drvdata->wdt);
> + if (err) {
> + dev_err(&pdev->dev, "failed to register watchdog device\n");
> + goto err0;
> + }
> +
> + platform_set_drvdata(pdev, drvdata);
> +
> + dev_info(&pdev->dev, "Loongson1 Watchdog driver registered\n");
> +
> + return 0;
> +err0:
> + clk_disable_unprepare(drvdata->clk);
> + return err;
> +}
> +
> +static int ls1x_wdt_remove(struct platform_device *pdev)
> +{
> + struct ls1x_wdt_drvdata *drvdata = platform_get_drvdata(pdev);
> +
> + watchdog_unregister_device(&drvdata->wdt);
> + clk_disable_unprepare(drvdata->clk);
> +
> + return 0;
> +}
> +
> +static struct platform_driver ls1x_wdt_driver = {
> + .probe = ls1x_wdt_probe,
> + .remove = ls1x_wdt_remove,
> + .driver = {
> + .name = "ls1x-wdt",
> + },
> +};
> +
> +module_platform_driver(ls1x_wdt_driver);
> +
> +MODULE_AUTHOR("Yang Ling <gnaygnil@...il.com>");
> +MODULE_DESCRIPTION("Loongson1 Watchdog Driver");
> +MODULE_LICENSE("GPL");
> diff --git a/drivers/watchdog/max77620_wdt.c b/drivers/watchdog/max77620_wdt.c
> index 48b84df..68c41fa 100644
> --- a/drivers/watchdog/max77620_wdt.c
> +++ b/drivers/watchdog/max77620_wdt.c
> @@ -205,6 +205,7 @@ static struct platform_device_id max77620_wdt_devtype[] = {
> { .name = "max77620-watchdog", },
> { },
> };
> +MODULE_DEVICE_TABLE(platform, max77620_wdt_devtype);
>
> static struct platform_driver max77620_wdt_driver = {
> .driver = {
> diff --git a/drivers/watchdog/mei_wdt.c b/drivers/watchdog/mei_wdt.c
> index 630bd18..2a9d5cd 100644
> --- a/drivers/watchdog/mei_wdt.c
> +++ b/drivers/watchdog/mei_wdt.c
> @@ -389,6 +389,8 @@ static int mei_wdt_register(struct mei_wdt *wdt)
> wdt->wdd.max_timeout = MEI_WDT_MAX_TIMEOUT;
>
> watchdog_set_drvdata(&wdt->wdd, wdt);
> + watchdog_stop_on_reboot(&wdt->wdd);
> +
> ret = watchdog_register_device(&wdt->wdd);
> if (ret) {
> dev_err(dev, "unable to register watchdog device = %d.\n", ret);
> diff --git a/drivers/watchdog/meson_gxbb_wdt.c b/drivers/watchdog/meson_gxbb_wdt.c
> index 44d180a..45d4766 100644
> --- a/drivers/watchdog/meson_gxbb_wdt.c
> +++ b/drivers/watchdog/meson_gxbb_wdt.c
> @@ -264,7 +264,6 @@ static struct platform_driver meson_gxbb_wdt_driver = {
>
> module_platform_driver(meson_gxbb_wdt_driver);
>
> -MODULE_ALIAS("platform:meson-gxbb-wdt");
> MODULE_AUTHOR("Neil Armstrong <narmstrong@...libre.com>");
> MODULE_DESCRIPTION("Amlogic Meson GXBB Watchdog timer driver");
> MODULE_LICENSE("Dual BSD/GPL");
> diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
> index 5f2273a..366e5c7 100644
> --- a/drivers/watchdog/mpc8xxx_wdt.c
> +++ b/drivers/watchdog/mpc8xxx_wdt.c
> @@ -23,7 +23,6 @@
> #include <linux/init.h>
> #include <linux/kernel.h>
> #include <linux/timer.h>
> -#include <linux/miscdevice.h>
> #include <linux/of_address.h>
> #include <linux/of_platform.h>
> #include <linux/module.h>
> diff --git a/drivers/watchdog/octeon-wdt-main.c b/drivers/watchdog/octeon-wdt-main.c
> index b55981f..8b4fa4d 100644
> --- a/drivers/watchdog/octeon-wdt-main.c
> +++ b/drivers/watchdog/octeon-wdt-main.c
> @@ -56,7 +56,6 @@
>
> #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
>
> -#include <linux/miscdevice.h>
> #include <linux/interrupt.h>
> #include <linux/watchdog.h>
> #include <linux/cpumask.h>
> diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c
> index 5796b5d..4f47b5e 100644
> --- a/drivers/watchdog/qcom-wdt.c
> +++ b/drivers/watchdog/qcom-wdt.c
> @@ -209,7 +209,7 @@ static int qcom_wdt_probe(struct platform_device *pdev)
> wdt->wdd.parent = &pdev->dev;
> wdt->layout = regs;
>
> - if (readl(wdt->base + WDT_STS) & 1)
> + if (readl(wdt_addr(wdt, WDT_STS)) & 1)
> wdt->wdd.bootstatus = WDIOF_CARDRESET;
>
> /*
>
Powered by blists - more mailing lists