summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2019-05-13 09:20:42 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-05-13 09:20:42 -0400
commit55472bae5331f33582d9f0e8919fed8bebcda0da (patch)
tree4e9d910e8f5de08d1ceb45509ff42641fcd0a6e7
parentd7a02fa0a8f9ec1b81d57628ca9834563208ef33 (diff)
parenta9f0bda567e32a2b44165b067adfc4a4f56d1815 (diff)
Merge tag 'linux-watchdog-5.2-rc1' of git://www.linux-watchdog.org/linux-watchdog
Pull watchdog updates from Wim Van Sebroeck: - a new watchdog driver for the ROHM BD70528 watchdog block - a new watchdog driver for the i.MX system controller watchdog - conversions to use device managed functions and other improvements - refactor watchdog_init_timeout - make watchdog core configurable as module - pretimeout governors improvements - a lot of other fixes * tag 'linux-watchdog-5.2-rc1' of git://www.linux-watchdog.org/linux-watchdog: (114 commits) watchdog: Enforce that at least one pretimeout governor is enabled watchdog: stm32: add dynamic prescaler support watchdog: Improve Kconfig entry ordering and dependencies watchdog: npcm: Enable modular builds watchdog: Make watchdog core configurable as module watchdog: Move pretimeout governor configuration up watchdog: Use depends instead of select for pretimeout governors watchdog: rtd119x: drop unused module.h include watchdog: intel_scu: make it explicitly non-modular watchdog: coh901327: make it explicitly non-modular watchdog: ziirave_wdt: drop warning after calling watchdog_init_timeout watchdog: xen_wdt: drop warning after calling watchdog_init_timeout watchdog: stm32_iwdg: drop warning after calling watchdog_init_timeout watchdog: st_lpc_wdt: drop warning after calling watchdog_init_timeout watchdog: sp5100_tco: drop warning after calling watchdog_init_timeout watchdog: renesas_wdt: drop warning after calling watchdog_init_timeout watchdog: nic7018_wdt: drop warning after calling watchdog_init_timeout watchdog: ni903x_wdt: drop warning after calling watchdog_init_timeout watchdog: imx_sc_wdt: drop warning after calling watchdog_init_timeout watchdog: i6300esb: drop warning after calling watchdog_init_timeout ...
-rw-r--r--Documentation/devicetree/bindings/watchdog/fsl-imx-sc-wdt.txt24
-rw-r--r--Documentation/devicetree/bindings/watchdog/mtk-wdt.txt1
-rw-r--r--drivers/watchdog/Kconfig161
-rw-r--r--drivers/watchdog/Makefile2
-rw-r--r--drivers/watchdog/alim7101_wdt.c2
-rw-r--r--drivers/watchdog/armada_37xx_wdt.c43
-rw-r--r--drivers/watchdog/asm9260_wdt.c77
-rw-r--r--drivers/watchdog/aspeed_wdt.c25
-rw-r--r--drivers/watchdog/at91sam9_wdt.c4
-rw-r--r--drivers/watchdog/ath79_wdt.c4
-rw-r--r--drivers/watchdog/atlas7_wdt.c65
-rw-r--r--drivers/watchdog/bcm2835_wdt.c1
-rw-r--r--drivers/watchdog/bcm7038_wdt.c42
-rw-r--r--drivers/watchdog/bcm_kona_wdt.c18
-rw-r--r--drivers/watchdog/bd70528_wdt.c290
-rw-r--r--drivers/watchdog/cadence_wdt.c90
-rw-r--r--drivers/watchdog/coh901327_wdt.c28
-rw-r--r--drivers/watchdog/da9052_wdt.c13
-rw-r--r--drivers/watchdog/da9055_wdt.c12
-rw-r--r--drivers/watchdog/da9062_wdt.c20
-rw-r--r--drivers/watchdog/da9063_wdt.c21
-rw-r--r--drivers/watchdog/davinci_wdt.c45
-rw-r--r--drivers/watchdog/digicolor_wdt.c4
-rw-r--r--drivers/watchdog/dw_wdt.c4
-rw-r--r--drivers/watchdog/ebc-c384_wdt.c5
-rw-r--r--drivers/watchdog/ep93xx_wdt.c17
-rw-r--r--drivers/watchdog/f71808e_wdt.c18
-rw-r--r--drivers/watchdog/ftwdt010_wdt.c6
-rw-r--r--drivers/watchdog/gpio_wdt.c16
-rw-r--r--drivers/watchdog/hpwdt.c3
-rw-r--r--drivers/watchdog/i6300esb.c9
-rw-r--r--drivers/watchdog/iTCO_wdt.c13
-rw-r--r--drivers/watchdog/imgpdc_wdt.c95
-rw-r--r--drivers/watchdog/imx2_wdt.c8
-rw-r--r--drivers/watchdog/imx_sc_wdt.c175
-rw-r--r--drivers/watchdog/intel-mid_wdt.c22
-rw-r--r--drivers/watchdog/intel_scu_watchdog.c20
-rw-r--r--drivers/watchdog/jz4740_wdt.c17
-rw-r--r--drivers/watchdog/kempld_wdt.c28
-rw-r--r--drivers/watchdog/lantiq_wdt.c4
-rw-r--r--drivers/watchdog/loongson1_wdt.c52
-rw-r--r--drivers/watchdog/lpc18xx_wdt.c47
-rw-r--r--drivers/watchdog/machzwd.c3
-rw-r--r--drivers/watchdog/max63xx_wdt.c24
-rw-r--r--drivers/watchdog/max77620_wdt.c23
-rw-r--r--drivers/watchdog/mena21_wdt.c28
-rw-r--r--drivers/watchdog/menf21bmc_wdt.c33
-rw-r--r--drivers/watchdog/meson_gxbb_wdt.c49
-rw-r--r--drivers/watchdog/meson_wdt.c19
-rw-r--r--drivers/watchdog/mlx_wdt.c14
-rw-r--r--drivers/watchdog/moxart_wdt.c20
-rw-r--r--drivers/watchdog/mpc8xxx_wdt.c20
-rw-r--r--drivers/watchdog/mt7621_wdt.c12
-rw-r--r--drivers/watchdog/mtk_wdt.c37
-rw-r--r--drivers/watchdog/ni903x_wdt.c4
-rw-r--r--drivers/watchdog/nic7018_wdt.c5
-rw-r--r--drivers/watchdog/npcm_wdt.c10
-rw-r--r--drivers/watchdog/nuc900_wdt.c4
-rw-r--r--drivers/watchdog/of_xilinx_wdt.c62
-rw-r--r--drivers/watchdog/omap_wdt.c4
-rw-r--r--drivers/watchdog/orion_wdt.c14
-rw-r--r--drivers/watchdog/pic32-dmt.c50
-rw-r--r--drivers/watchdog/pic32-wdt.c62
-rw-r--r--drivers/watchdog/pm8916_wdt.c21
-rw-r--r--drivers/watchdog/pnx4008_wdt.c45
-rw-r--r--drivers/watchdog/qcom-wdt.c55
-rw-r--r--drivers/watchdog/renesas_wdt.c9
-rw-r--r--drivers/watchdog/rn5t618_wdt.c9
-rw-r--r--drivers/watchdog/rt2880_wdt.c32
-rw-r--r--drivers/watchdog/rtd119x_wdt.c47
-rw-r--r--drivers/watchdog/rza_wdt.c25
-rw-r--r--drivers/watchdog/s3c2410_wdt.c4
-rw-r--r--drivers/watchdog/sama5d4_wdt.c39
-rw-r--r--drivers/watchdog/sb_wdog.c4
-rw-r--r--drivers/watchdog/sbsa_gwdt.c28
-rw-r--r--drivers/watchdog/shwdt.c4
-rw-r--r--drivers/watchdog/sirfsoc_wdt.c28
-rw-r--r--drivers/watchdog/sp5100_tco.c4
-rw-r--r--drivers/watchdog/sprd_wdt.c42
-rw-r--r--drivers/watchdog/st_lpc_wdt.c53
-rw-r--r--drivers/watchdog/stm32_iwdg.c150
-rw-r--r--drivers/watchdog/stmp3xxx_rtc_wdt.c16
-rw-r--r--drivers/watchdog/stpmic1_wdt.c13
-rw-r--r--drivers/watchdog/sunxi_wdt.c19
-rw-r--r--drivers/watchdog/tangox_wdt.c41
-rw-r--r--drivers/watchdog/tegra_wdt.c30
-rw-r--r--drivers/watchdog/tqmx86_wdt.c14
-rw-r--r--drivers/watchdog/ts4800_wdt.c33
-rw-r--r--drivers/watchdog/ts72xx_wdt.c18
-rw-r--r--drivers/watchdog/twl4030_wdt.c22
-rw-r--r--drivers/watchdog/txx9wdt.c4
-rw-r--r--drivers/watchdog/uniphier_wdt.c2
-rw-r--r--drivers/watchdog/ux500_wdt.c17
-rw-r--r--drivers/watchdog/watchdog_core.c42
-rw-r--r--drivers/watchdog/wdat_wdt.c29
-rw-r--r--drivers/watchdog/wm831x_wdt.c19
-rw-r--r--drivers/watchdog/xen_wdt.c18
-rw-r--r--drivers/watchdog/ziirave_wdt.c6
-rw-r--r--drivers/watchdog/zx2967_wdt.c37
99 files changed, 1490 insertions, 1537 deletions
diff --git a/Documentation/devicetree/bindings/watchdog/fsl-imx-sc-wdt.txt b/Documentation/devicetree/bindings/watchdog/fsl-imx-sc-wdt.txt
new file mode 100644
index 000000000000..02b87e92ae68
--- /dev/null
+++ b/Documentation/devicetree/bindings/watchdog/fsl-imx-sc-wdt.txt
@@ -0,0 +1,24 @@
1* Freescale i.MX System Controller Watchdog
2
3i.MX system controller watchdog is for i.MX SoCs with system controller inside,
4the watchdog is managed by system controller, users can ONLY communicate with
5system controller from secure mode for watchdog operations, so Linux i.MX system
6controller watchdog driver will call ARM SMC API and trap into ARM-Trusted-Firmware
7for watchdog operations, ARM-Trusted-Firmware is running at secure EL3 mode and
8it will request system controller to execute the watchdog operation passed from
9Linux kernel.
10
11Required properties:
12- compatible: Should be :
13 "fsl,imx8qxp-sc-wdt"
14 followed by "fsl,imx-sc-wdt";
15
16Optional properties:
17- timeout-sec : Contains the watchdog timeout in seconds.
18
19Examples:
20
21watchdog {
22 compatible = "fsl,imx8qxp-sc-wdt", "fsl,imx-sc-wdt";
23 timeout-sec = <60>;
24};
diff --git a/Documentation/devicetree/bindings/watchdog/mtk-wdt.txt b/Documentation/devicetree/bindings/watchdog/mtk-wdt.txt
index 8682d6a93e5b..fd380eb28df5 100644
--- a/Documentation/devicetree/bindings/watchdog/mtk-wdt.txt
+++ b/Documentation/devicetree/bindings/watchdog/mtk-wdt.txt
@@ -9,6 +9,7 @@ Required properties:
9 "mediatek,mt7622-wdt", "mediatek,mt6589-wdt": for MT7622 9 "mediatek,mt7622-wdt", "mediatek,mt6589-wdt": for MT7622
10 "mediatek,mt7623-wdt", "mediatek,mt6589-wdt": for MT7623 10 "mediatek,mt7623-wdt", "mediatek,mt6589-wdt": for MT7623
11 "mediatek,mt7629-wdt", "mediatek,mt6589-wdt": for MT7629 11 "mediatek,mt7629-wdt", "mediatek,mt6589-wdt": for MT7629
12 "mediatek,mt8516-wdt", "mediatek,mt6589-wdt": for MT8516
12 13
13- reg : Specifies base physical address and size of the registers. 14- reg : Specifies base physical address and size of the registers.
14 15
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index 242eea859637..7ea60371bda0 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -30,7 +30,7 @@ menuconfig WATCHDOG
30if WATCHDOG 30if WATCHDOG
31 31
32config WATCHDOG_CORE 32config WATCHDOG_CORE
33 bool "WatchDog Timer Driver Core" 33 tristate "WatchDog Timer Driver Core"
34 ---help--- 34 ---help---
35 Say Y here if you want to use the new watchdog timer driver core. 35 Say Y here if you want to use the new watchdog timer driver core.
36 This driver provides a framework for all watchdog timer drivers 36 This driver provides a framework for all watchdog timer drivers
@@ -63,6 +63,66 @@ config WATCHDOG_SYSFS
63 Say Y here if you want to enable watchdog device status read through 63 Say Y here if you want to enable watchdog device status read through
64 sysfs attributes. 64 sysfs attributes.
65 65
66comment "Watchdog Pretimeout Governors"
67
68config WATCHDOG_PRETIMEOUT_GOV
69 bool "Enable watchdog pretimeout governors"
70 depends on WATCHDOG_CORE
71 help
72 The option allows to select watchdog pretimeout governors.
73
74config WATCHDOG_PRETIMEOUT_GOV_SEL
75 tristate
76 depends on WATCHDOG_PRETIMEOUT_GOV
77 default m
78 select WATCHDOG_PRETIMEOUT_GOV_PANIC if WATCHDOG_PRETIMEOUT_GOV_NOOP=n
79
80if WATCHDOG_PRETIMEOUT_GOV
81
82config WATCHDOG_PRETIMEOUT_GOV_NOOP
83 tristate "Noop watchdog pretimeout governor"
84 depends on WATCHDOG_CORE
85 default WATCHDOG_CORE
86 help
87 Noop watchdog pretimeout governor, only an informational
88 message is added to kernel log buffer.
89
90config WATCHDOG_PRETIMEOUT_GOV_PANIC
91 tristate "Panic watchdog pretimeout governor"
92 depends on WATCHDOG_CORE
93 default WATCHDOG_CORE
94 help
95 Panic watchdog pretimeout governor, on watchdog pretimeout
96 event put the kernel into panic.
97
98choice
99 prompt "Default Watchdog Pretimeout Governor"
100 default WATCHDOG_PRETIMEOUT_DEFAULT_GOV_PANIC
101 help
102 This option selects a default watchdog pretimeout governor.
103 The governor takes its action, if a watchdog is capable
104 to report a pretimeout event.
105
106config WATCHDOG_PRETIMEOUT_DEFAULT_GOV_NOOP
107 bool "noop"
108 depends on WATCHDOG_PRETIMEOUT_GOV_NOOP
109 help
110 Use noop watchdog pretimeout governor by default. If noop
111 governor is selected by a user, write a short message to
112 the kernel log buffer and don't do any system changes.
113
114config WATCHDOG_PRETIMEOUT_DEFAULT_GOV_PANIC
115 bool "panic"
116 depends on WATCHDOG_PRETIMEOUT_GOV_PANIC
117 help
118 Use panic watchdog pretimeout governor by default, if
119 a watchdog pretimeout event happens, consider that
120 a watchdog feeder is dead and reboot is unavoidable.
121
122endchoice
123
124endif # WATCHDOG_PRETIMEOUT_GOV
125
66# 126#
67# General Watchdog drivers 127# General Watchdog drivers
68# 128#
@@ -90,6 +150,18 @@ config SOFT_WATCHDOG_PRETIMEOUT
90 watchdog. Be aware that governors might affect the watchdog because it 150 watchdog. Be aware that governors might affect the watchdog because it
91 is purely software, e.g. the panic governor will stall it! 151 is purely software, e.g. the panic governor will stall it!
92 152
153config BD70528_WATCHDOG
154 tristate "ROHM BD70528 PMIC Watchdog"
155 depends on MFD_ROHM_BD70528
156 select WATCHDOG_CORE
157 help
158 Support for the watchdog in the ROHM BD70528 PMIC. Watchdog trigger
159 cause system reset.
160
161 Say Y here to include support for the ROHM BD70528 watchdog.
162 Alternatively say M to compile the driver as a module,
163 which will be called bd70528_wdt.
164
93config DA9052_WATCHDOG 165config DA9052_WATCHDOG
94 tristate "Dialog DA9052 Watchdog" 166 tristate "Dialog DA9052 Watchdog"
95 depends on PMIC_DA9052 || COMPILE_TEST 167 depends on PMIC_DA9052 || COMPILE_TEST
@@ -552,7 +624,7 @@ config COH901327_WATCHDOG
552 compiled as a module. 624 compiled as a module.
553 625
554config NPCM7XX_WATCHDOG 626config NPCM7XX_WATCHDOG
555 bool "Nuvoton NPCM750 watchdog" 627 tristate "Nuvoton NPCM750 watchdog"
556 depends on ARCH_NPCM || COMPILE_TEST 628 depends on ARCH_NPCM || COMPILE_TEST
557 default y if ARCH_NPCM7XX 629 default y if ARCH_NPCM7XX
558 select WATCHDOG_CORE 630 select WATCHDOG_CORE
@@ -641,6 +713,22 @@ config IMX2_WDT
641 To compile this driver as a module, choose M here: the 713 To compile this driver as a module, choose M here: the
642 module will be called imx2_wdt. 714 module will be called imx2_wdt.
643 715
716config IMX_SC_WDT
717 tristate "IMX SC Watchdog"
718 depends on HAVE_ARM_SMCCC
719 select WATCHDOG_CORE
720 help
721 This is the driver for the system controller watchdog
722 on the NXP i.MX SoCs with system controller inside, the
723 watchdog driver will call ARM SMC API and trap into
724 ARM-Trusted-Firmware for operations, ARM-Trusted-Firmware
725 will request system controller to execute the operations.
726 If you have one of these processors and wish to have
727 watchdog support enabled, say Y, otherwise say N.
728
729 To compile this driver as a module, choose M here: the
730 module will be called imx_sc_wdt.
731
644config UX500_WATCHDOG 732config UX500_WATCHDOG
645 tristate "ST-Ericsson Ux500 watchdog" 733 tristate "ST-Ericsson Ux500 watchdog"
646 depends on MFD_DB8500_PRCMU 734 depends on MFD_DB8500_PRCMU
@@ -1179,6 +1267,15 @@ config HP_WATCHDOG
1179 To compile this driver as a module, choose M here: the module will be 1267 To compile this driver as a module, choose M here: the module will be
1180 called hpwdt. 1268 called hpwdt.
1181 1269
1270config HPWDT_NMI_DECODING
1271 bool "NMI support for the HP ProLiant iLO2+ Hardware Watchdog Timer"
1272 depends on HP_WATCHDOG
1273 default y
1274 help
1275 Enables the NMI handler for the watchdog pretimeout NMI and the iLO
1276 "Generate NMI to System" virtual button. When an NMI is claimed
1277 by the driver, panic is called.
1278
1182config KEMPLD_WDT 1279config KEMPLD_WDT
1183 tristate "Kontron COM Watchdog Timer" 1280 tristate "Kontron COM Watchdog Timer"
1184 depends on MFD_KEMPLD 1281 depends on MFD_KEMPLD
@@ -1190,15 +1287,6 @@ config KEMPLD_WDT
1190 This driver can also be built as a module. If so, the module will be 1287 This driver can also be built as a module. If so, the module will be
1191 called kempld_wdt. 1288 called kempld_wdt.
1192 1289
1193config HPWDT_NMI_DECODING
1194 bool "NMI support for the HP ProLiant iLO2+ Hardware Watchdog Timer"
1195 depends on HP_WATCHDOG
1196 default y
1197 help
1198 Enables the NMI handler for the watchdog pretimeout NMI and the iLO
1199 "Generate NMI to System" virtual button. When an NMI is claimed
1200 by the driver, panic is called.
1201
1202config SC1200_WDT 1290config SC1200_WDT
1203 tristate "National Semiconductor PC87307/PC97307 (ala SC1200) Watchdog" 1291 tristate "National Semiconductor PC87307/PC97307 (ala SC1200) Watchdog"
1204 depends on X86 1292 depends on X86
@@ -1647,7 +1735,7 @@ config BCM_KONA_WDT
1647 1735
1648config BCM_KONA_WDT_DEBUG 1736config BCM_KONA_WDT_DEBUG
1649 bool "DEBUGFS support for BCM Kona Watchdog" 1737 bool "DEBUGFS support for BCM Kona Watchdog"
1650 depends on BCM_KONA_WDT || COMPILE_TEST 1738 depends on BCM_KONA_WDT
1651 help 1739 help
1652 If enabled, adds /sys/kernel/debug/bcm_kona_wdt/info which provides 1740 If enabled, adds /sys/kernel/debug/bcm_kona_wdt/info which provides
1653 access to the driver's internal data structures as well as watchdog 1741 access to the driver's internal data structures as well as watchdog
@@ -2024,53 +2112,4 @@ config USBPCWATCHDOG
2024 2112
2025 Most people will say N. 2113 Most people will say N.
2026 2114
2027comment "Watchdog Pretimeout Governors"
2028
2029config WATCHDOG_PRETIMEOUT_GOV
2030 bool "Enable watchdog pretimeout governors"
2031 help
2032 The option allows to select watchdog pretimeout governors.
2033
2034if WATCHDOG_PRETIMEOUT_GOV
2035
2036choice
2037 prompt "Default Watchdog Pretimeout Governor"
2038 default WATCHDOG_PRETIMEOUT_DEFAULT_GOV_PANIC
2039 help
2040 This option selects a default watchdog pretimeout governor.
2041 The governor takes its action, if a watchdog is capable
2042 to report a pretimeout event.
2043
2044config WATCHDOG_PRETIMEOUT_DEFAULT_GOV_NOOP
2045 bool "noop"
2046 select WATCHDOG_PRETIMEOUT_GOV_NOOP
2047 help
2048 Use noop watchdog pretimeout governor by default. If noop
2049 governor is selected by a user, write a short message to
2050 the kernel log buffer and don't do any system changes.
2051
2052config WATCHDOG_PRETIMEOUT_DEFAULT_GOV_PANIC
2053 bool "panic"
2054 select WATCHDOG_PRETIMEOUT_GOV_PANIC
2055 help
2056 Use panic watchdog pretimeout governor by default, if
2057 a watchdog pretimeout event happens, consider that
2058 a watchdog feeder is dead and reboot is unavoidable.
2059
2060endchoice
2061
2062config WATCHDOG_PRETIMEOUT_GOV_NOOP
2063 tristate "Noop watchdog pretimeout governor"
2064 help
2065 Noop watchdog pretimeout governor, only an informational
2066 message is added to kernel log buffer.
2067
2068config WATCHDOG_PRETIMEOUT_GOV_PANIC
2069 tristate "Panic watchdog pretimeout governor"
2070 help
2071 Panic watchdog pretimeout governor, on watchdog pretimeout
2072 event put the kernel into panic.
2073
2074endif # WATCHDOG_PRETIMEOUT_GOV
2075
2076endif # WATCHDOG 2115endif # WATCHDOG
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index ba930e464657..7caa920e7e60 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -68,6 +68,7 @@ obj-$(CONFIG_NUC900_WATCHDOG) += nuc900_wdt.o
68obj-$(CONFIG_TS4800_WATCHDOG) += ts4800_wdt.o 68obj-$(CONFIG_TS4800_WATCHDOG) += ts4800_wdt.o
69obj-$(CONFIG_TS72XX_WATCHDOG) += ts72xx_wdt.o 69obj-$(CONFIG_TS72XX_WATCHDOG) += ts72xx_wdt.o
70obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o 70obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o
71obj-$(CONFIG_IMX_SC_WDT) += imx_sc_wdt.o
71obj-$(CONFIG_UX500_WATCHDOG) += ux500_wdt.o 72obj-$(CONFIG_UX500_WATCHDOG) += ux500_wdt.o
72obj-$(CONFIG_RETU_WATCHDOG) += retu_wdt.o 73obj-$(CONFIG_RETU_WATCHDOG) += retu_wdt.o
73obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o 74obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o
@@ -205,6 +206,7 @@ obj-$(CONFIG_WATCHDOG_SUN4V) += sun4v_wdt.o
205obj-$(CONFIG_XEN_WDT) += xen_wdt.o 206obj-$(CONFIG_XEN_WDT) += xen_wdt.o
206 207
207# Architecture Independent 208# Architecture Independent
209obj-$(CONFIG_BD70528_WATCHDOG) += bd70528_wdt.o
208obj-$(CONFIG_DA9052_WATCHDOG) += da9052_wdt.o 210obj-$(CONFIG_DA9052_WATCHDOG) += da9052_wdt.o
209obj-$(CONFIG_DA9055_WATCHDOG) += da9055_wdt.o 211obj-$(CONFIG_DA9055_WATCHDOG) += da9055_wdt.o
210obj-$(CONFIG_DA9062_WATCHDOG) += da9062_wdt.o 212obj-$(CONFIG_DA9062_WATCHDOG) += da9062_wdt.o
diff --git a/drivers/watchdog/alim7101_wdt.c b/drivers/watchdog/alim7101_wdt.c
index 7e9884960eb9..689b8a0593c1 100644
--- a/drivers/watchdog/alim7101_wdt.c
+++ b/drivers/watchdog/alim7101_wdt.c
@@ -277,8 +277,8 @@ static long fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
277 return -EINVAL; 277 return -EINVAL;
278 timeout = new_timeout; 278 timeout = new_timeout;
279 wdt_keepalive(); 279 wdt_keepalive();
280 /* Fall through */
281 } 280 }
281 /* Fall through */
282 case WDIOC_GETTIMEOUT: 282 case WDIOC_GETTIMEOUT:
283 return put_user(timeout, p); 283 return put_user(timeout, p);
284 default: 284 default:
diff --git a/drivers/watchdog/armada_37xx_wdt.c b/drivers/watchdog/armada_37xx_wdt.c
index 4b4054f54df9..e5dcb26d85f0 100644
--- a/drivers/watchdog/armada_37xx_wdt.c
+++ b/drivers/watchdog/armada_37xx_wdt.c
@@ -244,6 +244,11 @@ static const struct watchdog_ops armada_37xx_wdt_ops = {
244 .get_timeleft = armada_37xx_wdt_get_timeleft, 244 .get_timeleft = armada_37xx_wdt_get_timeleft,
245}; 245};
246 246
247static void armada_clk_disable_unprepare(void *data)
248{
249 clk_disable_unprepare(data);
250}
251
247static int armada_37xx_wdt_probe(struct platform_device *pdev) 252static int armada_37xx_wdt_probe(struct platform_device *pdev)
248{ 253{
249 struct armada_37xx_watchdog *dev; 254 struct armada_37xx_watchdog *dev;
@@ -278,12 +283,14 @@ static int armada_37xx_wdt_probe(struct platform_device *pdev)
278 ret = clk_prepare_enable(dev->clk); 283 ret = clk_prepare_enable(dev->clk);
279 if (ret) 284 if (ret)
280 return ret; 285 return ret;
286 ret = devm_add_action_or_reset(&pdev->dev,
287 armada_clk_disable_unprepare, dev->clk);
288 if (ret)
289 return ret;
281 290
282 dev->clk_rate = clk_get_rate(dev->clk); 291 dev->clk_rate = clk_get_rate(dev->clk);
283 if (!dev->clk_rate) { 292 if (!dev->clk_rate)
284 ret = -EINVAL; 293 return -EINVAL;
285 goto disable_clk;
286 }
287 294
288 /* 295 /*
289 * Since the timeout in seconds is given as 32 bit unsigned int, and 296 * Since the timeout in seconds is given as 32 bit unsigned int, and
@@ -307,35 +314,15 @@ static int armada_37xx_wdt_probe(struct platform_device *pdev)
307 set_bit(WDOG_HW_RUNNING, &dev->wdt.status); 314 set_bit(WDOG_HW_RUNNING, &dev->wdt.status);
308 315
309 watchdog_set_nowayout(&dev->wdt, nowayout); 316 watchdog_set_nowayout(&dev->wdt, nowayout);
310 ret = watchdog_register_device(&dev->wdt); 317 watchdog_stop_on_reboot(&dev->wdt);
318 ret = devm_watchdog_register_device(&pdev->dev, &dev->wdt);
311 if (ret) 319 if (ret)
312 goto disable_clk; 320 return ret;
313 321
314 dev_info(&pdev->dev, "Initial timeout %d sec%s\n", 322 dev_info(&pdev->dev, "Initial timeout %d sec%s\n",
315 dev->wdt.timeout, nowayout ? ", nowayout" : ""); 323 dev->wdt.timeout, nowayout ? ", nowayout" : "");
316 324
317 return 0; 325 return 0;
318
319disable_clk:
320 clk_disable_unprepare(dev->clk);
321 return ret;
322}
323
324static int armada_37xx_wdt_remove(struct platform_device *pdev)
325{
326 struct watchdog_device *wdt = platform_get_drvdata(pdev);
327 struct armada_37xx_watchdog *dev = watchdog_get_drvdata(wdt);
328
329 watchdog_unregister_device(wdt);
330 clk_disable_unprepare(dev->clk);
331 return 0;
332}
333
334static void armada_37xx_wdt_shutdown(struct platform_device *pdev)
335{
336 struct watchdog_device *wdt = platform_get_drvdata(pdev);
337
338 armada_37xx_wdt_stop(wdt);
339} 326}
340 327
341static int __maybe_unused armada_37xx_wdt_suspend(struct device *dev) 328static int __maybe_unused armada_37xx_wdt_suspend(struct device *dev)
@@ -370,8 +357,6 @@ MODULE_DEVICE_TABLE(of, armada_37xx_wdt_match);
370 357
371static struct platform_driver armada_37xx_wdt_driver = { 358static struct platform_driver armada_37xx_wdt_driver = {
372 .probe = armada_37xx_wdt_probe, 359 .probe = armada_37xx_wdt_probe,
373 .remove = armada_37xx_wdt_remove,
374 .shutdown = armada_37xx_wdt_shutdown,
375 .driver = { 360 .driver = {
376 .name = "armada_37xx_wdt", 361 .name = "armada_37xx_wdt",
377 .of_match_table = of_match_ptr(armada_37xx_wdt_match), 362 .of_match_table = of_match_ptr(armada_37xx_wdt_match),
diff --git a/drivers/watchdog/asm9260_wdt.c b/drivers/watchdog/asm9260_wdt.c
index 9768e44ffeb8..c5b9aae544dd 100644
--- a/drivers/watchdog/asm9260_wdt.c
+++ b/drivers/watchdog/asm9260_wdt.c
@@ -196,6 +196,11 @@ static const struct watchdog_ops asm9260_wdt_ops = {
196 .restart = asm9260_restart, 196 .restart = asm9260_restart,
197}; 197};
198 198
199static void asm9260_clk_disable_unprepare(void *data)
200{
201 clk_disable_unprepare(data);
202}
203
199static int asm9260_wdt_get_dt_clks(struct asm9260_wdt_priv *priv) 204static int asm9260_wdt_get_dt_clks(struct asm9260_wdt_priv *priv)
200{ 205{
201 int err; 206 int err;
@@ -219,26 +224,32 @@ static int asm9260_wdt_get_dt_clks(struct asm9260_wdt_priv *priv)
219 dev_err(priv->dev, "Failed to enable ahb_clk!\n"); 224 dev_err(priv->dev, "Failed to enable ahb_clk!\n");
220 return err; 225 return err;
221 } 226 }
227 err = devm_add_action_or_reset(priv->dev,
228 asm9260_clk_disable_unprepare,
229 priv->clk_ahb);
230 if (err)
231 return err;
222 232
223 err = clk_set_rate(priv->clk, CLOCK_FREQ); 233 err = clk_set_rate(priv->clk, CLOCK_FREQ);
224 if (err) { 234 if (err) {
225 clk_disable_unprepare(priv->clk_ahb);
226 dev_err(priv->dev, "Failed to set rate!\n"); 235 dev_err(priv->dev, "Failed to set rate!\n");
227 return err; 236 return err;
228 } 237 }
229 238
230 err = clk_prepare_enable(priv->clk); 239 err = clk_prepare_enable(priv->clk);
231 if (err) { 240 if (err) {
232 clk_disable_unprepare(priv->clk_ahb);
233 dev_err(priv->dev, "Failed to enable clk!\n"); 241 dev_err(priv->dev, "Failed to enable clk!\n");
234 return err; 242 return err;
235 } 243 }
244 err = devm_add_action_or_reset(priv->dev,
245 asm9260_clk_disable_unprepare,
246 priv->clk);
247 if (err)
248 return err;
236 249
237 /* wdt has internal divider */ 250 /* wdt has internal divider */
238 clk = clk_get_rate(priv->clk); 251 clk = clk_get_rate(priv->clk);
239 if (!clk) { 252 if (!clk) {
240 clk_disable_unprepare(priv->clk);
241 clk_disable_unprepare(priv->clk_ahb);
242 dev_err(priv->dev, "Failed, clk is 0!\n"); 253 dev_err(priv->dev, "Failed, clk is 0!\n");
243 return -EINVAL; 254 return -EINVAL;
244 } 255 }
@@ -274,25 +285,23 @@ static void asm9260_wdt_get_dt_mode(struct asm9260_wdt_priv *priv)
274 285
275static int asm9260_wdt_probe(struct platform_device *pdev) 286static int asm9260_wdt_probe(struct platform_device *pdev)
276{ 287{
288 struct device *dev = &pdev->dev;
277 struct asm9260_wdt_priv *priv; 289 struct asm9260_wdt_priv *priv;
278 struct watchdog_device *wdd; 290 struct watchdog_device *wdd;
279 struct resource *res;
280 int ret; 291 int ret;
281 static const char * const mode_name[] = { "hw", "sw", "debug", }; 292 static const char * const mode_name[] = { "hw", "sw", "debug", };
282 293
283 priv = devm_kzalloc(&pdev->dev, sizeof(struct asm9260_wdt_priv), 294 priv = devm_kzalloc(dev, sizeof(struct asm9260_wdt_priv), GFP_KERNEL);
284 GFP_KERNEL);
285 if (!priv) 295 if (!priv)
286 return -ENOMEM; 296 return -ENOMEM;
287 297
288 priv->dev = &pdev->dev; 298 priv->dev = dev;
289 299
290 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 300 priv->iobase = devm_platform_ioremap_resource(pdev, 0);
291 priv->iobase = devm_ioremap_resource(&pdev->dev, res);
292 if (IS_ERR(priv->iobase)) 301 if (IS_ERR(priv->iobase))
293 return PTR_ERR(priv->iobase); 302 return PTR_ERR(priv->iobase);
294 303
295 priv->rst = devm_reset_control_get_exclusive(&pdev->dev, "wdt_rst"); 304 priv->rst = devm_reset_control_get_exclusive(dev, "wdt_rst");
296 if (IS_ERR(priv->rst)) 305 if (IS_ERR(priv->rst))
297 return PTR_ERR(priv->rst); 306 return PTR_ERR(priv->rst);
298 307
@@ -305,7 +314,7 @@ static int asm9260_wdt_probe(struct platform_device *pdev)
305 wdd->ops = &asm9260_wdt_ops; 314 wdd->ops = &asm9260_wdt_ops;
306 wdd->min_timeout = 1; 315 wdd->min_timeout = 1;
307 wdd->max_timeout = BM_WDTC_MAX(priv->wdt_freq); 316 wdd->max_timeout = BM_WDTC_MAX(priv->wdt_freq);
308 wdd->parent = &pdev->dev; 317 wdd->parent = dev;
309 318
310 watchdog_set_drvdata(wdd, priv); 319 watchdog_set_drvdata(wdd, priv);
311 320
@@ -315,7 +324,7 @@ static int asm9260_wdt_probe(struct platform_device *pdev)
315 * the max instead. 324 * the max instead.
316 */ 325 */
317 wdd->timeout = ASM9260_WDT_DEFAULT_TIMEOUT; 326 wdd->timeout = ASM9260_WDT_DEFAULT_TIMEOUT;
318 watchdog_init_timeout(wdd, 0, &pdev->dev); 327 watchdog_init_timeout(wdd, 0, dev);
319 328
320 asm9260_wdt_get_dt_mode(priv); 329 asm9260_wdt_get_dt_mode(priv);
321 330
@@ -327,49 +336,25 @@ static int asm9260_wdt_probe(struct platform_device *pdev)
327 * Not all supported platforms specify an interrupt for the 336 * Not all supported platforms specify an interrupt for the
328 * watchdog, so let's make it optional. 337 * watchdog, so let's make it optional.
329 */ 338 */
330 ret = devm_request_irq(&pdev->dev, priv->irq, 339 ret = devm_request_irq(dev, priv->irq, asm9260_wdt_irq, 0,
331 asm9260_wdt_irq, 0, pdev->name, priv); 340 pdev->name, priv);
332 if (ret < 0) 341 if (ret < 0)
333 dev_warn(&pdev->dev, "failed to request IRQ\n"); 342 dev_warn(dev, "failed to request IRQ\n");
334 } 343 }
335 344
336 watchdog_set_restart_priority(wdd, 128); 345 watchdog_set_restart_priority(wdd, 128);
337 346
338 ret = watchdog_register_device(wdd); 347 watchdog_stop_on_reboot(wdd);
348 watchdog_stop_on_unregister(wdd);
349 ret = devm_watchdog_register_device(dev, wdd);
339 if (ret) 350 if (ret)
340 goto clk_off; 351 return ret;
341 352
342 platform_set_drvdata(pdev, priv); 353 platform_set_drvdata(pdev, priv);
343 354
344 dev_info(&pdev->dev, "Watchdog enabled (timeout: %d sec, mode: %s)\n", 355 dev_info(dev, "Watchdog enabled (timeout: %d sec, mode: %s)\n",
345 wdd->timeout, mode_name[priv->mode]); 356 wdd->timeout, mode_name[priv->mode]);
346 return 0; 357 return 0;
347
348clk_off:
349 clk_disable_unprepare(priv->clk);
350 clk_disable_unprepare(priv->clk_ahb);
351 return ret;
352}
353
354static void asm9260_wdt_shutdown(struct platform_device *pdev)
355{
356 struct asm9260_wdt_priv *priv = platform_get_drvdata(pdev);
357
358 asm9260_wdt_disable(&priv->wdd);
359}
360
361static int asm9260_wdt_remove(struct platform_device *pdev)
362{
363 struct asm9260_wdt_priv *priv = platform_get_drvdata(pdev);
364
365 asm9260_wdt_disable(&priv->wdd);
366
367 watchdog_unregister_device(&priv->wdd);
368
369 clk_disable_unprepare(priv->clk);
370 clk_disable_unprepare(priv->clk_ahb);
371
372 return 0;
373} 358}
374 359
375static const struct of_device_id asm9260_wdt_of_match[] = { 360static const struct of_device_id asm9260_wdt_of_match[] = {
@@ -384,8 +369,6 @@ static struct platform_driver asm9260_wdt_driver = {
384 .of_match_table = asm9260_wdt_of_match, 369 .of_match_table = asm9260_wdt_of_match,
385 }, 370 },
386 .probe = asm9260_wdt_probe, 371 .probe = asm9260_wdt_probe,
387 .remove = asm9260_wdt_remove,
388 .shutdown = asm9260_wdt_shutdown,
389}; 372};
390module_platform_driver(asm9260_wdt_driver); 373module_platform_driver(asm9260_wdt_driver);
391 374
diff --git a/drivers/watchdog/aspeed_wdt.c b/drivers/watchdog/aspeed_wdt.c
index 1abe4d021fd2..34117745c65f 100644
--- a/drivers/watchdog/aspeed_wdt.c
+++ b/drivers/watchdog/aspeed_wdt.c
@@ -187,22 +187,21 @@ static const struct watchdog_info aspeed_wdt_info = {
187 187
188static int aspeed_wdt_probe(struct platform_device *pdev) 188static int aspeed_wdt_probe(struct platform_device *pdev)
189{ 189{
190 struct device *dev = &pdev->dev;
190 const struct aspeed_wdt_config *config; 191 const struct aspeed_wdt_config *config;
191 const struct of_device_id *ofdid; 192 const struct of_device_id *ofdid;
192 struct aspeed_wdt *wdt; 193 struct aspeed_wdt *wdt;
193 struct resource *res;
194 struct device_node *np; 194 struct device_node *np;
195 const char *reset_type; 195 const char *reset_type;
196 u32 duration; 196 u32 duration;
197 u32 status; 197 u32 status;
198 int ret; 198 int ret;
199 199
200 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 200 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
201 if (!wdt) 201 if (!wdt)
202 return -ENOMEM; 202 return -ENOMEM;
203 203
204 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 204 wdt->base = devm_platform_ioremap_resource(pdev, 0);
205 wdt->base = devm_ioremap_resource(&pdev->dev, res);
206 if (IS_ERR(wdt->base)) 205 if (IS_ERR(wdt->base))
207 return PTR_ERR(wdt->base); 206 return PTR_ERR(wdt->base);
208 207
@@ -214,12 +213,12 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
214 wdt->wdd.info = &aspeed_wdt_info; 213 wdt->wdd.info = &aspeed_wdt_info;
215 wdt->wdd.ops = &aspeed_wdt_ops; 214 wdt->wdd.ops = &aspeed_wdt_ops;
216 wdt->wdd.max_hw_heartbeat_ms = WDT_MAX_TIMEOUT_MS; 215 wdt->wdd.max_hw_heartbeat_ms = WDT_MAX_TIMEOUT_MS;
217 wdt->wdd.parent = &pdev->dev; 216 wdt->wdd.parent = dev;
218 217
219 wdt->wdd.timeout = WDT_DEFAULT_TIMEOUT; 218 wdt->wdd.timeout = WDT_DEFAULT_TIMEOUT;
220 watchdog_init_timeout(&wdt->wdd, 0, &pdev->dev); 219 watchdog_init_timeout(&wdt->wdd, 0, dev);
221 220
222 np = pdev->dev.of_node; 221 np = dev->of_node;
223 222
224 ofdid = of_match_node(aspeed_wdt_of_table, np); 223 ofdid = of_match_node(aspeed_wdt_of_table, np);
225 if (!ofdid) 224 if (!ofdid)
@@ -288,11 +287,11 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
288 u32 max_duration = config->ext_pulse_width_mask + 1; 287 u32 max_duration = config->ext_pulse_width_mask + 1;
289 288
290 if (duration == 0 || duration > max_duration) { 289 if (duration == 0 || duration > max_duration) {
291 dev_err(&pdev->dev, "Invalid pulse duration: %uus\n", 290 dev_err(dev, "Invalid pulse duration: %uus\n",
292 duration); 291 duration);
293 duration = max(1U, min(max_duration, duration)); 292 duration = max(1U, min(max_duration, duration));
294 dev_info(&pdev->dev, "Pulse duration set to %uus\n", 293 dev_info(dev, "Pulse duration set to %uus\n",
295 duration); 294 duration);
296 } 295 }
297 296
298 /* 297 /*
@@ -314,9 +313,9 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
314 if (status & WDT_TIMEOUT_STATUS_BOOT_SECONDARY) 313 if (status & WDT_TIMEOUT_STATUS_BOOT_SECONDARY)
315 wdt->wdd.bootstatus = WDIOF_CARDRESET; 314 wdt->wdd.bootstatus = WDIOF_CARDRESET;
316 315
317 ret = devm_watchdog_register_device(&pdev->dev, &wdt->wdd); 316 ret = devm_watchdog_register_device(dev, &wdt->wdd);
318 if (ret) { 317 if (ret) {
319 dev_err(&pdev->dev, "failed to register\n"); 318 dev_err(dev, "failed to register\n");
320 return ret; 319 return ret;
321 } 320 }
322 321
diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
index f4050a229eb5..292b5a1ca831 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -327,7 +327,6 @@ static inline int of_at91wdt_init(struct device_node *np, struct at91wdt *wdt)
327 327
328static int __init at91wdt_probe(struct platform_device *pdev) 328static int __init at91wdt_probe(struct platform_device *pdev)
329{ 329{
330 struct resource *r;
331 int err; 330 int err;
332 struct at91wdt *wdt; 331 struct at91wdt *wdt;
333 332
@@ -346,8 +345,7 @@ static int __init at91wdt_probe(struct platform_device *pdev)
346 wdt->wdd.min_timeout = 1; 345 wdt->wdd.min_timeout = 1;
347 wdt->wdd.max_timeout = 0xFFFF; 346 wdt->wdd.max_timeout = 0xFFFF;
348 347
349 r = platform_get_resource(pdev, IORESOURCE_MEM, 0); 348 wdt->base = devm_platform_ioremap_resource(pdev, 0);
350 wdt->base = devm_ioremap_resource(&pdev->dev, r);
351 if (IS_ERR(wdt->base)) 349 if (IS_ERR(wdt->base))
352 return PTR_ERR(wdt->base); 350 return PTR_ERR(wdt->base);
353 351
diff --git a/drivers/watchdog/ath79_wdt.c b/drivers/watchdog/ath79_wdt.c
index 4f56b63f9691..02234c254b10 100644
--- a/drivers/watchdog/ath79_wdt.c
+++ b/drivers/watchdog/ath79_wdt.c
@@ -250,15 +250,13 @@ static struct miscdevice ath79_wdt_miscdev = {
250 250
251static int ath79_wdt_probe(struct platform_device *pdev) 251static int ath79_wdt_probe(struct platform_device *pdev)
252{ 252{
253 struct resource *res;
254 u32 ctrl; 253 u32 ctrl;
255 int err; 254 int err;
256 255
257 if (wdt_base) 256 if (wdt_base)
258 return -EBUSY; 257 return -EBUSY;
259 258
260 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 259 wdt_base = devm_platform_ioremap_resource(pdev, 0);
261 wdt_base = devm_ioremap_resource(&pdev->dev, res);
262 if (IS_ERR(wdt_base)) 260 if (IS_ERR(wdt_base))
263 return PTR_ERR(wdt_base); 261 return PTR_ERR(wdt_base);
264 262
diff --git a/drivers/watchdog/atlas7_wdt.c b/drivers/watchdog/atlas7_wdt.c
index 4abdcabd8219..79337d2a8a8e 100644
--- a/drivers/watchdog/atlas7_wdt.c
+++ b/drivers/watchdog/atlas7_wdt.c
@@ -125,80 +125,57 @@ static const struct of_device_id atlas7_wdt_ids[] = {
125 {} 125 {}
126}; 126};
127 127
128static void atlas7_clk_disable_unprepare(void *data)
129{
130 clk_disable_unprepare(data);
131}
132
128static int atlas7_wdt_probe(struct platform_device *pdev) 133static int atlas7_wdt_probe(struct platform_device *pdev)
129{ 134{
130 struct device_node *np = pdev->dev.of_node; 135 struct device *dev = &pdev->dev;
131 struct atlas7_wdog *wdt; 136 struct atlas7_wdog *wdt;
132 struct resource *res;
133 struct clk *clk; 137 struct clk *clk;
134 int ret; 138 int ret;
135 139
136 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 140 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
137 if (!wdt) 141 if (!wdt)
138 return -ENOMEM; 142 return -ENOMEM;
139 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 143 wdt->base = devm_platform_ioremap_resource(pdev, 0);
140 wdt->base = devm_ioremap_resource(&pdev->dev, res);
141 if (IS_ERR(wdt->base)) 144 if (IS_ERR(wdt->base))
142 return PTR_ERR(wdt->base); 145 return PTR_ERR(wdt->base);
143 146
144 clk = of_clk_get(np, 0); 147 clk = devm_clk_get(dev, NULL);
145 if (IS_ERR(clk)) 148 if (IS_ERR(clk))
146 return PTR_ERR(clk); 149 return PTR_ERR(clk);
147 ret = clk_prepare_enable(clk); 150 ret = clk_prepare_enable(clk);
148 if (ret) { 151 if (ret) {
149 dev_err(&pdev->dev, "clk enable failed\n"); 152 dev_err(dev, "clk enable failed\n");
150 goto err; 153 return ret;
151 } 154 }
155 ret = devm_add_action_or_reset(dev, atlas7_clk_disable_unprepare, clk);
156 if (ret)
157 return ret;
152 158
153 /* disable watchdog hardware */ 159 /* disable watchdog hardware */
154 writel(0, wdt->base + ATLAS7_WDT_CNT_CTRL); 160 writel(0, wdt->base + ATLAS7_WDT_CNT_CTRL);
155 161
156 wdt->tick_rate = clk_get_rate(clk); 162 wdt->tick_rate = clk_get_rate(clk);
157 if (!wdt->tick_rate) { 163 if (!wdt->tick_rate)
158 ret = -EINVAL; 164 return -EINVAL;
159 goto err1;
160 }
161 165
162 wdt->clk = clk; 166 wdt->clk = clk;
163 atlas7_wdd.min_timeout = 1; 167 atlas7_wdd.min_timeout = 1;
164 atlas7_wdd.max_timeout = UINT_MAX / wdt->tick_rate; 168 atlas7_wdd.max_timeout = UINT_MAX / wdt->tick_rate;
165 169
166 watchdog_init_timeout(&atlas7_wdd, 0, &pdev->dev); 170 watchdog_init_timeout(&atlas7_wdd, 0, dev);
167 watchdog_set_nowayout(&atlas7_wdd, nowayout); 171 watchdog_set_nowayout(&atlas7_wdd, nowayout);
168 172
169 watchdog_set_drvdata(&atlas7_wdd, wdt); 173 watchdog_set_drvdata(&atlas7_wdd, wdt);
170 platform_set_drvdata(pdev, &atlas7_wdd); 174 platform_set_drvdata(pdev, &atlas7_wdd);
171 175
172 ret = watchdog_register_device(&atlas7_wdd); 176 watchdog_stop_on_reboot(&atlas7_wdd);
173 if (ret) 177 watchdog_stop_on_unregister(&atlas7_wdd);
174 goto err1; 178 return devm_watchdog_register_device(dev, &atlas7_wdd);
175
176 return 0;
177
178err1:
179 clk_disable_unprepare(clk);
180err:
181 clk_put(clk);
182 return ret;
183}
184
185static void atlas7_wdt_shutdown(struct platform_device *pdev)
186{
187 struct watchdog_device *wdd = platform_get_drvdata(pdev);
188 struct atlas7_wdog *wdt = watchdog_get_drvdata(wdd);
189
190 atlas7_wdt_disable(wdd);
191 clk_disable_unprepare(wdt->clk);
192}
193
194static int atlas7_wdt_remove(struct platform_device *pdev)
195{
196 struct watchdog_device *wdd = platform_get_drvdata(pdev);
197 struct atlas7_wdog *wdt = watchdog_get_drvdata(wdd);
198
199 atlas7_wdt_shutdown(pdev);
200 clk_put(wdt->clk);
201 return 0;
202} 179}
203 180
204static int __maybe_unused atlas7_wdt_suspend(struct device *dev) 181static int __maybe_unused atlas7_wdt_suspend(struct device *dev)
@@ -236,8 +213,6 @@ static struct platform_driver atlas7_wdt_driver = {
236 .of_match_table = atlas7_wdt_ids, 213 .of_match_table = atlas7_wdt_ids,
237 }, 214 },
238 .probe = atlas7_wdt_probe, 215 .probe = atlas7_wdt_probe,
239 .remove = atlas7_wdt_remove,
240 .shutdown = atlas7_wdt_shutdown,
241}; 216};
242module_platform_driver(atlas7_wdt_driver); 217module_platform_driver(atlas7_wdt_driver);
243 218
diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c
index 1834524ae373..560c1c54c177 100644
--- a/drivers/watchdog/bcm2835_wdt.c
+++ b/drivers/watchdog/bcm2835_wdt.c
@@ -177,7 +177,6 @@ static int bcm2835_wdt_probe(struct platform_device *pdev)
177 wdt = devm_kzalloc(dev, sizeof(struct bcm2835_wdt), GFP_KERNEL); 177 wdt = devm_kzalloc(dev, sizeof(struct bcm2835_wdt), GFP_KERNEL);
178 if (!wdt) 178 if (!wdt)
179 return -ENOMEM; 179 return -ENOMEM;
180 platform_set_drvdata(pdev, wdt);
181 180
182 spin_lock_init(&wdt->lock); 181 spin_lock_init(&wdt->lock);
183 182
diff --git a/drivers/watchdog/bcm7038_wdt.c b/drivers/watchdog/bcm7038_wdt.c
index ce3f646e8077..d3d88f6703d7 100644
--- a/drivers/watchdog/bcm7038_wdt.c
+++ b/drivers/watchdog/bcm7038_wdt.c
@@ -107,11 +107,15 @@ static const struct watchdog_ops bcm7038_wdt_ops = {
107 .get_timeleft = bcm7038_wdt_get_timeleft, 107 .get_timeleft = bcm7038_wdt_get_timeleft,
108}; 108};
109 109
110static void bcm7038_clk_disable_unprepare(void *data)
111{
112 clk_disable_unprepare(data);
113}
114
110static int bcm7038_wdt_probe(struct platform_device *pdev) 115static int bcm7038_wdt_probe(struct platform_device *pdev)
111{ 116{
112 struct device *dev = &pdev->dev; 117 struct device *dev = &pdev->dev;
113 struct bcm7038_watchdog *wdt; 118 struct bcm7038_watchdog *wdt;
114 struct resource *res;
115 int err; 119 int err;
116 120
117 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL); 121 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
@@ -120,8 +124,7 @@ static int bcm7038_wdt_probe(struct platform_device *pdev)
120 124
121 platform_set_drvdata(pdev, wdt); 125 platform_set_drvdata(pdev, wdt);
122 126
123 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 127 wdt->base = devm_platform_ioremap_resource(pdev, 0);
124 wdt->base = devm_ioremap_resource(dev, res);
125 if (IS_ERR(wdt->base)) 128 if (IS_ERR(wdt->base))
126 return PTR_ERR(wdt->base); 129 return PTR_ERR(wdt->base);
127 130
@@ -131,6 +134,11 @@ static int bcm7038_wdt_probe(struct platform_device *pdev)
131 err = clk_prepare_enable(wdt->clk); 134 err = clk_prepare_enable(wdt->clk);
132 if (err) 135 if (err)
133 return err; 136 return err;
137 err = devm_add_action_or_reset(dev,
138 bcm7038_clk_disable_unprepare,
139 wdt->clk);
140 if (err)
141 return err;
134 wdt->rate = clk_get_rate(wdt->clk); 142 wdt->rate = clk_get_rate(wdt->clk);
135 /* Prevent divide-by-zero exception */ 143 /* Prevent divide-by-zero exception */
136 if (!wdt->rate) 144 if (!wdt->rate)
@@ -148,10 +156,11 @@ static int bcm7038_wdt_probe(struct platform_device *pdev)
148 wdt->wdd.parent = dev; 156 wdt->wdd.parent = dev;
149 watchdog_set_drvdata(&wdt->wdd, wdt); 157 watchdog_set_drvdata(&wdt->wdd, wdt);
150 158
151 err = watchdog_register_device(&wdt->wdd); 159 watchdog_stop_on_reboot(&wdt->wdd);
160 watchdog_stop_on_unregister(&wdt->wdd);
161 err = devm_watchdog_register_device(dev, &wdt->wdd);
152 if (err) { 162 if (err) {
153 dev_err(dev, "Failed to register watchdog device\n"); 163 dev_err(dev, "Failed to register watchdog device\n");
154 clk_disable_unprepare(wdt->clk);
155 return err; 164 return err;
156 } 165 }
157 166
@@ -160,19 +169,6 @@ static int bcm7038_wdt_probe(struct platform_device *pdev)
160 return 0; 169 return 0;
161} 170}
162 171
163static int bcm7038_wdt_remove(struct platform_device *pdev)
164{
165 struct bcm7038_watchdog *wdt = platform_get_drvdata(pdev);
166
167 if (!nowayout)
168 bcm7038_wdt_stop(&wdt->wdd);
169
170 watchdog_unregister_device(&wdt->wdd);
171 clk_disable_unprepare(wdt->clk);
172
173 return 0;
174}
175
176#ifdef CONFIG_PM_SLEEP 172#ifdef CONFIG_PM_SLEEP
177static int bcm7038_wdt_suspend(struct device *dev) 173static int bcm7038_wdt_suspend(struct device *dev)
178{ 174{
@@ -198,14 +194,6 @@ static int bcm7038_wdt_resume(struct device *dev)
198static SIMPLE_DEV_PM_OPS(bcm7038_wdt_pm_ops, bcm7038_wdt_suspend, 194static SIMPLE_DEV_PM_OPS(bcm7038_wdt_pm_ops, bcm7038_wdt_suspend,
199 bcm7038_wdt_resume); 195 bcm7038_wdt_resume);
200 196
201static void bcm7038_wdt_shutdown(struct platform_device *pdev)
202{
203 struct bcm7038_watchdog *wdt = platform_get_drvdata(pdev);
204
205 if (watchdog_active(&wdt->wdd))
206 bcm7038_wdt_stop(&wdt->wdd);
207}
208
209static const struct of_device_id bcm7038_wdt_match[] = { 197static const struct of_device_id bcm7038_wdt_match[] = {
210 { .compatible = "brcm,bcm7038-wdt" }, 198 { .compatible = "brcm,bcm7038-wdt" },
211 {}, 199 {},
@@ -214,8 +202,6 @@ MODULE_DEVICE_TABLE(of, bcm7038_wdt_match);
214 202
215static struct platform_driver bcm7038_wdt_driver = { 203static struct platform_driver bcm7038_wdt_driver = {
216 .probe = bcm7038_wdt_probe, 204 .probe = bcm7038_wdt_probe,
217 .remove = bcm7038_wdt_remove,
218 .shutdown = bcm7038_wdt_shutdown,
219 .driver = { 205 .driver = {
220 .name = "bcm7038-wdt", 206 .name = "bcm7038-wdt",
221 .of_match_table = bcm7038_wdt_match, 207 .of_match_table = bcm7038_wdt_match,
diff --git a/drivers/watchdog/bcm_kona_wdt.c b/drivers/watchdog/bcm_kona_wdt.c
index 4249b47902bd..e2ad44816359 100644
--- a/drivers/watchdog/bcm_kona_wdt.c
+++ b/drivers/watchdog/bcm_kona_wdt.c
@@ -271,16 +271,10 @@ static struct watchdog_device bcm_kona_wdt_wdd = {
271 .timeout = SECWDOG_MAX_COUNT >> SECWDOG_DEFAULT_RESOLUTION, 271 .timeout = SECWDOG_MAX_COUNT >> SECWDOG_DEFAULT_RESOLUTION,
272}; 272};
273 273
274static void bcm_kona_wdt_shutdown(struct platform_device *pdev)
275{
276 bcm_kona_wdt_stop(&bcm_kona_wdt_wdd);
277}
278
279static int bcm_kona_wdt_probe(struct platform_device *pdev) 274static int bcm_kona_wdt_probe(struct platform_device *pdev)
280{ 275{
281 struct device *dev = &pdev->dev; 276 struct device *dev = &pdev->dev;
282 struct bcm_kona_wdt *wdt; 277 struct bcm_kona_wdt *wdt;
283 struct resource *res;
284 int ret; 278 int ret;
285 279
286 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL); 280 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
@@ -289,8 +283,7 @@ static int bcm_kona_wdt_probe(struct platform_device *pdev)
289 283
290 spin_lock_init(&wdt->lock); 284 spin_lock_init(&wdt->lock);
291 285
292 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 286 wdt->base = devm_platform_ioremap_resource(pdev, 0);
293 wdt->base = devm_ioremap_resource(dev, res);
294 if (IS_ERR(wdt->base)) 287 if (IS_ERR(wdt->base))
295 return -ENODEV; 288 return -ENODEV;
296 289
@@ -303,7 +296,7 @@ static int bcm_kona_wdt_probe(struct platform_device *pdev)
303 296
304 platform_set_drvdata(pdev, wdt); 297 platform_set_drvdata(pdev, wdt);
305 watchdog_set_drvdata(&bcm_kona_wdt_wdd, wdt); 298 watchdog_set_drvdata(&bcm_kona_wdt_wdd, wdt);
306 bcm_kona_wdt_wdd.parent = &pdev->dev; 299 bcm_kona_wdt_wdd.parent = dev;
307 300
308 ret = bcm_kona_wdt_set_timeout_reg(&bcm_kona_wdt_wdd, 0); 301 ret = bcm_kona_wdt_set_timeout_reg(&bcm_kona_wdt_wdd, 0);
309 if (ret) { 302 if (ret) {
@@ -311,7 +304,9 @@ static int bcm_kona_wdt_probe(struct platform_device *pdev)
311 return ret; 304 return ret;
312 } 305 }
313 306
314 ret = watchdog_register_device(&bcm_kona_wdt_wdd); 307 watchdog_stop_on_reboot(&bcm_kona_wdt_wdd);
308 watchdog_stop_on_unregister(&bcm_kona_wdt_wdd);
309 ret = devm_watchdog_register_device(dev, &bcm_kona_wdt_wdd);
315 if (ret) { 310 if (ret) {
316 dev_err(dev, "Failed to register watchdog device"); 311 dev_err(dev, "Failed to register watchdog device");
317 return ret; 312 return ret;
@@ -326,8 +321,6 @@ static int bcm_kona_wdt_probe(struct platform_device *pdev)
326static int bcm_kona_wdt_remove(struct platform_device *pdev) 321static int bcm_kona_wdt_remove(struct platform_device *pdev)
327{ 322{
328 bcm_kona_wdt_debug_exit(pdev); 323 bcm_kona_wdt_debug_exit(pdev);
329 bcm_kona_wdt_shutdown(pdev);
330 watchdog_unregister_device(&bcm_kona_wdt_wdd);
331 dev_dbg(&pdev->dev, "Watchdog driver disabled"); 324 dev_dbg(&pdev->dev, "Watchdog driver disabled");
332 325
333 return 0; 326 return 0;
@@ -346,7 +339,6 @@ static struct platform_driver bcm_kona_wdt_driver = {
346 }, 339 },
347 .probe = bcm_kona_wdt_probe, 340 .probe = bcm_kona_wdt_probe,
348 .remove = bcm_kona_wdt_remove, 341 .remove = bcm_kona_wdt_remove,
349 .shutdown = bcm_kona_wdt_shutdown,
350}; 342};
351 343
352module_platform_driver(bcm_kona_wdt_driver); 344module_platform_driver(bcm_kona_wdt_driver);
diff --git a/drivers/watchdog/bd70528_wdt.c b/drivers/watchdog/bd70528_wdt.c
new file mode 100644
index 000000000000..b0152fef4fc7
--- /dev/null
+++ b/drivers/watchdog/bd70528_wdt.c
@@ -0,0 +1,290 @@
1// SPDX-License-Identifier: GPL-2.0
2// Copyright (C) 2018 ROHM Semiconductors
3// ROHM BD70528MWV watchdog driver
4
5#include <linux/bcd.h>
6#include <linux/kernel.h>
7#include <linux/mfd/rohm-bd70528.h>
8#include <linux/module.h>
9#include <linux/of.h>
10#include <linux/platform_device.h>
11#include <linux/regmap.h>
12#include <linux/watchdog.h>
13
14/*
15 * Max time we can set is 1 hour, 59 minutes and 59 seconds
16 * and Minimum time is 1 second
17 */
18#define WDT_MAX_MS ((2 * 60 * 60 - 1) * 1000)
19#define WDT_MIN_MS 1000
20#define DEFAULT_TIMEOUT 60
21
22#define WD_CTRL_MAGIC1 0x55
23#define WD_CTRL_MAGIC2 0xAA
24
25struct wdtbd70528 {
26 struct device *dev;
27 struct regmap *regmap;
28 struct rohm_regmap_dev *mfd;
29 struct watchdog_device wdt;
30};
31
32/**
33 * bd70528_wdt_set - arm or disarm watchdog timer
34 *
35 * @data: device data for the PMIC instance we want to operate on
36 * @enable: new state of WDT. zero to disable, non zero to enable
37 * @old_state: previous state of WDT will be filled here
38 *
39 * Arm or disarm WDT on BD70528 PMIC. Expected to be called only by
40 * BD70528 RTC and BD70528 WDT drivers. The rtc_timer_lock must be taken
41 * by calling bd70528_wdt_lock before calling bd70528_wdt_set.
42 */
43int bd70528_wdt_set(struct rohm_regmap_dev *data, int enable, int *old_state)
44{
45 int ret, i;
46 unsigned int tmp;
47 struct bd70528_data *bd70528 = container_of(data, struct bd70528_data,
48 chip);
49 u8 wd_ctrl_arr[3] = { WD_CTRL_MAGIC1, WD_CTRL_MAGIC2, 0 };
50 u8 *wd_ctrl = &wd_ctrl_arr[2];
51
52 ret = regmap_read(bd70528->chip.regmap, BD70528_REG_WDT_CTRL, &tmp);
53 if (ret)
54 return ret;
55
56 *wd_ctrl = (u8)tmp;
57
58 if (old_state) {
59 if (*wd_ctrl & BD70528_MASK_WDT_EN)
60 *old_state |= BD70528_WDT_STATE_BIT;
61 else
62 *old_state &= ~BD70528_WDT_STATE_BIT;
63 if ((!enable) == (!(*old_state & BD70528_WDT_STATE_BIT)))
64 return 0;
65 }
66
67 if (enable) {
68 if (*wd_ctrl & BD70528_MASK_WDT_EN)
69 return 0;
70 *wd_ctrl |= BD70528_MASK_WDT_EN;
71 } else {
72 if (*wd_ctrl & BD70528_MASK_WDT_EN)
73 *wd_ctrl &= ~BD70528_MASK_WDT_EN;
74 else
75 return 0;
76 }
77
78 for (i = 0; i < 3; i++) {
79 ret = regmap_write(bd70528->chip.regmap, BD70528_REG_WDT_CTRL,
80 wd_ctrl_arr[i]);
81 if (ret)
82 return ret;
83 }
84
85 ret = regmap_read(bd70528->chip.regmap, BD70528_REG_WDT_CTRL, &tmp);
86 if ((tmp & BD70528_MASK_WDT_EN) != (*wd_ctrl & BD70528_MASK_WDT_EN)) {
87 dev_err(bd70528->chip.dev,
88 "Watchdog ctrl mismatch (hw) 0x%x (set) 0x%x\n",
89 tmp, *wd_ctrl);
90 ret = -EIO;
91 }
92
93 return ret;
94}
95EXPORT_SYMBOL(bd70528_wdt_set);
96
97/**
98 * bd70528_wdt_lock - take WDT lock
99 *
100 * @bd70528: device data for the PMIC instance we want to operate on
101 *
102 * Lock WDT for arming/disarming in order to avoid race condition caused
103 * by WDT state changes initiated by WDT and RTC drivers.
104 */
105void bd70528_wdt_lock(struct rohm_regmap_dev *data)
106{
107 struct bd70528_data *bd70528 = container_of(data, struct bd70528_data,
108 chip);
109
110 mutex_lock(&bd70528->rtc_timer_lock);
111}
112EXPORT_SYMBOL(bd70528_wdt_lock);
113
114/**
115 * bd70528_wdt_unlock - unlock WDT lock
116 *
117 * @bd70528: device data for the PMIC instance we want to operate on
118 *
119 * Unlock WDT lock which has previously been taken by call to
120 * bd70528_wdt_lock.
121 */
122void bd70528_wdt_unlock(struct rohm_regmap_dev *data)
123{
124 struct bd70528_data *bd70528 = container_of(data, struct bd70528_data,
125 chip);
126
127 mutex_unlock(&bd70528->rtc_timer_lock);
128}
129EXPORT_SYMBOL(bd70528_wdt_unlock);
130
131static int bd70528_wdt_set_locked(struct wdtbd70528 *w, int enable)
132{
133 return bd70528_wdt_set(w->mfd, enable, NULL);
134}
135
136static int bd70528_wdt_change(struct wdtbd70528 *w, int enable)
137{
138 int ret;
139
140 bd70528_wdt_lock(w->mfd);
141 ret = bd70528_wdt_set_locked(w, enable);
142 bd70528_wdt_unlock(w->mfd);
143
144 return ret;
145}
146
147static int bd70528_wdt_start(struct watchdog_device *wdt)
148{
149 struct wdtbd70528 *w = watchdog_get_drvdata(wdt);
150
151 dev_dbg(w->dev, "WDT ping...\n");
152 return bd70528_wdt_change(w, 1);
153}
154
155static int bd70528_wdt_stop(struct watchdog_device *wdt)
156{
157 struct wdtbd70528 *w = watchdog_get_drvdata(wdt);
158
159 dev_dbg(w->dev, "WDT stopping...\n");
160 return bd70528_wdt_change(w, 0);
161}
162
163static int bd70528_wdt_set_timeout(struct watchdog_device *wdt,
164 unsigned int timeout)
165{
166 unsigned int hours;
167 unsigned int minutes;
168 unsigned int seconds;
169 int ret;
170 struct wdtbd70528 *w = watchdog_get_drvdata(wdt);
171
172 seconds = timeout;
173 hours = timeout / (60 * 60);
174 /* Maximum timeout is 1h 59m 59s => hours is 1 or 0 */
175 if (hours)
176 seconds -= (60 * 60);
177 minutes = seconds / 60;
178 seconds = seconds % 60;
179
180 bd70528_wdt_lock(w->mfd);
181
182 ret = bd70528_wdt_set_locked(w, 0);
183 if (ret)
184 goto out_unlock;
185
186 ret = regmap_update_bits(w->regmap, BD70528_REG_WDT_HOUR,
187 BD70528_MASK_WDT_HOUR, hours);
188 if (ret) {
189 dev_err(w->dev, "Failed to set WDT hours\n");
190 goto out_en_unlock;
191 }
192 ret = regmap_update_bits(w->regmap, BD70528_REG_WDT_MINUTE,
193 BD70528_MASK_WDT_MINUTE, bin2bcd(minutes));
194 if (ret) {
195 dev_err(w->dev, "Failed to set WDT minutes\n");
196 goto out_en_unlock;
197 }
198 ret = regmap_update_bits(w->regmap, BD70528_REG_WDT_SEC,
199 BD70528_MASK_WDT_SEC, bin2bcd(seconds));
200 if (ret)
201 dev_err(w->dev, "Failed to set WDT seconds\n");
202 else
203 dev_dbg(w->dev, "WDT tmo set to %u\n", timeout);
204
205out_en_unlock:
206 ret = bd70528_wdt_set_locked(w, 1);
207out_unlock:
208 bd70528_wdt_unlock(w->mfd);
209
210 return ret;
211}
212
213static const struct watchdog_info bd70528_wdt_info = {
214 .identity = "bd70528-wdt",
215 .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
216};
217
218static const struct watchdog_ops bd70528_wdt_ops = {
219 .start = bd70528_wdt_start,
220 .stop = bd70528_wdt_stop,
221 .set_timeout = bd70528_wdt_set_timeout,
222};
223
224static int bd70528_wdt_probe(struct platform_device *pdev)
225{
226 struct rohm_regmap_dev *bd70528;
227 struct wdtbd70528 *w;
228 int ret;
229 unsigned int reg;
230
231 bd70528 = dev_get_drvdata(pdev->dev.parent);
232 if (!bd70528) {
233 dev_err(&pdev->dev, "No MFD driver data\n");
234 return -EINVAL;
235 }
236 w = devm_kzalloc(&pdev->dev, sizeof(*w), GFP_KERNEL);
237 if (!w)
238 return -ENOMEM;
239
240 w->regmap = bd70528->regmap;
241 w->mfd = bd70528;
242 w->dev = &pdev->dev;
243
244 w->wdt.info = &bd70528_wdt_info;
245 w->wdt.ops = &bd70528_wdt_ops;
246 w->wdt.min_hw_heartbeat_ms = WDT_MIN_MS;
247 w->wdt.max_hw_heartbeat_ms = WDT_MAX_MS;
248 w->wdt.parent = pdev->dev.parent;
249 w->wdt.timeout = DEFAULT_TIMEOUT;
250 watchdog_set_drvdata(&w->wdt, w);
251 watchdog_init_timeout(&w->wdt, 0, pdev->dev.parent);
252
253 ret = bd70528_wdt_set_timeout(&w->wdt, w->wdt.timeout);
254 if (ret) {
255 dev_err(&pdev->dev, "Failed to set the watchdog timeout\n");
256 return ret;
257 }
258
259 bd70528_wdt_lock(w->mfd);
260 ret = regmap_read(w->regmap, BD70528_REG_WDT_CTRL, &reg);
261 bd70528_wdt_unlock(w->mfd);
262
263 if (ret) {
264 dev_err(&pdev->dev, "Failed to get the watchdog state\n");
265 return ret;
266 }
267 if (reg & BD70528_MASK_WDT_EN) {
268 dev_dbg(&pdev->dev, "watchdog was running during probe\n");
269 set_bit(WDOG_HW_RUNNING, &w->wdt.status);
270 }
271
272 ret = devm_watchdog_register_device(&pdev->dev, &w->wdt);
273 if (ret < 0)
274 dev_err(&pdev->dev, "watchdog registration failed: %d\n", ret);
275
276 return ret;
277}
278
279static struct platform_driver bd70528_wdt = {
280 .driver = {
281 .name = "bd70528-wdt"
282 },
283 .probe = bd70528_wdt_probe,
284};
285
286module_platform_driver(bd70528_wdt);
287
288MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
289MODULE_DESCRIPTION("BD70528 watchdog driver");
290MODULE_LICENSE("GPL");
diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c
index c3924356d173..a22f2d431a35 100644
--- a/drivers/watchdog/cadence_wdt.c
+++ b/drivers/watchdog/cadence_wdt.c
@@ -274,6 +274,11 @@ static const struct watchdog_ops cdns_wdt_ops = {
274 .set_timeout = cdns_wdt_settimeout, 274 .set_timeout = cdns_wdt_settimeout,
275}; 275};
276 276
277static void cdns_clk_disable_unprepare(void *data)
278{
279 clk_disable_unprepare(data);
280}
281
277/************************Platform Operations*****************************/ 282/************************Platform Operations*****************************/
278/** 283/**
279 * cdns_wdt_probe - Probe call for the device. 284 * cdns_wdt_probe - Probe call for the device.
@@ -285,13 +290,13 @@ static const struct watchdog_ops cdns_wdt_ops = {
285 */ 290 */
286static int cdns_wdt_probe(struct platform_device *pdev) 291static int cdns_wdt_probe(struct platform_device *pdev)
287{ 292{
288 struct resource *res; 293 struct device *dev = &pdev->dev;
289 int ret, irq; 294 int ret, irq;
290 unsigned long clock_f; 295 unsigned long clock_f;
291 struct cdns_wdt *wdt; 296 struct cdns_wdt *wdt;
292 struct watchdog_device *cdns_wdt_device; 297 struct watchdog_device *cdns_wdt_device;
293 298
294 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 299 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
295 if (!wdt) 300 if (!wdt)
296 return -ENOMEM; 301 return -ENOMEM;
297 302
@@ -302,19 +307,18 @@ static int cdns_wdt_probe(struct platform_device *pdev)
302 cdns_wdt_device->min_timeout = CDNS_WDT_MIN_TIMEOUT; 307 cdns_wdt_device->min_timeout = CDNS_WDT_MIN_TIMEOUT;
303 cdns_wdt_device->max_timeout = CDNS_WDT_MAX_TIMEOUT; 308 cdns_wdt_device->max_timeout = CDNS_WDT_MAX_TIMEOUT;
304 309
305 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 310 wdt->regs = devm_platform_ioremap_resource(pdev, 0);
306 wdt->regs = devm_ioremap_resource(&pdev->dev, res);
307 if (IS_ERR(wdt->regs)) 311 if (IS_ERR(wdt->regs))
308 return PTR_ERR(wdt->regs); 312 return PTR_ERR(wdt->regs);
309 313
310 /* Register the interrupt */ 314 /* Register the interrupt */
311 wdt->rst = of_property_read_bool(pdev->dev.of_node, "reset-on-timeout"); 315 wdt->rst = of_property_read_bool(dev->of_node, "reset-on-timeout");
312 irq = platform_get_irq(pdev, 0); 316 irq = platform_get_irq(pdev, 0);
313 if (!wdt->rst && irq >= 0) { 317 if (!wdt->rst && irq >= 0) {
314 ret = devm_request_irq(&pdev->dev, irq, cdns_wdt_irq_handler, 0, 318 ret = devm_request_irq(dev, irq, cdns_wdt_irq_handler, 0,
315 pdev->name, pdev); 319 pdev->name, pdev);
316 if (ret) { 320 if (ret) {
317 dev_err(&pdev->dev, 321 dev_err(dev,
318 "cannot register interrupt handler err=%d\n", 322 "cannot register interrupt handler err=%d\n",
319 ret); 323 ret);
320 return ret; 324 return ret;
@@ -322,30 +326,28 @@ static int cdns_wdt_probe(struct platform_device *pdev)
322 } 326 }
323 327
324 /* Initialize the members of cdns_wdt structure */ 328 /* Initialize the members of cdns_wdt structure */
325 cdns_wdt_device->parent = &pdev->dev; 329 cdns_wdt_device->parent = dev;
326
327 ret = watchdog_init_timeout(cdns_wdt_device, wdt_timeout, &pdev->dev);
328 if (ret) {
329 dev_err(&pdev->dev, "unable to set timeout value\n");
330 return ret;
331 }
332 330
331 watchdog_init_timeout(cdns_wdt_device, wdt_timeout, dev);
333 watchdog_set_nowayout(cdns_wdt_device, nowayout); 332 watchdog_set_nowayout(cdns_wdt_device, nowayout);
334 watchdog_stop_on_reboot(cdns_wdt_device); 333 watchdog_stop_on_reboot(cdns_wdt_device);
335 watchdog_set_drvdata(cdns_wdt_device, wdt); 334 watchdog_set_drvdata(cdns_wdt_device, wdt);
336 335
337 wdt->clk = devm_clk_get(&pdev->dev, NULL); 336 wdt->clk = devm_clk_get(dev, NULL);
338 if (IS_ERR(wdt->clk)) { 337 if (IS_ERR(wdt->clk)) {
339 dev_err(&pdev->dev, "input clock not found\n"); 338 dev_err(dev, "input clock not found\n");
340 ret = PTR_ERR(wdt->clk); 339 return PTR_ERR(wdt->clk);
341 return ret;
342 } 340 }
343 341
344 ret = clk_prepare_enable(wdt->clk); 342 ret = clk_prepare_enable(wdt->clk);
345 if (ret) { 343 if (ret) {
346 dev_err(&pdev->dev, "unable to enable clock\n"); 344 dev_err(dev, "unable to enable clock\n");
347 return ret; 345 return ret;
348 } 346 }
347 ret = devm_add_action_or_reset(dev, cdns_clk_disable_unprepare,
348 wdt->clk);
349 if (ret)
350 return ret;
349 351
350 clock_f = clk_get_rate(wdt->clk); 352 clock_f = clk_get_rate(wdt->clk);
351 if (clock_f <= CDNS_WDT_CLK_75MHZ) { 353 if (clock_f <= CDNS_WDT_CLK_75MHZ) {
@@ -358,56 +360,20 @@ static int cdns_wdt_probe(struct platform_device *pdev)
358 360
359 spin_lock_init(&wdt->io_lock); 361 spin_lock_init(&wdt->io_lock);
360 362
361 ret = watchdog_register_device(cdns_wdt_device); 363 watchdog_stop_on_reboot(cdns_wdt_device);
364 watchdog_stop_on_unregister(cdns_wdt_device);
365 ret = devm_watchdog_register_device(dev, cdns_wdt_device);
362 if (ret) { 366 if (ret) {
363 dev_err(&pdev->dev, "Failed to register wdt device\n"); 367 dev_err(dev, "Failed to register wdt device\n");
364 goto err_clk_disable; 368 return ret;
365 } 369 }
366 platform_set_drvdata(pdev, wdt); 370 platform_set_drvdata(pdev, wdt);
367 371
368 dev_info(&pdev->dev, "Xilinx Watchdog Timer at %p with timeout %ds%s\n", 372 dev_info(dev, "Xilinx Watchdog Timer at %p with timeout %ds%s\n",
369 wdt->regs, cdns_wdt_device->timeout, 373 wdt->regs, cdns_wdt_device->timeout,
370 nowayout ? ", nowayout" : ""); 374 nowayout ? ", nowayout" : "");
371 375
372 return 0; 376 return 0;
373
374err_clk_disable:
375 clk_disable_unprepare(wdt->clk);
376
377 return ret;
378}
379
380/**
381 * cdns_wdt_remove - Probe call for the device.
382 *
383 * @pdev: handle to the platform device structure.
384 * Return: 0 on success, otherwise negative error.
385 *
386 * Unregister the device after releasing the resources.
387 */
388static int cdns_wdt_remove(struct platform_device *pdev)
389{
390 struct cdns_wdt *wdt = platform_get_drvdata(pdev);
391
392 cdns_wdt_stop(&wdt->cdns_wdt_device);
393 watchdog_unregister_device(&wdt->cdns_wdt_device);
394 clk_disable_unprepare(wdt->clk);
395
396 return 0;
397}
398
399/**
400 * cdns_wdt_shutdown - Stop the device.
401 *
402 * @pdev: handle to the platform structure.
403 *
404 */
405static void cdns_wdt_shutdown(struct platform_device *pdev)
406{
407 struct cdns_wdt *wdt = platform_get_drvdata(pdev);
408
409 cdns_wdt_stop(&wdt->cdns_wdt_device);
410 clk_disable_unprepare(wdt->clk);
411} 377}
412 378
413/** 379/**
@@ -462,8 +428,6 @@ MODULE_DEVICE_TABLE(of, cdns_wdt_of_match);
462/* Driver Structure */ 428/* Driver Structure */
463static struct platform_driver cdns_wdt_driver = { 429static struct platform_driver cdns_wdt_driver = {
464 .probe = cdns_wdt_probe, 430 .probe = cdns_wdt_probe,
465 .remove = cdns_wdt_remove,
466 .shutdown = cdns_wdt_shutdown,
467 .driver = { 431 .driver = {
468 .name = "cdns-wdt", 432 .name = "cdns-wdt",
469 .of_match_table = cdns_wdt_of_match, 433 .of_match_table = cdns_wdt_of_match,
diff --git a/drivers/watchdog/coh901327_wdt.c b/drivers/watchdog/coh901327_wdt.c
index f29d1edc5bad..260c50b08483 100644
--- a/drivers/watchdog/coh901327_wdt.c
+++ b/drivers/watchdog/coh901327_wdt.c
@@ -6,7 +6,7 @@
6 * Watchdog driver for the ST-Ericsson AB COH 901 327 IP core 6 * Watchdog driver for the ST-Ericsson AB COH 901 327 IP core
7 * Author: Linus Walleij <linus.walleij@stericsson.com> 7 * Author: Linus Walleij <linus.walleij@stericsson.com>
8 */ 8 */
9#include <linux/module.h> 9#include <linux/moduleparam.h>
10#include <linux/mod_devicetable.h> 10#include <linux/mod_devicetable.h>
11#include <linux/types.h> 11#include <linux/types.h>
12#include <linux/watchdog.h> 12#include <linux/watchdog.h>
@@ -243,27 +243,15 @@ static struct watchdog_device coh901327_wdt = {
243 .timeout = U300_WDOG_DEFAULT_TIMEOUT, 243 .timeout = U300_WDOG_DEFAULT_TIMEOUT,
244}; 244};
245 245
246static int __exit coh901327_remove(struct platform_device *pdev)
247{
248 watchdog_unregister_device(&coh901327_wdt);
249 coh901327_disable();
250 free_irq(irq, pdev);
251 clk_disable_unprepare(clk);
252 clk_put(clk);
253 return 0;
254}
255
256static int __init coh901327_probe(struct platform_device *pdev) 246static int __init coh901327_probe(struct platform_device *pdev)
257{ 247{
258 struct device *dev = &pdev->dev; 248 struct device *dev = &pdev->dev;
259 int ret; 249 int ret;
260 u16 val; 250 u16 val;
261 struct resource *res;
262 251
263 parent = dev; 252 parent = dev;
264 253
265 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 254 virtbase = devm_platform_ioremap_resource(pdev, 0);
266 virtbase = devm_ioremap_resource(dev, res);
267 if (IS_ERR(virtbase)) 255 if (IS_ERR(virtbase))
268 return PTR_ERR(virtbase); 256 return PTR_ERR(virtbase);
269 257
@@ -408,19 +396,13 @@ static struct platform_driver coh901327_driver = {
408 .driver = { 396 .driver = {
409 .name = "coh901327_wdog", 397 .name = "coh901327_wdog",
410 .of_match_table = coh901327_dt_match, 398 .of_match_table = coh901327_dt_match,
399 .suppress_bind_attrs = true,
411 }, 400 },
412 .remove = __exit_p(coh901327_remove),
413 .suspend = coh901327_suspend, 401 .suspend = coh901327_suspend,
414 .resume = coh901327_resume, 402 .resume = coh901327_resume,
415}; 403};
404builtin_platform_driver_probe(coh901327_driver, coh901327_probe);
416 405
417module_platform_driver_probe(coh901327_driver, coh901327_probe); 406/* not really modular, but ... */
418
419MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>");
420MODULE_DESCRIPTION("COH 901 327 Watchdog");
421
422module_param(margin, uint, 0); 407module_param(margin, uint, 0);
423MODULE_PARM_DESC(margin, "Watchdog margin in seconds (default 60s)"); 408MODULE_PARM_DESC(margin, "Watchdog margin in seconds (default 60s)");
424
425MODULE_LICENSE("GPL v2");
426MODULE_ALIAS("platform:coh901327-watchdog");
diff --git a/drivers/watchdog/da9052_wdt.c b/drivers/watchdog/da9052_wdt.c
index e263bad99574..a2feef1ff307 100644
--- a/drivers/watchdog/da9052_wdt.c
+++ b/drivers/watchdog/da9052_wdt.c
@@ -150,13 +150,13 @@ static const struct watchdog_ops da9052_wdt_ops = {
150 150
151static int da9052_wdt_probe(struct platform_device *pdev) 151static int da9052_wdt_probe(struct platform_device *pdev)
152{ 152{
153 struct da9052 *da9052 = dev_get_drvdata(pdev->dev.parent); 153 struct device *dev = &pdev->dev;
154 struct da9052 *da9052 = dev_get_drvdata(dev->parent);
154 struct da9052_wdt_data *driver_data; 155 struct da9052_wdt_data *driver_data;
155 struct watchdog_device *da9052_wdt; 156 struct watchdog_device *da9052_wdt;
156 int ret; 157 int ret;
157 158
158 driver_data = devm_kzalloc(&pdev->dev, sizeof(*driver_data), 159 driver_data = devm_kzalloc(dev, sizeof(*driver_data), GFP_KERNEL);
159 GFP_KERNEL);
160 if (!driver_data) 160 if (!driver_data)
161 return -ENOMEM; 161 return -ENOMEM;
162 driver_data->da9052 = da9052; 162 driver_data->da9052 = da9052;
@@ -166,18 +166,17 @@ static int da9052_wdt_probe(struct platform_device *pdev)
166 da9052_wdt->timeout = DA9052_DEF_TIMEOUT; 166 da9052_wdt->timeout = DA9052_DEF_TIMEOUT;
167 da9052_wdt->info = &da9052_wdt_info; 167 da9052_wdt->info = &da9052_wdt_info;
168 da9052_wdt->ops = &da9052_wdt_ops; 168 da9052_wdt->ops = &da9052_wdt_ops;
169 da9052_wdt->parent = &pdev->dev; 169 da9052_wdt->parent = dev;
170 watchdog_set_drvdata(da9052_wdt, driver_data); 170 watchdog_set_drvdata(da9052_wdt, driver_data);
171 171
172 ret = da9052_reg_update(da9052, DA9052_CONTROL_D_REG, 172 ret = da9052_reg_update(da9052, DA9052_CONTROL_D_REG,
173 DA9052_CONTROLD_TWDSCALE, 0); 173 DA9052_CONTROLD_TWDSCALE, 0);
174 if (ret < 0) { 174 if (ret < 0) {
175 dev_err(&pdev->dev, "Failed to disable watchdog bits, %d\n", 175 dev_err(dev, "Failed to disable watchdog bits, %d\n", ret);
176 ret);
177 return ret; 176 return ret;
178 } 177 }
179 178
180 ret = devm_watchdog_register_device(&pdev->dev, &driver_data->wdt); 179 ret = devm_watchdog_register_device(dev, &driver_data->wdt);
181 if (ret != 0) { 180 if (ret != 0) {
182 dev_err(da9052->dev, "watchdog_register_device() failed: %d\n", 181 dev_err(da9052->dev, "watchdog_register_device() failed: %d\n",
183 ret); 182 ret);
diff --git a/drivers/watchdog/da9055_wdt.c b/drivers/watchdog/da9055_wdt.c
index 26a5b2984094..389a4bdd208c 100644
--- a/drivers/watchdog/da9055_wdt.c
+++ b/drivers/watchdog/da9055_wdt.c
@@ -119,13 +119,13 @@ static const struct watchdog_ops da9055_wdt_ops = {
119 119
120static int da9055_wdt_probe(struct platform_device *pdev) 120static int da9055_wdt_probe(struct platform_device *pdev)
121{ 121{
122 struct da9055 *da9055 = dev_get_drvdata(pdev->dev.parent); 122 struct device *dev = &pdev->dev;
123 struct da9055 *da9055 = dev_get_drvdata(dev->parent);
123 struct da9055_wdt_data *driver_data; 124 struct da9055_wdt_data *driver_data;
124 struct watchdog_device *da9055_wdt; 125 struct watchdog_device *da9055_wdt;
125 int ret; 126 int ret;
126 127
127 driver_data = devm_kzalloc(&pdev->dev, sizeof(*driver_data), 128 driver_data = devm_kzalloc(dev, sizeof(*driver_data), GFP_KERNEL);
128 GFP_KERNEL);
129 if (!driver_data) 129 if (!driver_data)
130 return -ENOMEM; 130 return -ENOMEM;
131 131
@@ -136,17 +136,17 @@ static int da9055_wdt_probe(struct platform_device *pdev)
136 da9055_wdt->timeout = DA9055_DEF_TIMEOUT; 136 da9055_wdt->timeout = DA9055_DEF_TIMEOUT;
137 da9055_wdt->info = &da9055_wdt_info; 137 da9055_wdt->info = &da9055_wdt_info;
138 da9055_wdt->ops = &da9055_wdt_ops; 138 da9055_wdt->ops = &da9055_wdt_ops;
139 da9055_wdt->parent = &pdev->dev; 139 da9055_wdt->parent = dev;
140 watchdog_set_nowayout(da9055_wdt, nowayout); 140 watchdog_set_nowayout(da9055_wdt, nowayout);
141 watchdog_set_drvdata(da9055_wdt, driver_data); 141 watchdog_set_drvdata(da9055_wdt, driver_data);
142 142
143 ret = da9055_wdt_stop(da9055_wdt); 143 ret = da9055_wdt_stop(da9055_wdt);
144 if (ret < 0) { 144 if (ret < 0) {
145 dev_err(&pdev->dev, "Failed to stop watchdog, %d\n", ret); 145 dev_err(dev, "Failed to stop watchdog, %d\n", ret);
146 return ret; 146 return ret;
147 } 147 }
148 148
149 ret = devm_watchdog_register_device(&pdev->dev, &driver_data->wdt); 149 ret = devm_watchdog_register_device(dev, &driver_data->wdt);
150 if (ret != 0) 150 if (ret != 0)
151 dev_err(da9055->dev, "watchdog_register_device() failed: %d\n", 151 dev_err(da9055->dev, "watchdog_register_device() failed: %d\n",
152 ret); 152 ret);
diff --git a/drivers/watchdog/da9062_wdt.c b/drivers/watchdog/da9062_wdt.c
index fe169d8e1fb2..aac749cfaccb 100644
--- a/drivers/watchdog/da9062_wdt.c
+++ b/drivers/watchdog/da9062_wdt.c
@@ -46,14 +46,9 @@ static unsigned int da9062_wdt_timeout_to_sel(unsigned int secs)
46 46
47static int da9062_reset_watchdog_timer(struct da9062_watchdog *wdt) 47static int da9062_reset_watchdog_timer(struct da9062_watchdog *wdt)
48{ 48{
49 int ret; 49 return regmap_update_bits(wdt->hw->regmap, DA9062AA_CONTROL_F,
50 50 DA9062AA_WATCHDOG_MASK,
51 ret = regmap_update_bits(wdt->hw->regmap, 51 DA9062AA_WATCHDOG_MASK);
52 DA9062AA_CONTROL_F,
53 DA9062AA_WATCHDOG_MASK,
54 DA9062AA_WATCHDOG_MASK);
55
56 return ret;
57} 52}
58 53
59static int da9062_wdt_update_timeout_register(struct da9062_watchdog *wdt, 54static int da9062_wdt_update_timeout_register(struct da9062_watchdog *wdt,
@@ -190,15 +185,16 @@ MODULE_DEVICE_TABLE(of, da9062_compatible_id_table);
190 185
191static int da9062_wdt_probe(struct platform_device *pdev) 186static int da9062_wdt_probe(struct platform_device *pdev)
192{ 187{
188 struct device *dev = &pdev->dev;
193 int ret; 189 int ret;
194 struct da9062 *chip; 190 struct da9062 *chip;
195 struct da9062_watchdog *wdt; 191 struct da9062_watchdog *wdt;
196 192
197 chip = dev_get_drvdata(pdev->dev.parent); 193 chip = dev_get_drvdata(dev->parent);
198 if (!chip) 194 if (!chip)
199 return -EINVAL; 195 return -EINVAL;
200 196
201 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 197 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
202 if (!wdt) 198 if (!wdt)
203 return -ENOMEM; 199 return -ENOMEM;
204 200
@@ -211,13 +207,13 @@ static int da9062_wdt_probe(struct platform_device *pdev)
211 wdt->wdtdev.min_hw_heartbeat_ms = DA9062_RESET_PROTECTION_MS; 207 wdt->wdtdev.min_hw_heartbeat_ms = DA9062_RESET_PROTECTION_MS;
212 wdt->wdtdev.timeout = DA9062_WDG_DEFAULT_TIMEOUT; 208 wdt->wdtdev.timeout = DA9062_WDG_DEFAULT_TIMEOUT;
213 wdt->wdtdev.status = WATCHDOG_NOWAYOUT_INIT_STATUS; 209 wdt->wdtdev.status = WATCHDOG_NOWAYOUT_INIT_STATUS;
214 wdt->wdtdev.parent = &pdev->dev; 210 wdt->wdtdev.parent = dev;
215 211
216 watchdog_set_restart_priority(&wdt->wdtdev, 128); 212 watchdog_set_restart_priority(&wdt->wdtdev, 128);
217 213
218 watchdog_set_drvdata(&wdt->wdtdev, wdt); 214 watchdog_set_drvdata(&wdt->wdtdev, wdt);
219 215
220 ret = devm_watchdog_register_device(&pdev->dev, &wdt->wdtdev); 216 ret = devm_watchdog_register_device(dev, &wdt->wdtdev);
221 if (ret < 0) { 217 if (ret < 0) {
222 dev_err(wdt->hw->dev, 218 dev_err(wdt->hw->dev,
223 "watchdog registration failed (%d)\n", ret); 219 "watchdog registration failed (%d)\n", ret);
diff --git a/drivers/watchdog/da9063_wdt.c b/drivers/watchdog/da9063_wdt.c
index 384dca16af8b..3d65e92a4e3f 100644
--- a/drivers/watchdog/da9063_wdt.c
+++ b/drivers/watchdog/da9063_wdt.c
@@ -188,17 +188,18 @@ static const struct watchdog_ops da9063_watchdog_ops = {
188 188
189static int da9063_wdt_probe(struct platform_device *pdev) 189static int da9063_wdt_probe(struct platform_device *pdev)
190{ 190{
191 struct device *dev = &pdev->dev;
191 struct da9063 *da9063; 192 struct da9063 *da9063;
192 struct watchdog_device *wdd; 193 struct watchdog_device *wdd;
193 194
194 if (!pdev->dev.parent) 195 if (!dev->parent)
195 return -EINVAL; 196 return -EINVAL;
196 197
197 da9063 = dev_get_drvdata(pdev->dev.parent); 198 da9063 = dev_get_drvdata(dev->parent);
198 if (!da9063) 199 if (!da9063)
199 return -EINVAL; 200 return -EINVAL;
200 201
201 wdd = devm_kzalloc(&pdev->dev, sizeof(*wdd), GFP_KERNEL); 202 wdd = devm_kzalloc(dev, sizeof(*wdd), GFP_KERNEL);
202 if (!wdd) 203 if (!wdd)
203 return -ENOMEM; 204 return -ENOMEM;
204 205
@@ -207,22 +208,24 @@ static int da9063_wdt_probe(struct platform_device *pdev)
207 wdd->min_timeout = DA9063_WDT_MIN_TIMEOUT; 208 wdd->min_timeout = DA9063_WDT_MIN_TIMEOUT;
208 wdd->max_timeout = DA9063_WDT_MAX_TIMEOUT; 209 wdd->max_timeout = DA9063_WDT_MAX_TIMEOUT;
209 wdd->min_hw_heartbeat_ms = DA9063_RESET_PROTECTION_MS; 210 wdd->min_hw_heartbeat_ms = DA9063_RESET_PROTECTION_MS;
210 wdd->timeout = DA9063_WDG_TIMEOUT; 211 wdd->parent = dev;
211 wdd->parent = &pdev->dev;
212
213 wdd->status = WATCHDOG_NOWAYOUT_INIT_STATUS; 212 wdd->status = WATCHDOG_NOWAYOUT_INIT_STATUS;
214 213
215 watchdog_set_restart_priority(wdd, 128); 214 watchdog_set_restart_priority(wdd, 128);
216
217 watchdog_set_drvdata(wdd, da9063); 215 watchdog_set_drvdata(wdd, da9063);
218 216
217 /* Set default timeout, maybe override it with DT value, scale it */
218 wdd->timeout = DA9063_WDG_TIMEOUT;
219 watchdog_init_timeout(wdd, 0, dev);
220 da9063_wdt_set_timeout(wdd, wdd->timeout);
221
219 /* Change the timeout to the default value if the watchdog is running */ 222 /* Change the timeout to the default value if the watchdog is running */
220 if (da9063_wdt_is_running(da9063)) { 223 if (da9063_wdt_is_running(da9063)) {
221 da9063_wdt_update_timeout(da9063, DA9063_WDG_TIMEOUT); 224 da9063_wdt_update_timeout(da9063, wdd->timeout);
222 set_bit(WDOG_HW_RUNNING, &wdd->status); 225 set_bit(WDOG_HW_RUNNING, &wdd->status);
223 } 226 }
224 227
225 return devm_watchdog_register_device(&pdev->dev, wdd); 228 return devm_watchdog_register_device(dev, wdd);
226} 229}
227 230
228static struct platform_driver da9063_wdt_driver = { 231static struct platform_driver da9063_wdt_driver = {
diff --git a/drivers/watchdog/davinci_wdt.c b/drivers/watchdog/davinci_wdt.c
index ebb85d60b6d5..7b2ee35b5ffd 100644
--- a/drivers/watchdog/davinci_wdt.c
+++ b/drivers/watchdog/davinci_wdt.c
@@ -191,11 +191,15 @@ static const struct watchdog_ops davinci_wdt_ops = {
191 .restart = davinci_wdt_restart, 191 .restart = davinci_wdt_restart,
192}; 192};
193 193
194static void davinci_clk_disable_unprepare(void *data)
195{
196 clk_disable_unprepare(data);
197}
198
194static int davinci_wdt_probe(struct platform_device *pdev) 199static int davinci_wdt_probe(struct platform_device *pdev)
195{ 200{
196 int ret = 0; 201 int ret = 0;
197 struct device *dev = &pdev->dev; 202 struct device *dev = &pdev->dev;
198 struct resource *wdt_mem;
199 struct watchdog_device *wdd; 203 struct watchdog_device *wdd;
200 struct davinci_wdt_device *davinci_wdt; 204 struct davinci_wdt_device *davinci_wdt;
201 205
@@ -207,15 +211,19 @@ static int davinci_wdt_probe(struct platform_device *pdev)
207 211
208 if (IS_ERR(davinci_wdt->clk)) { 212 if (IS_ERR(davinci_wdt->clk)) {
209 if (PTR_ERR(davinci_wdt->clk) != -EPROBE_DEFER) 213 if (PTR_ERR(davinci_wdt->clk) != -EPROBE_DEFER)
210 dev_err(&pdev->dev, "failed to get clock node\n"); 214 dev_err(dev, "failed to get clock node\n");
211 return PTR_ERR(davinci_wdt->clk); 215 return PTR_ERR(davinci_wdt->clk);
212 } 216 }
213 217
214 ret = clk_prepare_enable(davinci_wdt->clk); 218 ret = clk_prepare_enable(davinci_wdt->clk);
215 if (ret) { 219 if (ret) {
216 dev_err(&pdev->dev, "failed to prepare clock\n"); 220 dev_err(dev, "failed to prepare clock\n");
217 return ret; 221 return ret;
218 } 222 }
223 ret = devm_add_action_or_reset(dev, davinci_clk_disable_unprepare,
224 davinci_wdt->clk);
225 if (ret)
226 return ret;
219 227
220 platform_set_drvdata(pdev, davinci_wdt); 228 platform_set_drvdata(pdev, davinci_wdt);
221 229
@@ -225,7 +233,7 @@ static int davinci_wdt_probe(struct platform_device *pdev)
225 wdd->min_timeout = 1; 233 wdd->min_timeout = 1;
226 wdd->max_timeout = MAX_HEARTBEAT; 234 wdd->max_timeout = MAX_HEARTBEAT;
227 wdd->timeout = DEFAULT_HEARTBEAT; 235 wdd->timeout = DEFAULT_HEARTBEAT;
228 wdd->parent = &pdev->dev; 236 wdd->parent = dev;
229 237
230 watchdog_init_timeout(wdd, heartbeat, dev); 238 watchdog_init_timeout(wdd, heartbeat, dev);
231 239
@@ -235,35 +243,17 @@ static int davinci_wdt_probe(struct platform_device *pdev)
235 watchdog_set_nowayout(wdd, 1); 243 watchdog_set_nowayout(wdd, 1);
236 watchdog_set_restart_priority(wdd, 128); 244 watchdog_set_restart_priority(wdd, 128);
237 245
238 wdt_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 246 davinci_wdt->base = devm_platform_ioremap_resource(pdev, 0);
239 davinci_wdt->base = devm_ioremap_resource(dev, wdt_mem); 247 if (IS_ERR(davinci_wdt->base))
240 if (IS_ERR(davinci_wdt->base)) { 248 return PTR_ERR(davinci_wdt->base);
241 ret = PTR_ERR(davinci_wdt->base);
242 goto err_clk_disable;
243 }
244 249
245 ret = watchdog_register_device(wdd); 250 ret = devm_watchdog_register_device(dev, wdd);
246 if (ret) { 251 if (ret) {
247 dev_err(dev, "cannot register watchdog device\n"); 252 dev_err(dev, "cannot register watchdog device\n");
248 goto err_clk_disable; 253 return ret;
249 } 254 }
250 255
251 return 0; 256 return 0;
252
253err_clk_disable:
254 clk_disable_unprepare(davinci_wdt->clk);
255
256 return ret;
257}
258
259static int davinci_wdt_remove(struct platform_device *pdev)
260{
261 struct davinci_wdt_device *davinci_wdt = platform_get_drvdata(pdev);
262
263 watchdog_unregister_device(&davinci_wdt->wdd);
264 clk_disable_unprepare(davinci_wdt->clk);
265
266 return 0;
267} 257}
268 258
269static const struct of_device_id davinci_wdt_of_match[] = { 259static const struct of_device_id davinci_wdt_of_match[] = {
@@ -278,7 +268,6 @@ static struct platform_driver platform_wdt_driver = {
278 .of_match_table = davinci_wdt_of_match, 268 .of_match_table = davinci_wdt_of_match,
279 }, 269 },
280 .probe = davinci_wdt_probe, 270 .probe = davinci_wdt_probe,
281 .remove = davinci_wdt_remove,
282}; 271};
283 272
284module_platform_driver(platform_wdt_driver); 273module_platform_driver(platform_wdt_driver);
diff --git a/drivers/watchdog/digicolor_wdt.c b/drivers/watchdog/digicolor_wdt.c
index a9e11df155b8..8af6e9a67d0d 100644
--- a/drivers/watchdog/digicolor_wdt.c
+++ b/drivers/watchdog/digicolor_wdt.c
@@ -116,7 +116,6 @@ static struct watchdog_device dc_wdt_wdd = {
116 116
117static int dc_wdt_probe(struct platform_device *pdev) 117static int dc_wdt_probe(struct platform_device *pdev)
118{ 118{
119 struct resource *res;
120 struct device *dev = &pdev->dev; 119 struct device *dev = &pdev->dev;
121 struct dc_wdt *wdt; 120 struct dc_wdt *wdt;
122 int ret; 121 int ret;
@@ -125,8 +124,7 @@ static int dc_wdt_probe(struct platform_device *pdev)
125 if (!wdt) 124 if (!wdt)
126 return -ENOMEM; 125 return -ENOMEM;
127 126
128 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 127 wdt->base = devm_platform_ioremap_resource(pdev, 0);
129 wdt->base = devm_ioremap_resource(dev, res);
130 if (IS_ERR(wdt->base)) 128 if (IS_ERR(wdt->base))
131 return PTR_ERR(wdt->base); 129 return PTR_ERR(wdt->base);
132 130
diff --git a/drivers/watchdog/dw_wdt.c b/drivers/watchdog/dw_wdt.c
index aa95f57cc1c3..39e43750ab08 100644
--- a/drivers/watchdog/dw_wdt.c
+++ b/drivers/watchdog/dw_wdt.c
@@ -238,15 +238,13 @@ static int dw_wdt_drv_probe(struct platform_device *pdev)
238 struct device *dev = &pdev->dev; 238 struct device *dev = &pdev->dev;
239 struct watchdog_device *wdd; 239 struct watchdog_device *wdd;
240 struct dw_wdt *dw_wdt; 240 struct dw_wdt *dw_wdt;
241 struct resource *mem;
242 int ret; 241 int ret;
243 242
244 dw_wdt = devm_kzalloc(dev, sizeof(*dw_wdt), GFP_KERNEL); 243 dw_wdt = devm_kzalloc(dev, sizeof(*dw_wdt), GFP_KERNEL);
245 if (!dw_wdt) 244 if (!dw_wdt)
246 return -ENOMEM; 245 return -ENOMEM;
247 246
248 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 247 dw_wdt->regs = devm_platform_ioremap_resource(pdev, 0);
249 dw_wdt->regs = devm_ioremap_resource(dev, mem);
250 if (IS_ERR(dw_wdt->regs)) 248 if (IS_ERR(dw_wdt->regs))
251 return PTR_ERR(dw_wdt->regs); 249 return PTR_ERR(dw_wdt->regs);
252 250
diff --git a/drivers/watchdog/ebc-c384_wdt.c b/drivers/watchdog/ebc-c384_wdt.c
index 4c4c8ce78021..c176f59fea28 100644
--- a/drivers/watchdog/ebc-c384_wdt.c
+++ b/drivers/watchdog/ebc-c384_wdt.c
@@ -117,10 +117,7 @@ static int ebc_c384_wdt_probe(struct device *dev, unsigned int id)
117 wdd->max_timeout = WATCHDOG_MAX_TIMEOUT; 117 wdd->max_timeout = WATCHDOG_MAX_TIMEOUT;
118 118
119 watchdog_set_nowayout(wdd, nowayout); 119 watchdog_set_nowayout(wdd, nowayout);
120 120 watchdog_init_timeout(wdd, timeout, dev);
121 if (watchdog_init_timeout(wdd, timeout, dev))
122 dev_warn(dev, "Invalid timeout (%u seconds), using default (%u seconds)\n",
123 timeout, WATCHDOG_TIMEOUT);
124 121
125 return devm_watchdog_register_device(dev, wdd); 122 return devm_watchdog_register_device(dev, wdd);
126} 123}
diff --git a/drivers/watchdog/ep93xx_wdt.c b/drivers/watchdog/ep93xx_wdt.c
index f9b14e6efd9a..38e26f160b9a 100644
--- a/drivers/watchdog/ep93xx_wdt.c
+++ b/drivers/watchdog/ep93xx_wdt.c
@@ -89,18 +89,17 @@ static const struct watchdog_ops ep93xx_wdt_ops = {
89 89
90static int ep93xx_wdt_probe(struct platform_device *pdev) 90static int ep93xx_wdt_probe(struct platform_device *pdev)
91{ 91{
92 struct device *dev = &pdev->dev;
92 struct ep93xx_wdt_priv *priv; 93 struct ep93xx_wdt_priv *priv;
93 struct watchdog_device *wdd; 94 struct watchdog_device *wdd;
94 struct resource *res;
95 unsigned long val; 95 unsigned long val;
96 int ret; 96 int ret;
97 97
98 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 98 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
99 if (!priv) 99 if (!priv)
100 return -ENOMEM; 100 return -ENOMEM;
101 101
102 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 102 priv->mmio = devm_platform_ioremap_resource(pdev, 0);
103 priv->mmio = devm_ioremap_resource(&pdev->dev, res);
104 if (IS_ERR(priv->mmio)) 103 if (IS_ERR(priv->mmio))
105 return PTR_ERR(priv->mmio); 104 return PTR_ERR(priv->mmio);
106 105
@@ -112,21 +111,21 @@ static int ep93xx_wdt_probe(struct platform_device *pdev)
112 wdd->ops = &ep93xx_wdt_ops; 111 wdd->ops = &ep93xx_wdt_ops;
113 wdd->min_timeout = 1; 112 wdd->min_timeout = 1;
114 wdd->max_hw_heartbeat_ms = 200; 113 wdd->max_hw_heartbeat_ms = 200;
115 wdd->parent = &pdev->dev; 114 wdd->parent = dev;
116 115
117 watchdog_set_nowayout(wdd, nowayout); 116 watchdog_set_nowayout(wdd, nowayout);
118 117
119 wdd->timeout = WDT_TIMEOUT; 118 wdd->timeout = WDT_TIMEOUT;
120 watchdog_init_timeout(wdd, timeout, &pdev->dev); 119 watchdog_init_timeout(wdd, timeout, dev);
121 120
122 watchdog_set_drvdata(wdd, priv); 121 watchdog_set_drvdata(wdd, priv);
123 122
124 ret = devm_watchdog_register_device(&pdev->dev, wdd); 123 ret = devm_watchdog_register_device(dev, wdd);
125 if (ret) 124 if (ret)
126 return ret; 125 return ret;
127 126
128 dev_info(&pdev->dev, "EP93XX watchdog driver %s\n", 127 dev_info(dev, "EP93XX watchdog driver %s\n",
129 (val & 0x08) ? " (nCS1 disable detected)" : ""); 128 (val & 0x08) ? " (nCS1 disable detected)" : "");
130 129
131 return 0; 130 return 0;
132} 131}
diff --git a/drivers/watchdog/f71808e_wdt.c b/drivers/watchdog/f71808e_wdt.c
index 021c6ace9462..041172e6c469 100644
--- a/drivers/watchdog/f71808e_wdt.c
+++ b/drivers/watchdog/f71808e_wdt.c
@@ -338,8 +338,11 @@ static int f71862fg_pin_configure(unsigned short ioaddr)
338 338
339static int watchdog_start(void) 339static int watchdog_start(void)
340{ 340{
341 int err;
342 u8 tmp;
343
341 /* Make sure we don't die as soon as the watchdog is enabled below */ 344 /* Make sure we don't die as soon as the watchdog is enabled below */
342 int err = watchdog_keepalive(); 345 err = watchdog_keepalive();
343 if (err) 346 if (err)
344 return err; 347 return err;
345 348
@@ -386,19 +389,18 @@ static int watchdog_start(void)
386 break; 389 break;
387 390
388 case f81866: 391 case f81866:
389 /* Set pin 70 to WDTRST# */
390 superio_clear_bit(watchdog.sioaddr, SIO_F81866_REG_PORT_SEL,
391 BIT(3) | BIT(0));
392 superio_set_bit(watchdog.sioaddr, SIO_F81866_REG_PORT_SEL,
393 BIT(2));
394 /* 392 /*
395 * GPIO1 Control Register when 27h BIT3:2 = 01 & BIT0 = 0. 393 * GPIO1 Control Register when 27h BIT3:2 = 01 & BIT0 = 0.
396 * The PIN 70(GPIO15/WDTRST) is controlled by 2Ch: 394 * The PIN 70(GPIO15/WDTRST) is controlled by 2Ch:
397 * BIT5: 0 -> WDTRST# 395 * BIT5: 0 -> WDTRST#
398 * 1 -> GPIO15 396 * 1 -> GPIO15
399 */ 397 */
400 superio_clear_bit(watchdog.sioaddr, SIO_F81866_REG_GPIO1, 398 tmp = superio_inb(watchdog.sioaddr, SIO_F81866_REG_PORT_SEL);
401 BIT(5)); 399 tmp &= ~(BIT(3) | BIT(0));
400 tmp |= BIT(2);
401 superio_outb(watchdog.sioaddr, SIO_F81866_REG_PORT_SEL, tmp);
402
403 superio_clear_bit(watchdog.sioaddr, SIO_F81866_REG_GPIO1, 5);
402 break; 404 break;
403 405
404 default: 406 default:
diff --git a/drivers/watchdog/ftwdt010_wdt.c b/drivers/watchdog/ftwdt010_wdt.c
index a9c2912ee280..9ea0e56fa7ee 100644
--- a/drivers/watchdog/ftwdt010_wdt.c
+++ b/drivers/watchdog/ftwdt010_wdt.c
@@ -124,7 +124,6 @@ static const struct watchdog_info ftwdt010_wdt_info = {
124static int ftwdt010_wdt_probe(struct platform_device *pdev) 124static int ftwdt010_wdt_probe(struct platform_device *pdev)
125{ 125{
126 struct device *dev = &pdev->dev; 126 struct device *dev = &pdev->dev;
127 struct resource *res;
128 struct ftwdt010_wdt *gwdt; 127 struct ftwdt010_wdt *gwdt;
129 unsigned int reg; 128 unsigned int reg;
130 int irq; 129 int irq;
@@ -134,8 +133,7 @@ static int ftwdt010_wdt_probe(struct platform_device *pdev)
134 if (!gwdt) 133 if (!gwdt)
135 return -ENOMEM; 134 return -ENOMEM;
136 135
137 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 136 gwdt->base = devm_platform_ioremap_resource(pdev, 0);
138 gwdt->base = devm_ioremap_resource(dev, res);
139 if (IS_ERR(gwdt->base)) 137 if (IS_ERR(gwdt->base))
140 return PTR_ERR(gwdt->base); 138 return PTR_ERR(gwdt->base);
141 139
@@ -171,7 +169,7 @@ static int ftwdt010_wdt_probe(struct platform_device *pdev)
171 169
172 ret = devm_watchdog_register_device(dev, &gwdt->wdd); 170 ret = devm_watchdog_register_device(dev, &gwdt->wdd);
173 if (ret) { 171 if (ret) {
174 dev_err(&pdev->dev, "failed to register watchdog\n"); 172 dev_err(dev, "failed to register watchdog\n");
175 return ret; 173 return ret;
176 } 174 }
177 175
diff --git a/drivers/watchdog/gpio_wdt.c b/drivers/watchdog/gpio_wdt.c
index ea77cae03c9d..bc24674b4d9e 100644
--- a/drivers/watchdog/gpio_wdt.c
+++ b/drivers/watchdog/gpio_wdt.c
@@ -154,25 +154,14 @@ static int gpio_wdt_probe(struct platform_device *pdev)
154 priv->wdd.parent = dev; 154 priv->wdd.parent = dev;
155 priv->wdd.timeout = SOFT_TIMEOUT_DEF; 155 priv->wdd.timeout = SOFT_TIMEOUT_DEF;
156 156
157 watchdog_init_timeout(&priv->wdd, 0, &pdev->dev); 157 watchdog_init_timeout(&priv->wdd, 0, dev);
158 158
159 watchdog_stop_on_reboot(&priv->wdd); 159 watchdog_stop_on_reboot(&priv->wdd);
160 160
161 if (priv->always_running) 161 if (priv->always_running)
162 gpio_wdt_start(&priv->wdd); 162 gpio_wdt_start(&priv->wdd);
163 163
164 ret = watchdog_register_device(&priv->wdd); 164 return devm_watchdog_register_device(dev, &priv->wdd);
165
166 return ret;
167}
168
169static int gpio_wdt_remove(struct platform_device *pdev)
170{
171 struct gpio_wdt_priv *priv = platform_get_drvdata(pdev);
172
173 watchdog_unregister_device(&priv->wdd);
174
175 return 0;
176} 165}
177 166
178static const struct of_device_id gpio_wdt_dt_ids[] = { 167static const struct of_device_id gpio_wdt_dt_ids[] = {
@@ -187,7 +176,6 @@ static struct platform_driver gpio_wdt_driver = {
187 .of_match_table = gpio_wdt_dt_ids, 176 .of_match_table = gpio_wdt_dt_ids,
188 }, 177 },
189 .probe = gpio_wdt_probe, 178 .probe = gpio_wdt_probe,
190 .remove = gpio_wdt_remove,
191}; 179};
192 180
193#ifdef CONFIG_GPIO_WATCHDOG_ARCH_INITCALL 181#ifdef CONFIG_GPIO_WATCHDOG_ARCH_INITCALL
diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c
index ef30c7e9728d..db1bf6f546ae 100644
--- a/drivers/watchdog/hpwdt.c
+++ b/drivers/watchdog/hpwdt.c
@@ -311,8 +311,7 @@ static int hpwdt_init_one(struct pci_dev *dev,
311 goto error_init_nmi_decoding; 311 goto error_init_nmi_decoding;
312 312
313 watchdog_set_nowayout(&hpwdt_dev, nowayout); 313 watchdog_set_nowayout(&hpwdt_dev, nowayout);
314 if (watchdog_init_timeout(&hpwdt_dev, soft_margin, NULL)) 314 watchdog_init_timeout(&hpwdt_dev, soft_margin, NULL);
315 dev_warn(&dev->dev, "Invalid soft_margin: %d.\n", soft_margin);
316 315
317 if (pretimeout && hpwdt_dev.timeout <= PRETIMEOUT_SEC) { 316 if (pretimeout && hpwdt_dev.timeout <= PRETIMEOUT_SEC) {
318 dev_warn(&dev->dev, "timeout <= pretimeout. Setting pretimeout to zero\n"); 317 dev_warn(&dev->dev, "timeout <= pretimeout. Setting pretimeout to zero\n");
diff --git a/drivers/watchdog/i6300esb.c b/drivers/watchdog/i6300esb.c
index 950c71a8bb22..17941c03996b 100644
--- a/drivers/watchdog/i6300esb.c
+++ b/drivers/watchdog/i6300esb.c
@@ -311,10 +311,7 @@ static int esb_probe(struct pci_dev *pdev,
311 edev->wdd.min_timeout = ESB_HEARTBEAT_MIN; 311 edev->wdd.min_timeout = ESB_HEARTBEAT_MIN;
312 edev->wdd.max_timeout = ESB_HEARTBEAT_MAX; 312 edev->wdd.max_timeout = ESB_HEARTBEAT_MAX;
313 edev->wdd.timeout = ESB_HEARTBEAT_DEFAULT; 313 edev->wdd.timeout = ESB_HEARTBEAT_DEFAULT;
314 if (watchdog_init_timeout(&edev->wdd, heartbeat, NULL)) 314 watchdog_init_timeout(&edev->wdd, heartbeat, NULL);
315 dev_info(&pdev->dev,
316 "heartbeat value must be " ESB_HEARTBEAT_RANGE
317 ", using %u\n", edev->wdd.timeout);
318 watchdog_set_nowayout(&edev->wdd, nowayout); 315 watchdog_set_nowayout(&edev->wdd, nowayout);
319 watchdog_stop_on_reboot(&edev->wdd); 316 watchdog_stop_on_reboot(&edev->wdd);
320 watchdog_stop_on_unregister(&edev->wdd); 317 watchdog_stop_on_unregister(&edev->wdd);
@@ -328,8 +325,8 @@ static int esb_probe(struct pci_dev *pdev,
328 goto err_unmap; 325 goto err_unmap;
329 } 326 }
330 dev_info(&pdev->dev, 327 dev_info(&pdev->dev,
331 "initialized (0x%p). heartbeat=%d sec (nowayout=%d)\n", 328 "initialized. heartbeat=%d sec (nowayout=%d)\n",
332 edev->base, edev->wdd.timeout, nowayout); 329 edev->wdd.timeout, nowayout);
333 return 0; 330 return 0;
334 331
335err_unmap: 332err_unmap:
diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c
index 0a5318b7865e..89cea6ce9a08 100644
--- a/drivers/watchdog/iTCO_wdt.c
+++ b/drivers/watchdog/iTCO_wdt.c
@@ -545,6 +545,7 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
545 } 545 }
546 546
547 watchdog_stop_on_reboot(&p->wddev); 547 watchdog_stop_on_reboot(&p->wddev);
548 watchdog_stop_on_unregister(&p->wddev);
548 ret = devm_watchdog_register_device(dev, &p->wddev); 549 ret = devm_watchdog_register_device(dev, &p->wddev);
549 if (ret != 0) { 550 if (ret != 0) {
550 pr_err("cannot register watchdog device (err=%d)\n", ret); 551 pr_err("cannot register watchdog device (err=%d)\n", ret);
@@ -557,17 +558,6 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
557 return 0; 558 return 0;
558} 559}
559 560
560static int iTCO_wdt_remove(struct platform_device *pdev)
561{
562 struct iTCO_wdt_private *p = platform_get_drvdata(pdev);
563
564 /* Stop the timer before we leave */
565 if (!nowayout)
566 iTCO_wdt_stop(&p->wddev);
567
568 return 0;
569}
570
571#ifdef CONFIG_PM_SLEEP 561#ifdef CONFIG_PM_SLEEP
572/* 562/*
573 * Suspend-to-idle requires this, because it stops the ticks and timekeeping, so 563 * Suspend-to-idle requires this, because it stops the ticks and timekeeping, so
@@ -620,7 +610,6 @@ static const struct dev_pm_ops iTCO_wdt_pm = {
620 610
621static struct platform_driver iTCO_wdt_driver = { 611static struct platform_driver iTCO_wdt_driver = {
622 .probe = iTCO_wdt_probe, 612 .probe = iTCO_wdt_probe,
623 .remove = iTCO_wdt_remove,
624 .driver = { 613 .driver = {
625 .name = DRV_NAME, 614 .name = DRV_NAME,
626 .pm = ITCO_WDT_PM_OPS, 615 .pm = ITCO_WDT_PM_OPS,
diff --git a/drivers/watchdog/imgpdc_wdt.c b/drivers/watchdog/imgpdc_wdt.c
index a3134ffa59f8..0fc31aadeee3 100644
--- a/drivers/watchdog/imgpdc_wdt.c
+++ b/drivers/watchdog/imgpdc_wdt.c
@@ -178,59 +178,69 @@ static const struct watchdog_ops pdc_wdt_ops = {
178 .restart = pdc_wdt_restart, 178 .restart = pdc_wdt_restart,
179}; 179};
180 180
181static void pdc_clk_disable_unprepare(void *data)
182{
183 clk_disable_unprepare(data);
184}
185
181static int pdc_wdt_probe(struct platform_device *pdev) 186static int pdc_wdt_probe(struct platform_device *pdev)
182{ 187{
188 struct device *dev = &pdev->dev;
183 u64 div; 189 u64 div;
184 int ret, val; 190 int ret, val;
185 unsigned long clk_rate; 191 unsigned long clk_rate;
186 struct resource *res;
187 struct pdc_wdt_dev *pdc_wdt; 192 struct pdc_wdt_dev *pdc_wdt;
188 193
189 pdc_wdt = devm_kzalloc(&pdev->dev, sizeof(*pdc_wdt), GFP_KERNEL); 194 pdc_wdt = devm_kzalloc(dev, sizeof(*pdc_wdt), GFP_KERNEL);
190 if (!pdc_wdt) 195 if (!pdc_wdt)
191 return -ENOMEM; 196 return -ENOMEM;
192 197
193 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 198 pdc_wdt->base = devm_platform_ioremap_resource(pdev, 0);
194 pdc_wdt->base = devm_ioremap_resource(&pdev->dev, res);
195 if (IS_ERR(pdc_wdt->base)) 199 if (IS_ERR(pdc_wdt->base))
196 return PTR_ERR(pdc_wdt->base); 200 return PTR_ERR(pdc_wdt->base);
197 201
198 pdc_wdt->sys_clk = devm_clk_get(&pdev->dev, "sys"); 202 pdc_wdt->sys_clk = devm_clk_get(dev, "sys");
199 if (IS_ERR(pdc_wdt->sys_clk)) { 203 if (IS_ERR(pdc_wdt->sys_clk)) {
200 dev_err(&pdev->dev, "failed to get the sys clock\n"); 204 dev_err(dev, "failed to get the sys clock\n");
201 return PTR_ERR(pdc_wdt->sys_clk); 205 return PTR_ERR(pdc_wdt->sys_clk);
202 } 206 }
203 207
204 pdc_wdt->wdt_clk = devm_clk_get(&pdev->dev, "wdt"); 208 pdc_wdt->wdt_clk = devm_clk_get(dev, "wdt");
205 if (IS_ERR(pdc_wdt->wdt_clk)) { 209 if (IS_ERR(pdc_wdt->wdt_clk)) {
206 dev_err(&pdev->dev, "failed to get the wdt clock\n"); 210 dev_err(dev, "failed to get the wdt clock\n");
207 return PTR_ERR(pdc_wdt->wdt_clk); 211 return PTR_ERR(pdc_wdt->wdt_clk);
208 } 212 }
209 213
210 ret = clk_prepare_enable(pdc_wdt->sys_clk); 214 ret = clk_prepare_enable(pdc_wdt->sys_clk);
211 if (ret) { 215 if (ret) {
212 dev_err(&pdev->dev, "could not prepare or enable sys clock\n"); 216 dev_err(dev, "could not prepare or enable sys clock\n");
213 return ret; 217 return ret;
214 } 218 }
219 ret = devm_add_action_or_reset(dev, pdc_clk_disable_unprepare,
220 pdc_wdt->sys_clk);
221 if (ret)
222 return ret;
215 223
216 ret = clk_prepare_enable(pdc_wdt->wdt_clk); 224 ret = clk_prepare_enable(pdc_wdt->wdt_clk);
217 if (ret) { 225 if (ret) {
218 dev_err(&pdev->dev, "could not prepare or enable wdt clock\n"); 226 dev_err(dev, "could not prepare or enable wdt clock\n");
219 goto disable_sys_clk; 227 return ret;
220 } 228 }
229 ret = devm_add_action_or_reset(dev, pdc_clk_disable_unprepare,
230 pdc_wdt->wdt_clk);
231 if (ret)
232 return ret;
221 233
222 /* We use the clock rate to calculate the max timeout */ 234 /* We use the clock rate to calculate the max timeout */
223 clk_rate = clk_get_rate(pdc_wdt->wdt_clk); 235 clk_rate = clk_get_rate(pdc_wdt->wdt_clk);
224 if (clk_rate == 0) { 236 if (clk_rate == 0) {
225 dev_err(&pdev->dev, "failed to get clock rate\n"); 237 dev_err(dev, "failed to get clock rate\n");
226 ret = -EINVAL; 238 return -EINVAL;
227 goto disable_wdt_clk;
228 } 239 }
229 240
230 if (order_base_2(clk_rate) > PDC_WDT_CONFIG_DELAY_MASK + 1) { 241 if (order_base_2(clk_rate) > PDC_WDT_CONFIG_DELAY_MASK + 1) {
231 dev_err(&pdev->dev, "invalid clock rate\n"); 242 dev_err(dev, "invalid clock rate\n");
232 ret = -EINVAL; 243 return -EINVAL;
233 goto disable_wdt_clk;
234 } 244 }
235 245
236 if (order_base_2(clk_rate) == 0) 246 if (order_base_2(clk_rate) == 0)
@@ -245,10 +255,10 @@ static int pdc_wdt_probe(struct platform_device *pdev)
245 do_div(div, clk_rate); 255 do_div(div, clk_rate);
246 pdc_wdt->wdt_dev.max_timeout = div; 256 pdc_wdt->wdt_dev.max_timeout = div;
247 pdc_wdt->wdt_dev.timeout = PDC_WDT_DEF_TIMEOUT; 257 pdc_wdt->wdt_dev.timeout = PDC_WDT_DEF_TIMEOUT;
248 pdc_wdt->wdt_dev.parent = &pdev->dev; 258 pdc_wdt->wdt_dev.parent = dev;
249 watchdog_set_drvdata(&pdc_wdt->wdt_dev, pdc_wdt); 259 watchdog_set_drvdata(&pdc_wdt->wdt_dev, pdc_wdt);
250 260
251 watchdog_init_timeout(&pdc_wdt->wdt_dev, heartbeat, &pdev->dev); 261 watchdog_init_timeout(&pdc_wdt->wdt_dev, heartbeat, dev);
252 262
253 pdc_wdt_stop(&pdc_wdt->wdt_dev); 263 pdc_wdt_stop(&pdc_wdt->wdt_dev);
254 264
@@ -259,24 +269,22 @@ static int pdc_wdt_probe(struct platform_device *pdev)
259 case PDC_WDT_TICKLE_STATUS_TICKLE: 269 case PDC_WDT_TICKLE_STATUS_TICKLE:
260 case PDC_WDT_TICKLE_STATUS_TIMEOUT: 270 case PDC_WDT_TICKLE_STATUS_TIMEOUT:
261 pdc_wdt->wdt_dev.bootstatus |= WDIOF_CARDRESET; 271 pdc_wdt->wdt_dev.bootstatus |= WDIOF_CARDRESET;
262 dev_info(&pdev->dev, 272 dev_info(dev, "watchdog module last reset due to timeout\n");
263 "watchdog module last reset due to timeout\n");
264 break; 273 break;
265 case PDC_WDT_TICKLE_STATUS_HRESET: 274 case PDC_WDT_TICKLE_STATUS_HRESET:
266 dev_info(&pdev->dev, 275 dev_info(dev,
267 "watchdog module last reset due to hard reset\n"); 276 "watchdog module last reset due to hard reset\n");
268 break; 277 break;
269 case PDC_WDT_TICKLE_STATUS_SRESET: 278 case PDC_WDT_TICKLE_STATUS_SRESET:
270 dev_info(&pdev->dev, 279 dev_info(dev,
271 "watchdog module last reset due to soft reset\n"); 280 "watchdog module last reset due to soft reset\n");
272 break; 281 break;
273 case PDC_WDT_TICKLE_STATUS_USER: 282 case PDC_WDT_TICKLE_STATUS_USER:
274 dev_info(&pdev->dev, 283 dev_info(dev,
275 "watchdog module last reset due to user reset\n"); 284 "watchdog module last reset due to user reset\n");
276 break; 285 break;
277 default: 286 default:
278 dev_info(&pdev->dev, 287 dev_info(dev, "contains an illegal status code (%08x)\n", val);
279 "contains an illegal status code (%08x)\n", val);
280 break; 288 break;
281 } 289 }
282 290
@@ -285,36 +293,9 @@ static int pdc_wdt_probe(struct platform_device *pdev)
285 293
286 platform_set_drvdata(pdev, pdc_wdt); 294 platform_set_drvdata(pdev, pdc_wdt);
287 295
288 ret = watchdog_register_device(&pdc_wdt->wdt_dev); 296 watchdog_stop_on_reboot(&pdc_wdt->wdt_dev);
289 if (ret) 297 watchdog_stop_on_unregister(&pdc_wdt->wdt_dev);
290 goto disable_wdt_clk; 298 return devm_watchdog_register_device(dev, &pdc_wdt->wdt_dev);
291
292 return 0;
293
294disable_wdt_clk:
295 clk_disable_unprepare(pdc_wdt->wdt_clk);
296disable_sys_clk:
297 clk_disable_unprepare(pdc_wdt->sys_clk);
298 return ret;
299}
300
301static void pdc_wdt_shutdown(struct platform_device *pdev)
302{
303 struct pdc_wdt_dev *pdc_wdt = platform_get_drvdata(pdev);
304
305 pdc_wdt_stop(&pdc_wdt->wdt_dev);
306}
307
308static int pdc_wdt_remove(struct platform_device *pdev)
309{
310 struct pdc_wdt_dev *pdc_wdt = platform_get_drvdata(pdev);
311
312 pdc_wdt_stop(&pdc_wdt->wdt_dev);
313 watchdog_unregister_device(&pdc_wdt->wdt_dev);
314 clk_disable_unprepare(pdc_wdt->wdt_clk);
315 clk_disable_unprepare(pdc_wdt->sys_clk);
316
317 return 0;
318} 299}
319 300
320static const struct of_device_id pdc_wdt_match[] = { 301static const struct of_device_id pdc_wdt_match[] = {
@@ -329,8 +310,6 @@ static struct platform_driver pdc_wdt_driver = {
329 .of_match_table = pdc_wdt_match, 310 .of_match_table = pdc_wdt_match,
330 }, 311 },
331 .probe = pdc_wdt_probe, 312 .probe = pdc_wdt_probe,
332 .remove = pdc_wdt_remove,
333 .shutdown = pdc_wdt_shutdown,
334}; 313};
335module_platform_driver(pdc_wdt_driver); 314module_platform_driver(pdc_wdt_driver);
336 315
diff --git a/drivers/watchdog/imx2_wdt.c b/drivers/watchdog/imx2_wdt.c
index 2b52514eaa86..a606005dd65f 100644
--- a/drivers/watchdog/imx2_wdt.c
+++ b/drivers/watchdog/imx2_wdt.c
@@ -178,8 +178,10 @@ static void __imx2_wdt_set_timeout(struct watchdog_device *wdog,
178static int imx2_wdt_set_timeout(struct watchdog_device *wdog, 178static int imx2_wdt_set_timeout(struct watchdog_device *wdog,
179 unsigned int new_timeout) 179 unsigned int new_timeout)
180{ 180{
181 __imx2_wdt_set_timeout(wdog, new_timeout); 181 unsigned int actual;
182 182
183 actual = min(new_timeout, wdog->max_hw_heartbeat_ms * 1000);
184 __imx2_wdt_set_timeout(wdog, actual);
183 wdog->timeout = new_timeout; 185 wdog->timeout = new_timeout;
184 return 0; 186 return 0;
185} 187}
@@ -247,7 +249,6 @@ static int __init imx2_wdt_probe(struct platform_device *pdev)
247{ 249{
248 struct imx2_wdt_device *wdev; 250 struct imx2_wdt_device *wdev;
249 struct watchdog_device *wdog; 251 struct watchdog_device *wdog;
250 struct resource *res;
251 void __iomem *base; 252 void __iomem *base;
252 int ret; 253 int ret;
253 u32 val; 254 u32 val;
@@ -256,8 +257,7 @@ static int __init imx2_wdt_probe(struct platform_device *pdev)
256 if (!wdev) 257 if (!wdev)
257 return -ENOMEM; 258 return -ENOMEM;
258 259
259 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 260 base = devm_platform_ioremap_resource(pdev, 0);
260 base = devm_ioremap_resource(&pdev->dev, res);
261 if (IS_ERR(base)) 261 if (IS_ERR(base))
262 return PTR_ERR(base); 262 return PTR_ERR(base);
263 263
diff --git a/drivers/watchdog/imx_sc_wdt.c b/drivers/watchdog/imx_sc_wdt.c
new file mode 100644
index 000000000000..49848b66186c
--- /dev/null
+++ b/drivers/watchdog/imx_sc_wdt.c
@@ -0,0 +1,175 @@
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright 2018-2019 NXP.
4 */
5
6#include <linux/arm-smccc.h>
7#include <linux/io.h>
8#include <linux/init.h>
9#include <linux/kernel.h>
10#include <linux/module.h>
11#include <linux/moduleparam.h>
12#include <linux/of.h>
13#include <linux/platform_device.h>
14#include <linux/reboot.h>
15#include <linux/watchdog.h>
16
17#define DEFAULT_TIMEOUT 60
18/*
19 * Software timer tick implemented in scfw side, support 10ms to 0xffffffff ms
20 * in theory, but for normal case, 1s~128s is enough, you can change this max
21 * value in case it's not enough.
22 */
23#define MAX_TIMEOUT 128
24
25#define IMX_SIP_TIMER 0xC2000002
26#define IMX_SIP_TIMER_START_WDOG 0x01
27#define IMX_SIP_TIMER_STOP_WDOG 0x02
28#define IMX_SIP_TIMER_SET_WDOG_ACT 0x03
29#define IMX_SIP_TIMER_PING_WDOG 0x04
30#define IMX_SIP_TIMER_SET_TIMEOUT_WDOG 0x05
31#define IMX_SIP_TIMER_GET_WDOG_STAT 0x06
32#define IMX_SIP_TIMER_SET_PRETIME_WDOG 0x07
33
34#define SC_TIMER_WDOG_ACTION_PARTITION 0
35
36static bool nowayout = WATCHDOG_NOWAYOUT;
37module_param(nowayout, bool, 0000);
38MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
39 __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
40
41static int imx_sc_wdt_ping(struct watchdog_device *wdog)
42{
43 struct arm_smccc_res res;
44
45 arm_smccc_smc(IMX_SIP_TIMER, IMX_SIP_TIMER_PING_WDOG,
46 0, 0, 0, 0, 0, 0, &res);
47
48 return 0;
49}
50
51static int imx_sc_wdt_start(struct watchdog_device *wdog)
52{
53 struct arm_smccc_res res;
54
55 arm_smccc_smc(IMX_SIP_TIMER, IMX_SIP_TIMER_START_WDOG,
56 0, 0, 0, 0, 0, 0, &res);
57 if (res.a0)
58 return -EACCES;
59
60 arm_smccc_smc(IMX_SIP_TIMER, IMX_SIP_TIMER_SET_WDOG_ACT,
61 SC_TIMER_WDOG_ACTION_PARTITION,
62 0, 0, 0, 0, 0, &res);
63 return res.a0 ? -EACCES : 0;
64}
65
66static int imx_sc_wdt_stop(struct watchdog_device *wdog)
67{
68 struct arm_smccc_res res;
69
70 arm_smccc_smc(IMX_SIP_TIMER, IMX_SIP_TIMER_STOP_WDOG,
71 0, 0, 0, 0, 0, 0, &res);
72
73 return res.a0 ? -EACCES : 0;
74}
75
76static int imx_sc_wdt_set_timeout(struct watchdog_device *wdog,
77 unsigned int timeout)
78{
79 struct arm_smccc_res res;
80
81 wdog->timeout = timeout;
82 arm_smccc_smc(IMX_SIP_TIMER, IMX_SIP_TIMER_SET_TIMEOUT_WDOG,
83 timeout * 1000, 0, 0, 0, 0, 0, &res);
84
85 return res.a0 ? -EACCES : 0;
86}
87
88static const struct watchdog_ops imx_sc_wdt_ops = {
89 .owner = THIS_MODULE,
90 .start = imx_sc_wdt_start,
91 .stop = imx_sc_wdt_stop,
92 .ping = imx_sc_wdt_ping,
93 .set_timeout = imx_sc_wdt_set_timeout,
94};
95
96static const struct watchdog_info imx_sc_wdt_info = {
97 .identity = "i.MX SC watchdog timer",
98 .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING |
99 WDIOF_MAGICCLOSE | WDIOF_PRETIMEOUT,
100};
101
102static int imx_sc_wdt_probe(struct platform_device *pdev)
103{
104 struct device *dev = &pdev->dev;
105 struct watchdog_device *imx_sc_wdd;
106 int ret;
107
108 imx_sc_wdd = devm_kzalloc(dev, sizeof(*imx_sc_wdd), GFP_KERNEL);
109 if (!imx_sc_wdd)
110 return -ENOMEM;
111
112 platform_set_drvdata(pdev, imx_sc_wdd);
113
114 imx_sc_wdd->info = &imx_sc_wdt_info;
115 imx_sc_wdd->ops = &imx_sc_wdt_ops;
116 imx_sc_wdd->min_timeout = 1;
117 imx_sc_wdd->max_timeout = MAX_TIMEOUT;
118 imx_sc_wdd->parent = dev;
119 imx_sc_wdd->timeout = DEFAULT_TIMEOUT;
120
121 watchdog_init_timeout(imx_sc_wdd, 0, dev);
122 watchdog_stop_on_reboot(imx_sc_wdd);
123 watchdog_stop_on_unregister(imx_sc_wdd);
124
125 ret = devm_watchdog_register_device(dev, imx_sc_wdd);
126 if (ret) {
127 dev_err(dev, "Failed to register watchdog device\n");
128 return ret;
129 }
130
131 return 0;
132}
133
134static int __maybe_unused imx_sc_wdt_suspend(struct device *dev)
135{
136 struct watchdog_device *imx_sc_wdd = dev_get_drvdata(dev);
137
138 if (watchdog_active(imx_sc_wdd))
139 imx_sc_wdt_stop(imx_sc_wdd);
140
141 return 0;
142}
143
144static int __maybe_unused imx_sc_wdt_resume(struct device *dev)
145{
146 struct watchdog_device *imx_sc_wdd = dev_get_drvdata(dev);
147
148 if (watchdog_active(imx_sc_wdd))
149 imx_sc_wdt_start(imx_sc_wdd);
150
151 return 0;
152}
153
154static SIMPLE_DEV_PM_OPS(imx_sc_wdt_pm_ops,
155 imx_sc_wdt_suspend, imx_sc_wdt_resume);
156
157static const struct of_device_id imx_sc_wdt_dt_ids[] = {
158 { .compatible = "fsl,imx-sc-wdt", },
159 { /* sentinel */ }
160};
161MODULE_DEVICE_TABLE(of, imx_sc_wdt_dt_ids);
162
163static struct platform_driver imx_sc_wdt_driver = {
164 .probe = imx_sc_wdt_probe,
165 .driver = {
166 .name = "imx-sc-wdt",
167 .of_match_table = imx_sc_wdt_dt_ids,
168 .pm = &imx_sc_wdt_pm_ops,
169 },
170};
171module_platform_driver(imx_sc_wdt_driver);
172
173MODULE_AUTHOR("Robin Gong <yibin.gong@nxp.com>");
174MODULE_DESCRIPTION("NXP i.MX system controller watchdog driver");
175MODULE_LICENSE("GPL v2");
diff --git a/drivers/watchdog/intel-mid_wdt.c b/drivers/watchdog/intel-mid_wdt.c
index 72c108a12c19..6cf7cc1ff615 100644
--- a/drivers/watchdog/intel-mid_wdt.c
+++ b/drivers/watchdog/intel-mid_wdt.c
@@ -110,12 +110,13 @@ static const struct watchdog_ops mid_wdt_ops = {
110 110
111static int mid_wdt_probe(struct platform_device *pdev) 111static int mid_wdt_probe(struct platform_device *pdev)
112{ 112{
113 struct device *dev = &pdev->dev;
113 struct watchdog_device *wdt_dev; 114 struct watchdog_device *wdt_dev;
114 struct intel_mid_wdt_pdata *pdata = pdev->dev.platform_data; 115 struct intel_mid_wdt_pdata *pdata = dev->platform_data;
115 int ret; 116 int ret;
116 117
117 if (!pdata) { 118 if (!pdata) {
118 dev_err(&pdev->dev, "missing platform data\n"); 119 dev_err(dev, "missing platform data\n");
119 return -EINVAL; 120 return -EINVAL;
120 } 121 }
121 122
@@ -125,7 +126,7 @@ static int mid_wdt_probe(struct platform_device *pdev)
125 return ret; 126 return ret;
126 } 127 }
127 128
128 wdt_dev = devm_kzalloc(&pdev->dev, sizeof(*wdt_dev), GFP_KERNEL); 129 wdt_dev = devm_kzalloc(dev, sizeof(*wdt_dev), GFP_KERNEL);
129 if (!wdt_dev) 130 if (!wdt_dev)
130 return -ENOMEM; 131 return -ENOMEM;
131 132
@@ -134,16 +135,15 @@ static int mid_wdt_probe(struct platform_device *pdev)
134 wdt_dev->min_timeout = MID_WDT_TIMEOUT_MIN; 135 wdt_dev->min_timeout = MID_WDT_TIMEOUT_MIN;
135 wdt_dev->max_timeout = MID_WDT_TIMEOUT_MAX; 136 wdt_dev->max_timeout = MID_WDT_TIMEOUT_MAX;
136 wdt_dev->timeout = MID_WDT_DEFAULT_TIMEOUT; 137 wdt_dev->timeout = MID_WDT_DEFAULT_TIMEOUT;
137 wdt_dev->parent = &pdev->dev; 138 wdt_dev->parent = dev;
138 139
139 watchdog_set_drvdata(wdt_dev, &pdev->dev); 140 watchdog_set_drvdata(wdt_dev, dev);
140 141
141 ret = devm_request_irq(&pdev->dev, pdata->irq, mid_wdt_irq, 142 ret = devm_request_irq(dev, pdata->irq, mid_wdt_irq,
142 IRQF_SHARED | IRQF_NO_SUSPEND, "watchdog", 143 IRQF_SHARED | IRQF_NO_SUSPEND, "watchdog",
143 wdt_dev); 144 wdt_dev);
144 if (ret) { 145 if (ret) {
145 dev_err(&pdev->dev, "error requesting warning irq %d\n", 146 dev_err(dev, "error requesting warning irq %d\n", pdata->irq);
146 pdata->irq);
147 return ret; 147 return ret;
148 } 148 }
149 149
@@ -163,13 +163,13 @@ static int mid_wdt_probe(struct platform_device *pdev)
163 /* Make sure the watchdog is serviced */ 163 /* Make sure the watchdog is serviced */
164 set_bit(WDOG_HW_RUNNING, &wdt_dev->status); 164 set_bit(WDOG_HW_RUNNING, &wdt_dev->status);
165 165
166 ret = devm_watchdog_register_device(&pdev->dev, wdt_dev); 166 ret = devm_watchdog_register_device(dev, wdt_dev);
167 if (ret) { 167 if (ret) {
168 dev_err(&pdev->dev, "error registering watchdog device\n"); 168 dev_err(dev, "error registering watchdog device\n");
169 return ret; 169 return ret;
170 } 170 }
171 171
172 dev_info(&pdev->dev, "Intel MID watchdog device probed\n"); 172 dev_info(dev, "Intel MID watchdog device probed\n");
173 173
174 return 0; 174 return 0;
175} 175}
diff --git a/drivers/watchdog/intel_scu_watchdog.c b/drivers/watchdog/intel_scu_watchdog.c
index 3181a72c7ddf..f7baf75d38c0 100644
--- a/drivers/watchdog/intel_scu_watchdog.c
+++ b/drivers/watchdog/intel_scu_watchdog.c
@@ -25,7 +25,6 @@
25#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 25#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
26 26
27#include <linux/compiler.h> 27#include <linux/compiler.h>
28#include <linux/module.h>
29#include <linux/kernel.h> 28#include <linux/kernel.h>
30#include <linux/moduleparam.h> 29#include <linux/moduleparam.h>
31#include <linux/types.h> 30#include <linux/types.h>
@@ -224,7 +223,7 @@ static int intel_scu_set_heartbeat(u32 t)
224 watchdog_device.timer_tbl_ptr->freq_hz); 223 watchdog_device.timer_tbl_ptr->freq_hz);
225 pr_debug("set_heartbeat: timer_set is %x (hex)\n", 224 pr_debug("set_heartbeat: timer_set is %x (hex)\n",
226 watchdog_device.timer_set); 225 watchdog_device.timer_set);
227 pr_debug("set_hearbeat: timer_margin is %x (hex)\n", timer_margin); 226 pr_debug("set_heartbeat: timer_margin is %x (hex)\n", timer_margin);
228 pr_debug("set_heartbeat: threshold is %x (hex)\n", 227 pr_debug("set_heartbeat: threshold is %x (hex)\n",
229 watchdog_device.threshold); 228 watchdog_device.threshold);
230 pr_debug("set_heartbeat: soft_threshold is %x (hex)\n", 229 pr_debug("set_heartbeat: soft_threshold is %x (hex)\n",
@@ -545,21 +544,4 @@ register_reboot_error:
545 iounmap(watchdog_device.timer_load_count_addr); 544 iounmap(watchdog_device.timer_load_count_addr);
546 return ret; 545 return ret;
547} 546}
548
549static void __exit intel_scu_watchdog_exit(void)
550{
551
552 misc_deregister(&watchdog_device.miscdev);
553 unregister_reboot_notifier(&watchdog_device.intel_scu_notifier);
554 /* disable the timer */
555 iowrite32(0x00000002, watchdog_device.timer_control_addr);
556 iounmap(watchdog_device.timer_load_count_addr);
557}
558
559late_initcall(intel_scu_watchdog_init); 547late_initcall(intel_scu_watchdog_init);
560module_exit(intel_scu_watchdog_exit);
561
562MODULE_AUTHOR("Intel Corporation");
563MODULE_DESCRIPTION("Intel SCU Watchdog Device Driver");
564MODULE_LICENSE("GPL");
565MODULE_VERSION(WDT_VER);
diff --git a/drivers/watchdog/jz4740_wdt.c b/drivers/watchdog/jz4740_wdt.c
index ec4d99a830ba..d1bc7cbd4f2b 100644
--- a/drivers/watchdog/jz4740_wdt.c
+++ b/drivers/watchdog/jz4740_wdt.c
@@ -163,12 +163,12 @@ MODULE_DEVICE_TABLE(of, jz4740_wdt_of_matches);
163 163
164static int jz4740_wdt_probe(struct platform_device *pdev) 164static int jz4740_wdt_probe(struct platform_device *pdev)
165{ 165{
166 struct device *dev = &pdev->dev;
166 struct jz4740_wdt_drvdata *drvdata; 167 struct jz4740_wdt_drvdata *drvdata;
167 struct watchdog_device *jz4740_wdt; 168 struct watchdog_device *jz4740_wdt;
168 struct resource *res;
169 int ret; 169 int ret;
170 170
171 drvdata = devm_kzalloc(&pdev->dev, sizeof(struct jz4740_wdt_drvdata), 171 drvdata = devm_kzalloc(dev, sizeof(struct jz4740_wdt_drvdata),
172 GFP_KERNEL); 172 GFP_KERNEL);
173 if (!drvdata) 173 if (!drvdata)
174 return -ENOMEM; 174 return -ENOMEM;
@@ -182,27 +182,24 @@ static int jz4740_wdt_probe(struct platform_device *pdev)
182 jz4740_wdt->timeout = heartbeat; 182 jz4740_wdt->timeout = heartbeat;
183 jz4740_wdt->min_timeout = 1; 183 jz4740_wdt->min_timeout = 1;
184 jz4740_wdt->max_timeout = MAX_HEARTBEAT; 184 jz4740_wdt->max_timeout = MAX_HEARTBEAT;
185 jz4740_wdt->parent = &pdev->dev; 185 jz4740_wdt->parent = dev;
186 watchdog_set_nowayout(jz4740_wdt, nowayout); 186 watchdog_set_nowayout(jz4740_wdt, nowayout);
187 watchdog_set_drvdata(jz4740_wdt, drvdata); 187 watchdog_set_drvdata(jz4740_wdt, drvdata);
188 188
189 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 189 drvdata->base = devm_platform_ioremap_resource(pdev, 0);
190 drvdata->base = devm_ioremap_resource(&pdev->dev, res);
191 if (IS_ERR(drvdata->base)) 190 if (IS_ERR(drvdata->base))
192 return PTR_ERR(drvdata->base); 191 return PTR_ERR(drvdata->base);
193 192
194 drvdata->rtc_clk = devm_clk_get(&pdev->dev, "rtc"); 193 drvdata->rtc_clk = devm_clk_get(dev, "rtc");
195 if (IS_ERR(drvdata->rtc_clk)) { 194 if (IS_ERR(drvdata->rtc_clk)) {
196 dev_err(&pdev->dev, "cannot find RTC clock\n"); 195 dev_err(dev, "cannot find RTC clock\n");
197 return PTR_ERR(drvdata->rtc_clk); 196 return PTR_ERR(drvdata->rtc_clk);
198 } 197 }
199 198
200 ret = devm_watchdog_register_device(&pdev->dev, &drvdata->wdt); 199 ret = devm_watchdog_register_device(dev, &drvdata->wdt);
201 if (ret < 0) 200 if (ret < 0)
202 return ret; 201 return ret;
203 202
204 platform_set_drvdata(pdev, drvdata);
205
206 return 0; 203 return 0;
207} 204}
208 205
diff --git a/drivers/watchdog/kempld_wdt.c b/drivers/watchdog/kempld_wdt.c
index e268add43010..543eb0f27a42 100644
--- a/drivers/watchdog/kempld_wdt.c
+++ b/drivers/watchdog/kempld_wdt.c
@@ -467,7 +467,7 @@ static int kempld_wdt_probe(struct platform_device *pdev)
467 KEMPLD_WDT_CFG_GLOBAL_LOCK)) { 467 KEMPLD_WDT_CFG_GLOBAL_LOCK)) {
468 if (!nowayout) 468 if (!nowayout)
469 dev_warn(dev, 469 dev_warn(dev,
470 "Forcing nowayout - watchdog lock enabled!\n"); 470 "Forcing nowayout - watchdog lock enabled!\n");
471 nowayout = true; 471 nowayout = true;
472 } 472 }
473 473
@@ -492,7 +492,9 @@ static int kempld_wdt_probe(struct platform_device *pdev)
492 } 492 }
493 493
494 platform_set_drvdata(pdev, wdt_data); 494 platform_set_drvdata(pdev, wdt_data);
495 ret = watchdog_register_device(wdd); 495 watchdog_stop_on_reboot(wdd);
496 watchdog_stop_on_unregister(wdd);
497 ret = devm_watchdog_register_device(dev, wdd);
496 if (ret) 498 if (ret)
497 return ret; 499 return ret;
498 500
@@ -501,26 +503,6 @@ static int kempld_wdt_probe(struct platform_device *pdev)
501 return 0; 503 return 0;
502} 504}
503 505
504static void kempld_wdt_shutdown(struct platform_device *pdev)
505{
506 struct kempld_wdt_data *wdt_data = platform_get_drvdata(pdev);
507
508 kempld_wdt_stop(&wdt_data->wdd);
509}
510
511static int kempld_wdt_remove(struct platform_device *pdev)
512{
513 struct kempld_wdt_data *wdt_data = platform_get_drvdata(pdev);
514 struct watchdog_device *wdd = &wdt_data->wdd;
515 int ret = 0;
516
517 if (!nowayout)
518 ret = kempld_wdt_stop(wdd);
519 watchdog_unregister_device(wdd);
520
521 return ret;
522}
523
524#ifdef CONFIG_PM 506#ifdef CONFIG_PM
525/* Disable watchdog if it is active during suspend */ 507/* Disable watchdog if it is active during suspend */
526static int kempld_wdt_suspend(struct platform_device *pdev, 508static int kempld_wdt_suspend(struct platform_device *pdev,
@@ -567,8 +549,6 @@ static struct platform_driver kempld_wdt_driver = {
567 .name = "kempld-wdt", 549 .name = "kempld-wdt",
568 }, 550 },
569 .probe = kempld_wdt_probe, 551 .probe = kempld_wdt_probe,
570 .remove = kempld_wdt_remove,
571 .shutdown = kempld_wdt_shutdown,
572 .suspend = kempld_wdt_suspend, 552 .suspend = kempld_wdt_suspend,
573 .resume = kempld_wdt_resume, 553 .resume = kempld_wdt_resume,
574}; 554};
diff --git a/drivers/watchdog/lantiq_wdt.c b/drivers/watchdog/lantiq_wdt.c
index 83da84d6074b..4caf02ba5d49 100644
--- a/drivers/watchdog/lantiq_wdt.c
+++ b/drivers/watchdog/lantiq_wdt.c
@@ -203,7 +203,6 @@ static int ltq_wdt_probe(struct platform_device *pdev)
203 struct device *dev = &pdev->dev; 203 struct device *dev = &pdev->dev;
204 struct ltq_wdt_priv *priv; 204 struct ltq_wdt_priv *priv;
205 struct watchdog_device *wdt; 205 struct watchdog_device *wdt;
206 struct resource *res;
207 struct clk *clk; 206 struct clk *clk;
208 const struct ltq_wdt_hw *ltq_wdt_hw; 207 const struct ltq_wdt_hw *ltq_wdt_hw;
209 int ret; 208 int ret;
@@ -213,8 +212,7 @@ static int ltq_wdt_probe(struct platform_device *pdev)
213 if (!priv) 212 if (!priv)
214 return -ENOMEM; 213 return -ENOMEM;
215 214
216 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 215 priv->membase = devm_platform_ioremap_resource(pdev, 0);
217 priv->membase = devm_ioremap_resource(dev, res);
218 if (IS_ERR(priv->membase)) 216 if (IS_ERR(priv->membase))
219 return PTR_ERR(priv->membase); 217 return PTR_ERR(priv->membase);
220 218
diff --git a/drivers/watchdog/loongson1_wdt.c b/drivers/watchdog/loongson1_wdt.c
index 3aee50c64a36..d8075e2affa7 100644
--- a/drivers/watchdog/loongson1_wdt.c
+++ b/drivers/watchdog/loongson1_wdt.c
@@ -83,38 +83,44 @@ static const struct watchdog_ops ls1x_wdt_ops = {
83 .set_timeout = ls1x_wdt_set_timeout, 83 .set_timeout = ls1x_wdt_set_timeout,
84}; 84};
85 85
86static void ls1x_clk_disable_unprepare(void *data)
87{
88 clk_disable_unprepare(data);
89}
90
86static int ls1x_wdt_probe(struct platform_device *pdev) 91static int ls1x_wdt_probe(struct platform_device *pdev)
87{ 92{
93 struct device *dev = &pdev->dev;
88 struct ls1x_wdt_drvdata *drvdata; 94 struct ls1x_wdt_drvdata *drvdata;
89 struct watchdog_device *ls1x_wdt; 95 struct watchdog_device *ls1x_wdt;
90 unsigned long clk_rate; 96 unsigned long clk_rate;
91 struct resource *res;
92 int err; 97 int err;
93 98
94 drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL); 99 drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
95 if (!drvdata) 100 if (!drvdata)
96 return -ENOMEM; 101 return -ENOMEM;
97 102
98 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 103 drvdata->base = devm_platform_ioremap_resource(pdev, 0);
99 drvdata->base = devm_ioremap_resource(&pdev->dev, res);
100 if (IS_ERR(drvdata->base)) 104 if (IS_ERR(drvdata->base))
101 return PTR_ERR(drvdata->base); 105 return PTR_ERR(drvdata->base);
102 106
103 drvdata->clk = devm_clk_get(&pdev->dev, pdev->name); 107 drvdata->clk = devm_clk_get(dev, pdev->name);
104 if (IS_ERR(drvdata->clk)) 108 if (IS_ERR(drvdata->clk))
105 return PTR_ERR(drvdata->clk); 109 return PTR_ERR(drvdata->clk);
106 110
107 err = clk_prepare_enable(drvdata->clk); 111 err = clk_prepare_enable(drvdata->clk);
108 if (err) { 112 if (err) {
109 dev_err(&pdev->dev, "clk enable failed\n"); 113 dev_err(dev, "clk enable failed\n");
110 return err; 114 return err;
111 } 115 }
116 err = devm_add_action_or_reset(dev, ls1x_clk_disable_unprepare,
117 drvdata->clk);
118 if (err)
119 return err;
112 120
113 clk_rate = clk_get_rate(drvdata->clk); 121 clk_rate = clk_get_rate(drvdata->clk);
114 if (!clk_rate) { 122 if (!clk_rate)
115 err = -EINVAL; 123 return -EINVAL;
116 goto err0;
117 }
118 drvdata->clk_rate = clk_rate; 124 drvdata->clk_rate = clk_rate;
119 125
120 ls1x_wdt = &drvdata->wdt; 126 ls1x_wdt = &drvdata->wdt;
@@ -123,41 +129,27 @@ static int ls1x_wdt_probe(struct platform_device *pdev)
123 ls1x_wdt->timeout = DEFAULT_HEARTBEAT; 129 ls1x_wdt->timeout = DEFAULT_HEARTBEAT;
124 ls1x_wdt->min_timeout = 1; 130 ls1x_wdt->min_timeout = 1;
125 ls1x_wdt->max_hw_heartbeat_ms = U32_MAX / clk_rate * 1000; 131 ls1x_wdt->max_hw_heartbeat_ms = U32_MAX / clk_rate * 1000;
126 ls1x_wdt->parent = &pdev->dev; 132 ls1x_wdt->parent = dev;
127 133
128 watchdog_init_timeout(ls1x_wdt, heartbeat, &pdev->dev); 134 watchdog_init_timeout(ls1x_wdt, heartbeat, dev);
129 watchdog_set_nowayout(ls1x_wdt, nowayout); 135 watchdog_set_nowayout(ls1x_wdt, nowayout);
130 watchdog_set_drvdata(ls1x_wdt, drvdata); 136 watchdog_set_drvdata(ls1x_wdt, drvdata);
131 137
132 err = watchdog_register_device(&drvdata->wdt); 138 err = devm_watchdog_register_device(dev, &drvdata->wdt);
133 if (err) { 139 if (err) {
134 dev_err(&pdev->dev, "failed to register watchdog device\n"); 140 dev_err(dev, "failed to register watchdog device\n");
135 goto err0; 141 return err;
136 } 142 }
137 143
138 platform_set_drvdata(pdev, drvdata); 144 platform_set_drvdata(pdev, drvdata);
139 145
140 dev_info(&pdev->dev, "Loongson1 Watchdog driver registered\n"); 146 dev_info(dev, "Loongson1 Watchdog driver registered\n");
141
142 return 0;
143err0:
144 clk_disable_unprepare(drvdata->clk);
145 return err;
146}
147
148static int ls1x_wdt_remove(struct platform_device *pdev)
149{
150 struct ls1x_wdt_drvdata *drvdata = platform_get_drvdata(pdev);
151
152 watchdog_unregister_device(&drvdata->wdt);
153 clk_disable_unprepare(drvdata->clk);
154 147
155 return 0; 148 return 0;
156} 149}
157 150
158static struct platform_driver ls1x_wdt_driver = { 151static struct platform_driver ls1x_wdt_driver = {
159 .probe = ls1x_wdt_probe, 152 .probe = ls1x_wdt_probe,
160 .remove = ls1x_wdt_remove,
161 .driver = { 153 .driver = {
162 .name = "ls1x-wdt", 154 .name = "ls1x-wdt",
163 }, 155 },
diff --git a/drivers/watchdog/lpc18xx_wdt.c b/drivers/watchdog/lpc18xx_wdt.c
index 331cadb459ac..0e82abd71d35 100644
--- a/drivers/watchdog/lpc18xx_wdt.c
+++ b/drivers/watchdog/lpc18xx_wdt.c
@@ -200,19 +200,22 @@ static const struct watchdog_ops lpc18xx_wdt_ops = {
200 .restart = lpc18xx_wdt_restart, 200 .restart = lpc18xx_wdt_restart,
201}; 201};
202 202
203static void lpc18xx_clk_disable_unprepare(void *data)
204{
205 clk_disable_unprepare(data);
206}
207
203static int lpc18xx_wdt_probe(struct platform_device *pdev) 208static int lpc18xx_wdt_probe(struct platform_device *pdev)
204{ 209{
205 struct lpc18xx_wdt_dev *lpc18xx_wdt; 210 struct lpc18xx_wdt_dev *lpc18xx_wdt;
206 struct device *dev = &pdev->dev; 211 struct device *dev = &pdev->dev;
207 struct resource *res;
208 int ret; 212 int ret;
209 213
210 lpc18xx_wdt = devm_kzalloc(dev, sizeof(*lpc18xx_wdt), GFP_KERNEL); 214 lpc18xx_wdt = devm_kzalloc(dev, sizeof(*lpc18xx_wdt), GFP_KERNEL);
211 if (!lpc18xx_wdt) 215 if (!lpc18xx_wdt)
212 return -ENOMEM; 216 return -ENOMEM;
213 217
214 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 218 lpc18xx_wdt->base = devm_platform_ioremap_resource(pdev, 0);
215 lpc18xx_wdt->base = devm_ioremap_resource(dev, res);
216 if (IS_ERR(lpc18xx_wdt->base)) 219 if (IS_ERR(lpc18xx_wdt->base))
217 return PTR_ERR(lpc18xx_wdt->base); 220 return PTR_ERR(lpc18xx_wdt->base);
218 221
@@ -233,19 +236,26 @@ static int lpc18xx_wdt_probe(struct platform_device *pdev)
233 dev_err(dev, "could not prepare or enable sys clock\n"); 236 dev_err(dev, "could not prepare or enable sys clock\n");
234 return ret; 237 return ret;
235 } 238 }
239 ret = devm_add_action_or_reset(dev, lpc18xx_clk_disable_unprepare,
240 lpc18xx_wdt->reg_clk);
241 if (ret)
242 return ret;
236 243
237 ret = clk_prepare_enable(lpc18xx_wdt->wdt_clk); 244 ret = clk_prepare_enable(lpc18xx_wdt->wdt_clk);
238 if (ret) { 245 if (ret) {
239 dev_err(dev, "could not prepare or enable wdt clock\n"); 246 dev_err(dev, "could not prepare or enable wdt clock\n");
240 goto disable_reg_clk; 247 return ret;
241 } 248 }
249 ret = devm_add_action_or_reset(dev, lpc18xx_clk_disable_unprepare,
250 lpc18xx_wdt->wdt_clk);
251 if (ret)
252 return ret;
242 253
243 /* We use the clock rate to calculate timeouts */ 254 /* We use the clock rate to calculate timeouts */
244 lpc18xx_wdt->clk_rate = clk_get_rate(lpc18xx_wdt->wdt_clk); 255 lpc18xx_wdt->clk_rate = clk_get_rate(lpc18xx_wdt->wdt_clk);
245 if (lpc18xx_wdt->clk_rate == 0) { 256 if (lpc18xx_wdt->clk_rate == 0) {
246 dev_err(dev, "failed to get clock rate\n"); 257 dev_err(dev, "failed to get clock rate\n");
247 ret = -EINVAL; 258 return -EINVAL;
248 goto disable_wdt_clk;
249 } 259 }
250 260
251 lpc18xx_wdt->wdt_dev.info = &lpc18xx_wdt_info; 261 lpc18xx_wdt->wdt_dev.info = &lpc18xx_wdt_info;
@@ -276,24 +286,8 @@ static int lpc18xx_wdt_probe(struct platform_device *pdev)
276 286
277 platform_set_drvdata(pdev, lpc18xx_wdt); 287 platform_set_drvdata(pdev, lpc18xx_wdt);
278 288
279 ret = watchdog_register_device(&lpc18xx_wdt->wdt_dev); 289 watchdog_stop_on_reboot(&lpc18xx_wdt->wdt_dev);
280 if (ret) 290 return devm_watchdog_register_device(dev, &lpc18xx_wdt->wdt_dev);
281 goto disable_wdt_clk;
282
283 return 0;
284
285disable_wdt_clk:
286 clk_disable_unprepare(lpc18xx_wdt->wdt_clk);
287disable_reg_clk:
288 clk_disable_unprepare(lpc18xx_wdt->reg_clk);
289 return ret;
290}
291
292static void lpc18xx_wdt_shutdown(struct platform_device *pdev)
293{
294 struct lpc18xx_wdt_dev *lpc18xx_wdt = platform_get_drvdata(pdev);
295
296 lpc18xx_wdt_stop(&lpc18xx_wdt->wdt_dev);
297} 291}
298 292
299static int lpc18xx_wdt_remove(struct platform_device *pdev) 293static int lpc18xx_wdt_remove(struct platform_device *pdev)
@@ -303,10 +297,6 @@ static int lpc18xx_wdt_remove(struct platform_device *pdev)
303 dev_warn(&pdev->dev, "I quit now, hardware will probably reboot!\n"); 297 dev_warn(&pdev->dev, "I quit now, hardware will probably reboot!\n");
304 del_timer(&lpc18xx_wdt->timer); 298 del_timer(&lpc18xx_wdt->timer);
305 299
306 watchdog_unregister_device(&lpc18xx_wdt->wdt_dev);
307 clk_disable_unprepare(lpc18xx_wdt->wdt_clk);
308 clk_disable_unprepare(lpc18xx_wdt->reg_clk);
309
310 return 0; 300 return 0;
311} 301}
312 302
@@ -323,7 +313,6 @@ static struct platform_driver lpc18xx_wdt_driver = {
323 }, 313 },
324 .probe = lpc18xx_wdt_probe, 314 .probe = lpc18xx_wdt_probe,
325 .remove = lpc18xx_wdt_remove, 315 .remove = lpc18xx_wdt_remove,
326 .shutdown = lpc18xx_wdt_shutdown,
327}; 316};
328module_platform_driver(lpc18xx_wdt_driver); 317module_platform_driver(lpc18xx_wdt_driver);
329 318
diff --git a/drivers/watchdog/machzwd.c b/drivers/watchdog/machzwd.c
index 53759415cf06..c0c9e948adbc 100644
--- a/drivers/watchdog/machzwd.c
+++ b/drivers/watchdog/machzwd.c
@@ -177,6 +177,7 @@ static inline void zf_set_timer(unsigned short new, unsigned char n)
177 switch (n) { 177 switch (n) {
178 case WD1: 178 case WD1:
179 zf_writew(COUNTER_1, new); 179 zf_writew(COUNTER_1, new);
180 /* fall through */
180 case WD2: 181 case WD2:
181 zf_writeb(COUNTER_2, new > 0xff ? 0xff : new); 182 zf_writeb(COUNTER_2, new > 0xff ? 0xff : new);
182 default: 183 default:
@@ -318,7 +319,7 @@ static long zf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
318 case WDIOC_GETBOOTSTATUS: 319 case WDIOC_GETBOOTSTATUS:
319 return put_user(0, p); 320 return put_user(0, p);
320 case WDIOC_KEEPALIVE: 321 case WDIOC_KEEPALIVE:
321 zf_ping(0); 322 zf_ping(NULL);
322 break; 323 break;
323 default: 324 default:
324 return -ENOTTY; 325 return -ENOTTY;
diff --git a/drivers/watchdog/max63xx_wdt.c b/drivers/watchdog/max63xx_wdt.c
index bf6a068245ba..3a899628a834 100644
--- a/drivers/watchdog/max63xx_wdt.c
+++ b/drivers/watchdog/max63xx_wdt.c
@@ -187,9 +187,7 @@ static void max63xx_mmap_set(struct max63xx_wdt *wdt, u8 set)
187 187
188static int max63xx_mmap_init(struct platform_device *p, struct max63xx_wdt *wdt) 188static int max63xx_mmap_init(struct platform_device *p, struct max63xx_wdt *wdt)
189{ 189{
190 struct resource *mem = platform_get_resource(p, IORESOURCE_MEM, 0); 190 wdt->base = devm_platform_ioremap_resource(p, 0);
191
192 wdt->base = devm_ioremap_resource(&p->dev, mem);
193 if (IS_ERR(wdt->base)) 191 if (IS_ERR(wdt->base))
194 return PTR_ERR(wdt->base); 192 return PTR_ERR(wdt->base);
195 193
@@ -202,11 +200,12 @@ static int max63xx_mmap_init(struct platform_device *p, struct max63xx_wdt *wdt)
202 200
203static int max63xx_wdt_probe(struct platform_device *pdev) 201static int max63xx_wdt_probe(struct platform_device *pdev)
204{ 202{
203 struct device *dev = &pdev->dev;
205 struct max63xx_wdt *wdt; 204 struct max63xx_wdt *wdt;
206 struct max63xx_timeout *table; 205 struct max63xx_timeout *table;
207 int err; 206 int err;
208 207
209 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 208 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
210 if (!wdt) 209 if (!wdt)
211 return -ENOMEM; 210 return -ENOMEM;
212 211
@@ -217,7 +216,7 @@ static int max63xx_wdt_probe(struct platform_device *pdev)
217 216
218 wdt->timeout = max63xx_select_timeout(table, heartbeat); 217 wdt->timeout = max63xx_select_timeout(table, heartbeat);
219 if (!wdt->timeout) { 218 if (!wdt->timeout) {
220 dev_err(&pdev->dev, "unable to satisfy %ds heartbeat request\n", 219 dev_err(dev, "unable to satisfy %ds heartbeat request\n",
221 heartbeat); 220 heartbeat);
222 return -EINVAL; 221 return -EINVAL;
223 } 222 }
@@ -229,30 +228,22 @@ static int max63xx_wdt_probe(struct platform_device *pdev)
229 platform_set_drvdata(pdev, &wdt->wdd); 228 platform_set_drvdata(pdev, &wdt->wdd);
230 watchdog_set_drvdata(&wdt->wdd, wdt); 229 watchdog_set_drvdata(&wdt->wdd, wdt);
231 230
232 wdt->wdd.parent = &pdev->dev; 231 wdt->wdd.parent = dev;
233 wdt->wdd.timeout = wdt->timeout->twd; 232 wdt->wdd.timeout = wdt->timeout->twd;
234 wdt->wdd.info = &max63xx_wdt_info; 233 wdt->wdd.info = &max63xx_wdt_info;
235 wdt->wdd.ops = &max63xx_wdt_ops; 234 wdt->wdd.ops = &max63xx_wdt_ops;
236 235
237 watchdog_set_nowayout(&wdt->wdd, nowayout); 236 watchdog_set_nowayout(&wdt->wdd, nowayout);
238 237
239 err = watchdog_register_device(&wdt->wdd); 238 err = devm_watchdog_register_device(dev, &wdt->wdd);
240 if (err) 239 if (err)
241 return err; 240 return err;
242 241
243 dev_info(&pdev->dev, "using %ds heartbeat with %ds initial delay\n", 242 dev_info(dev, "using %ds heartbeat with %ds initial delay\n",
244 wdt->timeout->twd, wdt->timeout->tdelay); 243 wdt->timeout->twd, wdt->timeout->tdelay);
245 return 0; 244 return 0;
246} 245}
247 246
248static int max63xx_wdt_remove(struct platform_device *pdev)
249{
250 struct watchdog_device *wdd = platform_get_drvdata(pdev);
251
252 watchdog_unregister_device(wdd);
253 return 0;
254}
255
256static const struct platform_device_id max63xx_id_table[] = { 247static const struct platform_device_id max63xx_id_table[] = {
257 { "max6369_wdt", (kernel_ulong_t)max6369_table, }, 248 { "max6369_wdt", (kernel_ulong_t)max6369_table, },
258 { "max6370_wdt", (kernel_ulong_t)max6369_table, }, 249 { "max6370_wdt", (kernel_ulong_t)max6369_table, },
@@ -266,7 +257,6 @@ MODULE_DEVICE_TABLE(platform, max63xx_id_table);
266 257
267static struct platform_driver max63xx_wdt_driver = { 258static struct platform_driver max63xx_wdt_driver = {
268 .probe = max63xx_wdt_probe, 259 .probe = max63xx_wdt_probe,
269 .remove = max63xx_wdt_remove,
270 .id_table = max63xx_id_table, 260 .id_table = max63xx_id_table,
271 .driver = { 261 .driver = {
272 .name = "max63xx_wdt", 262 .name = "max63xx_wdt",
diff --git a/drivers/watchdog/max77620_wdt.c b/drivers/watchdog/max77620_wdt.c
index 70c9cd3ba938..3ca6b9337932 100644
--- a/drivers/watchdog/max77620_wdt.c
+++ b/drivers/watchdog/max77620_wdt.c
@@ -112,17 +112,18 @@ static const struct watchdog_ops max77620_wdt_ops = {
112 112
113static int max77620_wdt_probe(struct platform_device *pdev) 113static int max77620_wdt_probe(struct platform_device *pdev)
114{ 114{
115 struct device *dev = &pdev->dev;
115 struct max77620_wdt *wdt; 116 struct max77620_wdt *wdt;
116 struct watchdog_device *wdt_dev; 117 struct watchdog_device *wdt_dev;
117 unsigned int regval; 118 unsigned int regval;
118 int ret; 119 int ret;
119 120
120 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 121 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
121 if (!wdt) 122 if (!wdt)
122 return -ENOMEM; 123 return -ENOMEM;
123 124
124 wdt->dev = &pdev->dev; 125 wdt->dev = dev;
125 wdt->rmap = dev_get_regmap(pdev->dev.parent, NULL); 126 wdt->rmap = dev_get_regmap(dev->parent, NULL);
126 if (!wdt->rmap) { 127 if (!wdt->rmap) {
127 dev_err(wdt->dev, "Failed to get parent regmap\n"); 128 dev_err(wdt->dev, "Failed to get parent regmap\n");
128 return -ENODEV; 129 return -ENODEV;
@@ -183,25 +184,16 @@ static int max77620_wdt_probe(struct platform_device *pdev)
183 watchdog_set_nowayout(wdt_dev, nowayout); 184 watchdog_set_nowayout(wdt_dev, nowayout);
184 watchdog_set_drvdata(wdt_dev, wdt); 185 watchdog_set_drvdata(wdt_dev, wdt);
185 186
186 ret = watchdog_register_device(wdt_dev); 187 watchdog_stop_on_unregister(wdt_dev);
188 ret = devm_watchdog_register_device(dev, wdt_dev);
187 if (ret < 0) { 189 if (ret < 0) {
188 dev_err(&pdev->dev, "watchdog registration failed: %d\n", ret); 190 dev_err(dev, "watchdog registration failed: %d\n", ret);
189 return ret; 191 return ret;
190 } 192 }
191 193
192 return 0; 194 return 0;
193} 195}
194 196
195static int max77620_wdt_remove(struct platform_device *pdev)
196{
197 struct max77620_wdt *wdt = platform_get_drvdata(pdev);
198
199 max77620_wdt_stop(&wdt->wdt_dev);
200 watchdog_unregister_device(&wdt->wdt_dev);
201
202 return 0;
203}
204
205static const struct platform_device_id max77620_wdt_devtype[] = { 197static const struct platform_device_id max77620_wdt_devtype[] = {
206 { .name = "max77620-watchdog", }, 198 { .name = "max77620-watchdog", },
207 { }, 199 { },
@@ -213,7 +205,6 @@ static struct platform_driver max77620_wdt_driver = {
213 .name = "max77620-watchdog", 205 .name = "max77620-watchdog",
214 }, 206 },
215 .probe = max77620_wdt_probe, 207 .probe = max77620_wdt_probe,
216 .remove = max77620_wdt_remove,
217 .id_table = max77620_wdt_devtype, 208 .id_table = max77620_wdt_devtype,
218}; 209};
219 210
diff --git a/drivers/watchdog/mena21_wdt.c b/drivers/watchdog/mena21_wdt.c
index 6db69883ece6..e9ca4e0e25dc 100644
--- a/drivers/watchdog/mena21_wdt.c
+++ b/drivers/watchdog/mena21_wdt.c
@@ -127,19 +127,20 @@ static struct watchdog_device a21_wdt = {
127 127
128static int a21_wdt_probe(struct platform_device *pdev) 128static int a21_wdt_probe(struct platform_device *pdev)
129{ 129{
130 struct device *dev = &pdev->dev;
130 struct a21_wdt_drv *drv; 131 struct a21_wdt_drv *drv;
131 unsigned int reset = 0; 132 unsigned int reset = 0;
132 int num_gpios; 133 int num_gpios;
133 int ret; 134 int ret;
134 int i; 135 int i;
135 136
136 drv = devm_kzalloc(&pdev->dev, sizeof(struct a21_wdt_drv), GFP_KERNEL); 137 drv = devm_kzalloc(dev, sizeof(struct a21_wdt_drv), GFP_KERNEL);
137 if (!drv) 138 if (!drv)
138 return -ENOMEM; 139 return -ENOMEM;
139 140
140 num_gpios = gpiod_count(&pdev->dev, NULL); 141 num_gpios = gpiod_count(dev, NULL);
141 if (num_gpios != NUM_GPIOS) { 142 if (num_gpios != NUM_GPIOS) {
142 dev_err(&pdev->dev, "gpios DT property wrong, got %d want %d", 143 dev_err(dev, "gpios DT property wrong, got %d want %d",
143 num_gpios, NUM_GPIOS); 144 num_gpios, NUM_GPIOS);
144 return -ENODEV; 145 return -ENODEV;
145 } 146 }
@@ -152,12 +153,9 @@ static int a21_wdt_probe(struct platform_device *pdev)
152 gflags = GPIOD_ASIS; 153 gflags = GPIOD_ASIS;
153 else 154 else
154 gflags = GPIOD_IN; 155 gflags = GPIOD_IN;
155 drv->gpios[i] = devm_gpiod_get_index(&pdev->dev, NULL, i, 156 drv->gpios[i] = devm_gpiod_get_index(dev, NULL, i, gflags);
156 gflags); 157 if (IS_ERR(drv->gpios[i]))
157 if (IS_ERR(drv->gpios[i])) { 158 return PTR_ERR(drv->gpios[i]);
158 ret = PTR_ERR(drv->gpios[i]);
159 return ret;
160 }
161 159
162 gpiod_set_consumer_name(drv->gpios[i], "MEN A21 Watchdog"); 160 gpiod_set_consumer_name(drv->gpios[i], "MEN A21 Watchdog");
163 161
@@ -173,10 +171,10 @@ static int a21_wdt_probe(struct platform_device *pdev)
173 } 171 }
174 } 172 }
175 173
176 watchdog_init_timeout(&a21_wdt, 30, &pdev->dev); 174 watchdog_init_timeout(&a21_wdt, 30, dev);
177 watchdog_set_nowayout(&a21_wdt, nowayout); 175 watchdog_set_nowayout(&a21_wdt, nowayout);
178 watchdog_set_drvdata(&a21_wdt, drv); 176 watchdog_set_drvdata(&a21_wdt, drv);
179 a21_wdt.parent = &pdev->dev; 177 a21_wdt.parent = dev;
180 178
181 reset = a21_wdt_get_bootstatus(drv); 179 reset = a21_wdt_get_bootstatus(drv);
182 if (reset == 2) 180 if (reset == 2)
@@ -189,15 +187,15 @@ static int a21_wdt_probe(struct platform_device *pdev)
189 a21_wdt.bootstatus |= WDIOF_EXTERN2; 187 a21_wdt.bootstatus |= WDIOF_EXTERN2;
190 188
191 drv->wdt = a21_wdt; 189 drv->wdt = a21_wdt;
192 dev_set_drvdata(&pdev->dev, drv); 190 dev_set_drvdata(dev, drv);
193 191
194 ret = devm_watchdog_register_device(&pdev->dev, &a21_wdt); 192 ret = devm_watchdog_register_device(dev, &a21_wdt);
195 if (ret) { 193 if (ret) {
196 dev_err(&pdev->dev, "Cannot register watchdog device\n"); 194 dev_err(dev, "Cannot register watchdog device\n");
197 return ret; 195 return ret;
198 } 196 }
199 197
200 dev_info(&pdev->dev, "MEN A21 watchdog timer driver enabled\n"); 198 dev_info(dev, "MEN A21 watchdog timer driver enabled\n");
201 199
202 return 0; 200 return 0;
203} 201}
diff --git a/drivers/watchdog/menf21bmc_wdt.c b/drivers/watchdog/menf21bmc_wdt.c
index 3aefddebb386..b1dbff553cdc 100644
--- a/drivers/watchdog/menf21bmc_wdt.c
+++ b/drivers/watchdog/menf21bmc_wdt.c
@@ -117,12 +117,12 @@ static const struct watchdog_ops menf21bmc_wdt_ops = {
117 117
118static int menf21bmc_wdt_probe(struct platform_device *pdev) 118static int menf21bmc_wdt_probe(struct platform_device *pdev)
119{ 119{
120 struct device *dev = &pdev->dev;
120 int ret, bmc_timeout; 121 int ret, bmc_timeout;
121 struct menf21bmc_wdt *drv_data; 122 struct menf21bmc_wdt *drv_data;
122 struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent); 123 struct i2c_client *i2c_client = to_i2c_client(dev->parent);
123 124
124 drv_data = devm_kzalloc(&pdev->dev, 125 drv_data = devm_kzalloc(dev, sizeof(struct menf21bmc_wdt), GFP_KERNEL);
125 sizeof(struct menf21bmc_wdt), GFP_KERNEL);
126 if (!drv_data) 126 if (!drv_data)
127 return -ENOMEM; 127 return -ENOMEM;
128 128
@@ -130,7 +130,7 @@ static int menf21bmc_wdt_probe(struct platform_device *pdev)
130 drv_data->wdt.info = &menf21bmc_wdt_info; 130 drv_data->wdt.info = &menf21bmc_wdt_info;
131 drv_data->wdt.min_timeout = BMC_WD_TIMEOUT_MIN; 131 drv_data->wdt.min_timeout = BMC_WD_TIMEOUT_MIN;
132 drv_data->wdt.max_timeout = BMC_WD_TIMEOUT_MAX; 132 drv_data->wdt.max_timeout = BMC_WD_TIMEOUT_MAX;
133 drv_data->wdt.parent = &pdev->dev; 133 drv_data->wdt.parent = dev;
134 drv_data->i2c_client = i2c_client; 134 drv_data->i2c_client = i2c_client;
135 135
136 /* 136 /*
@@ -140,40 +140,28 @@ static int menf21bmc_wdt_probe(struct platform_device *pdev)
140 bmc_timeout = i2c_smbus_read_word_data(drv_data->i2c_client, 140 bmc_timeout = i2c_smbus_read_word_data(drv_data->i2c_client,
141 BMC_CMD_WD_TIME); 141 BMC_CMD_WD_TIME);
142 if (bmc_timeout < 0) { 142 if (bmc_timeout < 0) {
143 dev_err(&pdev->dev, "failed to get current WDT timeout\n"); 143 dev_err(dev, "failed to get current WDT timeout\n");
144 return bmc_timeout; 144 return bmc_timeout;
145 } 145 }
146 146
147 watchdog_init_timeout(&drv_data->wdt, bmc_timeout / 10, &pdev->dev); 147 watchdog_init_timeout(&drv_data->wdt, bmc_timeout / 10, dev);
148 watchdog_set_nowayout(&drv_data->wdt, nowayout); 148 watchdog_set_nowayout(&drv_data->wdt, nowayout);
149 watchdog_set_drvdata(&drv_data->wdt, drv_data); 149 watchdog_set_drvdata(&drv_data->wdt, drv_data);
150 platform_set_drvdata(pdev, drv_data); 150 platform_set_drvdata(pdev, drv_data);
151 151
152 ret = menf21bmc_wdt_set_bootstatus(drv_data); 152 ret = menf21bmc_wdt_set_bootstatus(drv_data);
153 if (ret < 0) { 153 if (ret < 0) {
154 dev_err(&pdev->dev, "failed to set Watchdog bootstatus\n"); 154 dev_err(dev, "failed to set Watchdog bootstatus\n");
155 return ret; 155 return ret;
156 } 156 }
157 157
158 ret = watchdog_register_device(&drv_data->wdt); 158 ret = devm_watchdog_register_device(dev, &drv_data->wdt);
159 if (ret) { 159 if (ret) {
160 dev_err(&pdev->dev, "failed to register Watchdog device\n"); 160 dev_err(dev, "failed to register Watchdog device\n");
161 return ret; 161 return ret;
162 } 162 }
163 163
164 dev_info(&pdev->dev, "MEN 14F021P00 BMC Watchdog device enabled\n"); 164 dev_info(dev, "MEN 14F021P00 BMC Watchdog device enabled\n");
165
166 return 0;
167}
168
169static int menf21bmc_wdt_remove(struct platform_device *pdev)
170{
171 struct menf21bmc_wdt *drv_data = platform_get_drvdata(pdev);
172
173 dev_warn(&pdev->dev,
174 "Unregister MEN 14F021P00 BMC Watchdog device, board may reset\n");
175
176 watchdog_unregister_device(&drv_data->wdt);
177 165
178 return 0; 166 return 0;
179} 167}
@@ -191,7 +179,6 @@ static struct platform_driver menf21bmc_wdt = {
191 .name = DEVNAME, 179 .name = DEVNAME,
192 }, 180 },
193 .probe = menf21bmc_wdt_probe, 181 .probe = menf21bmc_wdt_probe,
194 .remove = menf21bmc_wdt_remove,
195 .shutdown = menf21bmc_wdt_shutdown, 182 .shutdown = menf21bmc_wdt_shutdown,
196}; 183};
197 184
diff --git a/drivers/watchdog/meson_gxbb_wdt.c b/drivers/watchdog/meson_gxbb_wdt.c
index 69adeab3fde7..d17c1a6ed723 100644
--- a/drivers/watchdog/meson_gxbb_wdt.c
+++ b/drivers/watchdog/meson_gxbb_wdt.c
@@ -136,32 +136,40 @@ static const struct of_device_id meson_gxbb_wdt_dt_ids[] = {
136}; 136};
137MODULE_DEVICE_TABLE(of, meson_gxbb_wdt_dt_ids); 137MODULE_DEVICE_TABLE(of, meson_gxbb_wdt_dt_ids);
138 138
139static void meson_clk_disable_unprepare(void *data)
140{
141 clk_disable_unprepare(data);
142}
143
139static int meson_gxbb_wdt_probe(struct platform_device *pdev) 144static int meson_gxbb_wdt_probe(struct platform_device *pdev)
140{ 145{
146 struct device *dev = &pdev->dev;
141 struct meson_gxbb_wdt *data; 147 struct meson_gxbb_wdt *data;
142 struct resource *res;
143 int ret; 148 int ret;
144 149
145 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); 150 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
146 if (!data) 151 if (!data)
147 return -ENOMEM; 152 return -ENOMEM;
148 153
149 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 154 data->reg_base = devm_platform_ioremap_resource(pdev, 0);
150 data->reg_base = devm_ioremap_resource(&pdev->dev, res);
151 if (IS_ERR(data->reg_base)) 155 if (IS_ERR(data->reg_base))
152 return PTR_ERR(data->reg_base); 156 return PTR_ERR(data->reg_base);
153 157
154 data->clk = devm_clk_get(&pdev->dev, NULL); 158 data->clk = devm_clk_get(dev, NULL);
155 if (IS_ERR(data->clk)) 159 if (IS_ERR(data->clk))
156 return PTR_ERR(data->clk); 160 return PTR_ERR(data->clk);
157 161
158 ret = clk_prepare_enable(data->clk); 162 ret = clk_prepare_enable(data->clk);
159 if (ret) 163 if (ret)
160 return ret; 164 return ret;
165 ret = devm_add_action_or_reset(dev, meson_clk_disable_unprepare,
166 data->clk);
167 if (ret)
168 return ret;
161 169
162 platform_set_drvdata(pdev, data); 170 platform_set_drvdata(pdev, data);
163 171
164 data->wdt_dev.parent = &pdev->dev; 172 data->wdt_dev.parent = dev;
165 data->wdt_dev.info = &meson_gxbb_wdt_info; 173 data->wdt_dev.info = &meson_gxbb_wdt_info;
166 data->wdt_dev.ops = &meson_gxbb_wdt_ops; 174 data->wdt_dev.ops = &meson_gxbb_wdt_ops;
167 data->wdt_dev.max_hw_heartbeat_ms = GXBB_WDT_TCNT_SETUP_MASK; 175 data->wdt_dev.max_hw_heartbeat_ms = GXBB_WDT_TCNT_SETUP_MASK;
@@ -178,37 +186,12 @@ static int meson_gxbb_wdt_probe(struct platform_device *pdev)
178 186
179 meson_gxbb_wdt_set_timeout(&data->wdt_dev, data->wdt_dev.timeout); 187 meson_gxbb_wdt_set_timeout(&data->wdt_dev, data->wdt_dev.timeout);
180 188
181 ret = watchdog_register_device(&data->wdt_dev); 189 watchdog_stop_on_reboot(&data->wdt_dev);
182 if (ret) { 190 return devm_watchdog_register_device(dev, &data->wdt_dev);
183 clk_disable_unprepare(data->clk);
184 return ret;
185 }
186
187 return 0;
188}
189
190static int meson_gxbb_wdt_remove(struct platform_device *pdev)
191{
192 struct meson_gxbb_wdt *data = platform_get_drvdata(pdev);
193
194 watchdog_unregister_device(&data->wdt_dev);
195
196 clk_disable_unprepare(data->clk);
197
198 return 0;
199}
200
201static void meson_gxbb_wdt_shutdown(struct platform_device *pdev)
202{
203 struct meson_gxbb_wdt *data = platform_get_drvdata(pdev);
204
205 meson_gxbb_wdt_stop(&data->wdt_dev);
206} 191}
207 192
208static struct platform_driver meson_gxbb_wdt_driver = { 193static struct platform_driver meson_gxbb_wdt_driver = {
209 .probe = meson_gxbb_wdt_probe, 194 .probe = meson_gxbb_wdt_probe,
210 .remove = meson_gxbb_wdt_remove,
211 .shutdown = meson_gxbb_wdt_shutdown,
212 .driver = { 195 .driver = {
213 .name = "meson-gxbb-wdt", 196 .name = "meson-gxbb-wdt",
214 .pm = &meson_gxbb_wdt_pm_ops, 197 .pm = &meson_gxbb_wdt_pm_ops,
diff --git a/drivers/watchdog/meson_wdt.c b/drivers/watchdog/meson_wdt.c
index cd0275a6cdac..01889cef81e1 100644
--- a/drivers/watchdog/meson_wdt.c
+++ b/drivers/watchdog/meson_wdt.c
@@ -164,28 +164,27 @@ MODULE_DEVICE_TABLE(of, meson_wdt_dt_ids);
164 164
165static int meson_wdt_probe(struct platform_device *pdev) 165static int meson_wdt_probe(struct platform_device *pdev)
166{ 166{
167 struct resource *res; 167 struct device *dev = &pdev->dev;
168 struct meson_wdt_dev *meson_wdt; 168 struct meson_wdt_dev *meson_wdt;
169 const struct of_device_id *of_id; 169 const struct of_device_id *of_id;
170 int err; 170 int err;
171 171
172 meson_wdt = devm_kzalloc(&pdev->dev, sizeof(*meson_wdt), GFP_KERNEL); 172 meson_wdt = devm_kzalloc(dev, sizeof(*meson_wdt), GFP_KERNEL);
173 if (!meson_wdt) 173 if (!meson_wdt)
174 return -ENOMEM; 174 return -ENOMEM;
175 175
176 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 176 meson_wdt->wdt_base = devm_platform_ioremap_resource(pdev, 0);
177 meson_wdt->wdt_base = devm_ioremap_resource(&pdev->dev, res);
178 if (IS_ERR(meson_wdt->wdt_base)) 177 if (IS_ERR(meson_wdt->wdt_base))
179 return PTR_ERR(meson_wdt->wdt_base); 178 return PTR_ERR(meson_wdt->wdt_base);
180 179
181 of_id = of_match_device(meson_wdt_dt_ids, &pdev->dev); 180 of_id = of_match_device(meson_wdt_dt_ids, dev);
182 if (!of_id) { 181 if (!of_id) {
183 dev_err(&pdev->dev, "Unable to initialize WDT data\n"); 182 dev_err(dev, "Unable to initialize WDT data\n");
184 return -ENODEV; 183 return -ENODEV;
185 } 184 }
186 meson_wdt->data = of_id->data; 185 meson_wdt->data = of_id->data;
187 186
188 meson_wdt->wdt_dev.parent = &pdev->dev; 187 meson_wdt->wdt_dev.parent = dev;
189 meson_wdt->wdt_dev.info = &meson_wdt_info; 188 meson_wdt->wdt_dev.info = &meson_wdt_info;
190 meson_wdt->wdt_dev.ops = &meson_wdt_ops; 189 meson_wdt->wdt_dev.ops = &meson_wdt_ops;
191 meson_wdt->wdt_dev.max_timeout = 190 meson_wdt->wdt_dev.max_timeout =
@@ -197,18 +196,18 @@ static int meson_wdt_probe(struct platform_device *pdev)
197 196
198 watchdog_set_drvdata(&meson_wdt->wdt_dev, meson_wdt); 197 watchdog_set_drvdata(&meson_wdt->wdt_dev, meson_wdt);
199 198
200 watchdog_init_timeout(&meson_wdt->wdt_dev, timeout, &pdev->dev); 199 watchdog_init_timeout(&meson_wdt->wdt_dev, timeout, dev);
201 watchdog_set_nowayout(&meson_wdt->wdt_dev, nowayout); 200 watchdog_set_nowayout(&meson_wdt->wdt_dev, nowayout);
202 watchdog_set_restart_priority(&meson_wdt->wdt_dev, 128); 201 watchdog_set_restart_priority(&meson_wdt->wdt_dev, 128);
203 202
204 meson_wdt_stop(&meson_wdt->wdt_dev); 203 meson_wdt_stop(&meson_wdt->wdt_dev);
205 204
206 watchdog_stop_on_reboot(&meson_wdt->wdt_dev); 205 watchdog_stop_on_reboot(&meson_wdt->wdt_dev);
207 err = devm_watchdog_register_device(&pdev->dev, &meson_wdt->wdt_dev); 206 err = devm_watchdog_register_device(dev, &meson_wdt->wdt_dev);
208 if (err) 207 if (err)
209 return err; 208 return err;
210 209
211 dev_info(&pdev->dev, "Watchdog enabled (timeout=%d sec, nowayout=%d)", 210 dev_info(dev, "Watchdog enabled (timeout=%d sec, nowayout=%d)",
212 meson_wdt->wdt_dev.timeout, nowayout); 211 meson_wdt->wdt_dev.timeout, nowayout);
213 212
214 return 0; 213 return 0;
diff --git a/drivers/watchdog/mlx_wdt.c b/drivers/watchdog/mlx_wdt.c
index 70c2cbf9c993..03b9ac4b99af 100644
--- a/drivers/watchdog/mlx_wdt.c
+++ b/drivers/watchdog/mlx_wdt.c
@@ -233,20 +233,21 @@ static int mlxreg_wdt_init_timeout(struct mlxreg_wdt *wdt,
233 233
234static int mlxreg_wdt_probe(struct platform_device *pdev) 234static int mlxreg_wdt_probe(struct platform_device *pdev)
235{ 235{
236 struct device *dev = &pdev->dev;
236 struct mlxreg_core_platform_data *pdata; 237 struct mlxreg_core_platform_data *pdata;
237 struct mlxreg_wdt *wdt; 238 struct mlxreg_wdt *wdt;
238 int rc; 239 int rc;
239 240
240 pdata = dev_get_platdata(&pdev->dev); 241 pdata = dev_get_platdata(dev);
241 if (!pdata) { 242 if (!pdata) {
242 dev_err(&pdev->dev, "Failed to get platform data.\n"); 243 dev_err(dev, "Failed to get platform data.\n");
243 return -EINVAL; 244 return -EINVAL;
244 } 245 }
245 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 246 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
246 if (!wdt) 247 if (!wdt)
247 return -ENOMEM; 248 return -ENOMEM;
248 249
249 wdt->wdd.parent = &pdev->dev; 250 wdt->wdd.parent = dev;
250 wdt->regmap = pdata->regmap; 251 wdt->regmap = pdata->regmap;
251 mlxreg_wdt_config(wdt, pdata); 252 mlxreg_wdt_config(wdt, pdata);
252 253
@@ -266,12 +267,11 @@ static int mlxreg_wdt_probe(struct platform_device *pdev)
266 set_bit(WDOG_HW_RUNNING, &wdt->wdd.status); 267 set_bit(WDOG_HW_RUNNING, &wdt->wdd.status);
267 } 268 }
268 mlxreg_wdt_check_card_reset(wdt); 269 mlxreg_wdt_check_card_reset(wdt);
269 rc = devm_watchdog_register_device(&pdev->dev, &wdt->wdd); 270 rc = devm_watchdog_register_device(dev, &wdt->wdd);
270 271
271register_error: 272register_error:
272 if (rc) 273 if (rc)
273 dev_err(&pdev->dev, 274 dev_err(dev, "Cannot register watchdog device (err=%d)\n", rc);
274 "Cannot register watchdog device (err=%d)\n", rc);
275 return rc; 275 return rc;
276} 276}
277 277
diff --git a/drivers/watchdog/moxart_wdt.c b/drivers/watchdog/moxart_wdt.c
index 430c3ab84c07..6340a1f5f471 100644
--- a/drivers/watchdog/moxart_wdt.c
+++ b/drivers/watchdog/moxart_wdt.c
@@ -91,8 +91,6 @@ static int moxart_wdt_probe(struct platform_device *pdev)
91{ 91{
92 struct moxart_wdt_dev *moxart_wdt; 92 struct moxart_wdt_dev *moxart_wdt;
93 struct device *dev = &pdev->dev; 93 struct device *dev = &pdev->dev;
94 struct device_node *node = dev->of_node;
95 struct resource *res;
96 struct clk *clk; 94 struct clk *clk;
97 int err; 95 int err;
98 unsigned int max_timeout; 96 unsigned int max_timeout;
@@ -104,12 +102,11 @@ static int moxart_wdt_probe(struct platform_device *pdev)
104 102
105 platform_set_drvdata(pdev, moxart_wdt); 103 platform_set_drvdata(pdev, moxart_wdt);
106 104
107 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 105 moxart_wdt->base = devm_platform_ioremap_resource(pdev, 0);
108 moxart_wdt->base = devm_ioremap_resource(dev, res);
109 if (IS_ERR(moxart_wdt->base)) 106 if (IS_ERR(moxart_wdt->base))
110 return PTR_ERR(moxart_wdt->base); 107 return PTR_ERR(moxart_wdt->base);
111 108
112 clk = of_clk_get(node, 0); 109 clk = devm_clk_get(dev, NULL);
113 if (IS_ERR(clk)) { 110 if (IS_ERR(clk)) {
114 pr_err("%s: of_clk_get failed\n", __func__); 111 pr_err("%s: of_clk_get failed\n", __func__);
115 return PTR_ERR(clk); 112 return PTR_ERR(clk);
@@ -136,7 +133,8 @@ static int moxart_wdt_probe(struct platform_device *pdev)
136 133
137 watchdog_set_drvdata(&moxart_wdt->dev, moxart_wdt); 134 watchdog_set_drvdata(&moxart_wdt->dev, moxart_wdt);
138 135
139 err = watchdog_register_device(&moxart_wdt->dev); 136 watchdog_stop_on_unregister(&moxart_wdt->dev);
137 err = devm_watchdog_register_device(dev, &moxart_wdt->dev);
140 if (err) 138 if (err)
141 return err; 139 return err;
142 140
@@ -146,15 +144,6 @@ static int moxart_wdt_probe(struct platform_device *pdev)
146 return 0; 144 return 0;
147} 145}
148 146
149static int moxart_wdt_remove(struct platform_device *pdev)
150{
151 struct moxart_wdt_dev *moxart_wdt = platform_get_drvdata(pdev);
152
153 moxart_wdt_stop(&moxart_wdt->dev);
154
155 return 0;
156}
157
158static const struct of_device_id moxart_watchdog_match[] = { 147static const struct of_device_id moxart_watchdog_match[] = {
159 { .compatible = "moxa,moxart-watchdog" }, 148 { .compatible = "moxa,moxart-watchdog" },
160 { }, 149 { },
@@ -163,7 +152,6 @@ MODULE_DEVICE_TABLE(of, moxart_watchdog_match);
163 152
164static struct platform_driver moxart_wdt_driver = { 153static struct platform_driver moxart_wdt_driver = {
165 .probe = moxart_wdt_probe, 154 .probe = moxart_wdt_probe,
166 .remove = moxart_wdt_remove,
167 .driver = { 155 .driver = {
168 .name = "moxart-watchdog", 156 .name = "moxart-watchdog",
169 .of_match_table = moxart_watchdog_match, 157 .of_match_table = moxart_watchdog_match,
diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
index 069072e6747d..9b6d6a5a27ad 100644
--- a/drivers/watchdog/mpc8xxx_wdt.c
+++ b/drivers/watchdog/mpc8xxx_wdt.c
@@ -149,8 +149,7 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
149 if (!ddata) 149 if (!ddata)
150 return -ENOMEM; 150 return -ENOMEM;
151 151
152 res = platform_get_resource(ofdev, IORESOURCE_MEM, 0); 152 ddata->base = devm_platform_ioremap_resource(ofdev, 0);
153 ddata->base = devm_ioremap_resource(dev, res);
154 if (IS_ERR(ddata->base)) 153 if (IS_ERR(ddata->base))
155 return PTR_ERR(ddata->base); 154 return PTR_ERR(ddata->base);
156 155
@@ -205,9 +204,10 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
205 if (ddata->wdd.timeout < ddata->wdd.min_timeout) 204 if (ddata->wdd.timeout < ddata->wdd.min_timeout)
206 ddata->wdd.timeout = ddata->wdd.min_timeout; 205 ddata->wdd.timeout = ddata->wdd.min_timeout;
207 206
208 ret = watchdog_register_device(&ddata->wdd); 207 ret = devm_watchdog_register_device(dev, &ddata->wdd);
209 if (ret) { 208 if (ret) {
210 dev_err(dev, "cannot register watchdog device (err=%d)\n", ret); 209 dev_err(dev, "cannot register watchdog device (err=%d)\n",
210 ret);
211 return ret; 211 return ret;
212 } 212 }
213 213
@@ -219,17 +219,6 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
219 return 0; 219 return 0;
220} 220}
221 221
222static int mpc8xxx_wdt_remove(struct platform_device *ofdev)
223{
224 struct mpc8xxx_wdt_ddata *ddata = platform_get_drvdata(ofdev);
225
226 dev_crit(&ofdev->dev, "Watchdog removed, expect the %s soon!\n",
227 reset ? "reset" : "machine check exception");
228 watchdog_unregister_device(&ddata->wdd);
229
230 return 0;
231}
232
233static const struct of_device_id mpc8xxx_wdt_match[] = { 222static const struct of_device_id mpc8xxx_wdt_match[] = {
234 { 223 {
235 .compatible = "mpc83xx_wdt", 224 .compatible = "mpc83xx_wdt",
@@ -260,7 +249,6 @@ MODULE_DEVICE_TABLE(of, mpc8xxx_wdt_match);
260 249
261static struct platform_driver mpc8xxx_wdt_driver = { 250static struct platform_driver mpc8xxx_wdt_driver = {
262 .probe = mpc8xxx_wdt_probe, 251 .probe = mpc8xxx_wdt_probe,
263 .remove = mpc8xxx_wdt_remove,
264 .driver = { 252 .driver = {
265 .name = "mpc8xxx_wdt", 253 .name = "mpc8xxx_wdt",
266 .of_match_table = mpc8xxx_wdt_match, 254 .of_match_table = mpc8xxx_wdt_match,
diff --git a/drivers/watchdog/mt7621_wdt.c b/drivers/watchdog/mt7621_wdt.c
index 81208cd3f4ec..cbb3c0dde136 100644
--- a/drivers/watchdog/mt7621_wdt.c
+++ b/drivers/watchdog/mt7621_wdt.c
@@ -133,21 +133,19 @@ static struct watchdog_device mt7621_wdt_dev = {
133 133
134static int mt7621_wdt_probe(struct platform_device *pdev) 134static int mt7621_wdt_probe(struct platform_device *pdev)
135{ 135{
136 struct resource *res; 136 struct device *dev = &pdev->dev;
137 137 mt7621_wdt_base = devm_platform_ioremap_resource(pdev, 0);
138 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
139 mt7621_wdt_base = devm_ioremap_resource(&pdev->dev, res);
140 if (IS_ERR(mt7621_wdt_base)) 138 if (IS_ERR(mt7621_wdt_base))
141 return PTR_ERR(mt7621_wdt_base); 139 return PTR_ERR(mt7621_wdt_base);
142 140
143 mt7621_wdt_reset = devm_reset_control_get_exclusive(&pdev->dev, NULL); 141 mt7621_wdt_reset = devm_reset_control_get_exclusive(dev, NULL);
144 if (!IS_ERR(mt7621_wdt_reset)) 142 if (!IS_ERR(mt7621_wdt_reset))
145 reset_control_deassert(mt7621_wdt_reset); 143 reset_control_deassert(mt7621_wdt_reset);
146 144
147 mt7621_wdt_dev.bootstatus = mt7621_wdt_bootcause(); 145 mt7621_wdt_dev.bootstatus = mt7621_wdt_bootcause();
148 146
149 watchdog_init_timeout(&mt7621_wdt_dev, mt7621_wdt_dev.max_timeout, 147 watchdog_init_timeout(&mt7621_wdt_dev, mt7621_wdt_dev.max_timeout,
150 &pdev->dev); 148 dev);
151 watchdog_set_nowayout(&mt7621_wdt_dev, nowayout); 149 watchdog_set_nowayout(&mt7621_wdt_dev, nowayout);
152 if (mt7621_wdt_is_running(&mt7621_wdt_dev)) { 150 if (mt7621_wdt_is_running(&mt7621_wdt_dev)) {
153 /* 151 /*
@@ -164,7 +162,7 @@ static int mt7621_wdt_probe(struct platform_device *pdev)
164 set_bit(WDOG_HW_RUNNING, &mt7621_wdt_dev.status); 162 set_bit(WDOG_HW_RUNNING, &mt7621_wdt_dev.status);
165 } 163 }
166 164
167 return devm_watchdog_register_device(&pdev->dev, &mt7621_wdt_dev); 165 return devm_watchdog_register_device(dev, &mt7621_wdt_dev);
168} 166}
169 167
170static void mt7621_wdt_shutdown(struct platform_device *pdev) 168static void mt7621_wdt_shutdown(struct platform_device *pdev)
diff --git a/drivers/watchdog/mtk_wdt.c b/drivers/watchdog/mtk_wdt.c
index 4baf64f21aa1..9c3d0033260d 100644
--- a/drivers/watchdog/mtk_wdt.c
+++ b/drivers/watchdog/mtk_wdt.c
@@ -153,18 +153,17 @@ static const struct watchdog_ops mtk_wdt_ops = {
153 153
154static int mtk_wdt_probe(struct platform_device *pdev) 154static int mtk_wdt_probe(struct platform_device *pdev)
155{ 155{
156 struct device *dev = &pdev->dev;
156 struct mtk_wdt_dev *mtk_wdt; 157 struct mtk_wdt_dev *mtk_wdt;
157 struct resource *res;
158 int err; 158 int err;
159 159
160 mtk_wdt = devm_kzalloc(&pdev->dev, sizeof(*mtk_wdt), GFP_KERNEL); 160 mtk_wdt = devm_kzalloc(dev, sizeof(*mtk_wdt), GFP_KERNEL);
161 if (!mtk_wdt) 161 if (!mtk_wdt)
162 return -ENOMEM; 162 return -ENOMEM;
163 163
164 platform_set_drvdata(pdev, mtk_wdt); 164 platform_set_drvdata(pdev, mtk_wdt);
165 165
166 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 166 mtk_wdt->wdt_base = devm_platform_ioremap_resource(pdev, 0);
167 mtk_wdt->wdt_base = devm_ioremap_resource(&pdev->dev, res);
168 if (IS_ERR(mtk_wdt->wdt_base)) 167 if (IS_ERR(mtk_wdt->wdt_base))
169 return PTR_ERR(mtk_wdt->wdt_base); 168 return PTR_ERR(mtk_wdt->wdt_base);
170 169
@@ -173,9 +172,9 @@ static int mtk_wdt_probe(struct platform_device *pdev)
173 mtk_wdt->wdt_dev.timeout = WDT_MAX_TIMEOUT; 172 mtk_wdt->wdt_dev.timeout = WDT_MAX_TIMEOUT;
174 mtk_wdt->wdt_dev.max_timeout = WDT_MAX_TIMEOUT; 173 mtk_wdt->wdt_dev.max_timeout = WDT_MAX_TIMEOUT;
175 mtk_wdt->wdt_dev.min_timeout = WDT_MIN_TIMEOUT; 174 mtk_wdt->wdt_dev.min_timeout = WDT_MIN_TIMEOUT;
176 mtk_wdt->wdt_dev.parent = &pdev->dev; 175 mtk_wdt->wdt_dev.parent = dev;
177 176
178 watchdog_init_timeout(&mtk_wdt->wdt_dev, timeout, &pdev->dev); 177 watchdog_init_timeout(&mtk_wdt->wdt_dev, timeout, dev);
179 watchdog_set_nowayout(&mtk_wdt->wdt_dev, nowayout); 178 watchdog_set_nowayout(&mtk_wdt->wdt_dev, nowayout);
180 watchdog_set_restart_priority(&mtk_wdt->wdt_dev, 128); 179 watchdog_set_restart_priority(&mtk_wdt->wdt_dev, 128);
181 180
@@ -183,29 +182,13 @@ static int mtk_wdt_probe(struct platform_device *pdev)
183 182
184 mtk_wdt_stop(&mtk_wdt->wdt_dev); 183 mtk_wdt_stop(&mtk_wdt->wdt_dev);
185 184
186 err = watchdog_register_device(&mtk_wdt->wdt_dev); 185 watchdog_stop_on_reboot(&mtk_wdt->wdt_dev);
186 err = devm_watchdog_register_device(dev, &mtk_wdt->wdt_dev);
187 if (unlikely(err)) 187 if (unlikely(err))
188 return err; 188 return err;
189 189
190 dev_info(&pdev->dev, "Watchdog enabled (timeout=%d sec, nowayout=%d)\n", 190 dev_info(dev, "Watchdog enabled (timeout=%d sec, nowayout=%d)\n",
191 mtk_wdt->wdt_dev.timeout, nowayout); 191 mtk_wdt->wdt_dev.timeout, nowayout);
192
193 return 0;
194}
195
196static void mtk_wdt_shutdown(struct platform_device *pdev)
197{
198 struct mtk_wdt_dev *mtk_wdt = platform_get_drvdata(pdev);
199
200 if (watchdog_active(&mtk_wdt->wdt_dev))
201 mtk_wdt_stop(&mtk_wdt->wdt_dev);
202}
203
204static int mtk_wdt_remove(struct platform_device *pdev)
205{
206 struct mtk_wdt_dev *mtk_wdt = platform_get_drvdata(pdev);
207
208 watchdog_unregister_device(&mtk_wdt->wdt_dev);
209 192
210 return 0; 193 return 0;
211} 194}
@@ -247,8 +230,6 @@ static const struct dev_pm_ops mtk_wdt_pm_ops = {
247 230
248static struct platform_driver mtk_wdt_driver = { 231static struct platform_driver mtk_wdt_driver = {
249 .probe = mtk_wdt_probe, 232 .probe = mtk_wdt_probe,
250 .remove = mtk_wdt_remove,
251 .shutdown = mtk_wdt_shutdown,
252 .driver = { 233 .driver = {
253 .name = DRV_NAME, 234 .name = DRV_NAME,
254 .pm = &mtk_wdt_pm_ops, 235 .pm = &mtk_wdt_pm_ops,
diff --git a/drivers/watchdog/ni903x_wdt.c b/drivers/watchdog/ni903x_wdt.c
index dc67742e9018..fbc1df86c6cc 100644
--- a/drivers/watchdog/ni903x_wdt.c
+++ b/drivers/watchdog/ni903x_wdt.c
@@ -217,9 +217,7 @@ static int ni903x_acpi_add(struct acpi_device *device)
217 wdd->parent = dev; 217 wdd->parent = dev;
218 watchdog_set_drvdata(wdd, wdt); 218 watchdog_set_drvdata(wdd, wdt);
219 watchdog_set_nowayout(wdd, nowayout); 219 watchdog_set_nowayout(wdd, nowayout);
220 ret = watchdog_init_timeout(wdd, timeout, dev); 220 watchdog_init_timeout(wdd, timeout, dev);
221 if (ret)
222 dev_err(dev, "unable to set timeout value, using default\n");
223 221
224 ret = watchdog_register_device(wdd); 222 ret = watchdog_register_device(wdd);
225 if (ret) { 223 if (ret) {
diff --git a/drivers/watchdog/nic7018_wdt.c b/drivers/watchdog/nic7018_wdt.c
index dcd265685837..82843abe38f8 100644
--- a/drivers/watchdog/nic7018_wdt.c
+++ b/drivers/watchdog/nic7018_wdt.c
@@ -211,10 +211,7 @@ static int nic7018_probe(struct platform_device *pdev)
211 211
212 watchdog_set_drvdata(wdd, wdt); 212 watchdog_set_drvdata(wdd, wdt);
213 watchdog_set_nowayout(wdd, nowayout); 213 watchdog_set_nowayout(wdd, nowayout);
214 214 watchdog_init_timeout(wdd, timeout, dev);
215 ret = watchdog_init_timeout(wdd, timeout, dev);
216 if (ret)
217 dev_warn(dev, "unable to set timeout value, using default\n");
218 215
219 /* Unlock WDT register */ 216 /* Unlock WDT register */
220 outb(UNLOCK, wdt->io_base + WDT_REG_LOCK); 217 outb(UNLOCK, wdt->io_base + WDT_REG_LOCK);
diff --git a/drivers/watchdog/npcm_wdt.c b/drivers/watchdog/npcm_wdt.c
index 0d4213652ecc..9d6c1689b12c 100644
--- a/drivers/watchdog/npcm_wdt.c
+++ b/drivers/watchdog/npcm_wdt.c
@@ -181,16 +181,14 @@ static int npcm_wdt_probe(struct platform_device *pdev)
181{ 181{
182 struct device *dev = &pdev->dev; 182 struct device *dev = &pdev->dev;
183 struct npcm_wdt *wdt; 183 struct npcm_wdt *wdt;
184 struct resource *res;
185 int irq; 184 int irq;
186 int ret; 185 int ret;
187 186
188 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 187 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
189 if (!wdt) 188 if (!wdt)
190 return -ENOMEM; 189 return -ENOMEM;
191 190
192 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 191 wdt->reg = devm_platform_ioremap_resource(pdev, 0);
193 wdt->reg = devm_ioremap_resource(dev, res);
194 if (IS_ERR(wdt->reg)) 192 if (IS_ERR(wdt->reg))
195 return PTR_ERR(wdt->reg); 193 return PTR_ERR(wdt->reg);
196 194
@@ -216,8 +214,8 @@ static int npcm_wdt_probe(struct platform_device *pdev)
216 set_bit(WDOG_HW_RUNNING, &wdt->wdd.status); 214 set_bit(WDOG_HW_RUNNING, &wdt->wdd.status);
217 } 215 }
218 216
219 ret = devm_request_irq(dev, irq, npcm_wdt_interrupt, 0, 217 ret = devm_request_irq(dev, irq, npcm_wdt_interrupt, 0, "watchdog",
220 "watchdog", wdt); 218 wdt);
221 if (ret) 219 if (ret)
222 return ret; 220 return ret;
223 221
diff --git a/drivers/watchdog/nuc900_wdt.c b/drivers/watchdog/nuc900_wdt.c
index 8a36350bab7b..f36eae34e848 100644
--- a/drivers/watchdog/nuc900_wdt.c
+++ b/drivers/watchdog/nuc900_wdt.c
@@ -242,7 +242,6 @@ static struct miscdevice nuc900wdt_miscdev = {
242 242
243static int nuc900wdt_probe(struct platform_device *pdev) 243static int nuc900wdt_probe(struct platform_device *pdev)
244{ 244{
245 struct resource *res;
246 int ret = 0; 245 int ret = 0;
247 246
248 nuc900_wdt = devm_kzalloc(&pdev->dev, sizeof(*nuc900_wdt), 247 nuc900_wdt = devm_kzalloc(&pdev->dev, sizeof(*nuc900_wdt),
@@ -254,8 +253,7 @@ static int nuc900wdt_probe(struct platform_device *pdev)
254 253
255 spin_lock_init(&nuc900_wdt->wdt_lock); 254 spin_lock_init(&nuc900_wdt->wdt_lock);
256 255
257 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 256 nuc900_wdt->wdt_base = devm_platform_ioremap_resource(pdev, 0);
258 nuc900_wdt->wdt_base = devm_ioremap_resource(&pdev->dev, res);
259 if (IS_ERR(nuc900_wdt->wdt_base)) 257 if (IS_ERR(nuc900_wdt->wdt_base))
260 return PTR_ERR(nuc900_wdt->wdt_base); 258 return PTR_ERR(nuc900_wdt->wdt_base);
261 259
diff --git a/drivers/watchdog/of_xilinx_wdt.c b/drivers/watchdog/of_xilinx_wdt.c
index d3f7eb046678..03786992b701 100644
--- a/drivers/watchdog/of_xilinx_wdt.c
+++ b/drivers/watchdog/of_xilinx_wdt.c
@@ -151,43 +151,46 @@ static u32 xwdt_selftest(struct xwdt_device *xdev)
151 return XWT_TIMER_FAILED; 151 return XWT_TIMER_FAILED;
152} 152}
153 153
154static void xwdt_clk_disable_unprepare(void *data)
155{
156 clk_disable_unprepare(data);
157}
158
154static int xwdt_probe(struct platform_device *pdev) 159static int xwdt_probe(struct platform_device *pdev)
155{ 160{
161 struct device *dev = &pdev->dev;
156 int rc; 162 int rc;
157 u32 pfreq = 0, enable_once = 0; 163 u32 pfreq = 0, enable_once = 0;
158 struct resource *res;
159 struct xwdt_device *xdev; 164 struct xwdt_device *xdev;
160 struct watchdog_device *xilinx_wdt_wdd; 165 struct watchdog_device *xilinx_wdt_wdd;
161 166
162 xdev = devm_kzalloc(&pdev->dev, sizeof(*xdev), GFP_KERNEL); 167 xdev = devm_kzalloc(dev, sizeof(*xdev), GFP_KERNEL);
163 if (!xdev) 168 if (!xdev)
164 return -ENOMEM; 169 return -ENOMEM;
165 170
166 xilinx_wdt_wdd = &xdev->xilinx_wdt_wdd; 171 xilinx_wdt_wdd = &xdev->xilinx_wdt_wdd;
167 xilinx_wdt_wdd->info = &xilinx_wdt_ident; 172 xilinx_wdt_wdd->info = &xilinx_wdt_ident;
168 xilinx_wdt_wdd->ops = &xilinx_wdt_ops; 173 xilinx_wdt_wdd->ops = &xilinx_wdt_ops;
169 xilinx_wdt_wdd->parent = &pdev->dev; 174 xilinx_wdt_wdd->parent = dev;
170 175
171 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 176 xdev->base = devm_platform_ioremap_resource(pdev, 0);
172 xdev->base = devm_ioremap_resource(&pdev->dev, res);
173 if (IS_ERR(xdev->base)) 177 if (IS_ERR(xdev->base))
174 return PTR_ERR(xdev->base); 178 return PTR_ERR(xdev->base);
175 179
176 rc = of_property_read_u32(pdev->dev.of_node, "xlnx,wdt-interval", 180 rc = of_property_read_u32(dev->of_node, "xlnx,wdt-interval",
177 &xdev->wdt_interval); 181 &xdev->wdt_interval);
178 if (rc) 182 if (rc)
179 dev_warn(&pdev->dev, 183 dev_warn(dev, "Parameter \"xlnx,wdt-interval\" not found\n");
180 "Parameter \"xlnx,wdt-interval\" not found\n");
181 184
182 rc = of_property_read_u32(pdev->dev.of_node, "xlnx,wdt-enable-once", 185 rc = of_property_read_u32(dev->of_node, "xlnx,wdt-enable-once",
183 &enable_once); 186 &enable_once);
184 if (rc) 187 if (rc)
185 dev_warn(&pdev->dev, 188 dev_warn(dev,
186 "Parameter \"xlnx,wdt-enable-once\" not found\n"); 189 "Parameter \"xlnx,wdt-enable-once\" not found\n");
187 190
188 watchdog_set_nowayout(xilinx_wdt_wdd, enable_once); 191 watchdog_set_nowayout(xilinx_wdt_wdd, enable_once);
189 192
190 xdev->clk = devm_clk_get(&pdev->dev, NULL); 193 xdev->clk = devm_clk_get(dev, NULL);
191 if (IS_ERR(xdev->clk)) { 194 if (IS_ERR(xdev->clk)) {
192 if (PTR_ERR(xdev->clk) != -ENOENT) 195 if (PTR_ERR(xdev->clk) != -ENOENT)
193 return PTR_ERR(xdev->clk); 196 return PTR_ERR(xdev->clk);
@@ -198,10 +201,10 @@ static int xwdt_probe(struct platform_device *pdev)
198 */ 201 */
199 xdev->clk = NULL; 202 xdev->clk = NULL;
200 203
201 rc = of_property_read_u32(pdev->dev.of_node, "clock-frequency", 204 rc = of_property_read_u32(dev->of_node, "clock-frequency",
202 &pfreq); 205 &pfreq);
203 if (rc) 206 if (rc)
204 dev_warn(&pdev->dev, 207 dev_warn(dev,
205 "The watchdog clock freq cannot be obtained\n"); 208 "The watchdog clock freq cannot be obtained\n");
206 } else { 209 } else {
207 pfreq = clk_get_rate(xdev->clk); 210 pfreq = clk_get_rate(xdev->clk);
@@ -220,44 +223,34 @@ static int xwdt_probe(struct platform_device *pdev)
220 223
221 rc = clk_prepare_enable(xdev->clk); 224 rc = clk_prepare_enable(xdev->clk);
222 if (rc) { 225 if (rc) {
223 dev_err(&pdev->dev, "unable to enable clock\n"); 226 dev_err(dev, "unable to enable clock\n");
224 return rc; 227 return rc;
225 } 228 }
229 rc = devm_add_action_or_reset(dev, xwdt_clk_disable_unprepare,
230 xdev->clk);
231 if (rc)
232 return rc;
226 233
227 rc = xwdt_selftest(xdev); 234 rc = xwdt_selftest(xdev);
228 if (rc == XWT_TIMER_FAILED) { 235 if (rc == XWT_TIMER_FAILED) {
229 dev_err(&pdev->dev, "SelfTest routine error\n"); 236 dev_err(dev, "SelfTest routine error\n");
230 goto err_clk_disable; 237 return rc;
231 } 238 }
232 239
233 rc = watchdog_register_device(xilinx_wdt_wdd); 240 rc = devm_watchdog_register_device(dev, xilinx_wdt_wdd);
234 if (rc) { 241 if (rc) {
235 dev_err(&pdev->dev, "Cannot register watchdog (err=%d)\n", rc); 242 dev_err(dev, "Cannot register watchdog (err=%d)\n", rc);
236 goto err_clk_disable; 243 return rc;
237 } 244 }
238 245
239 clk_disable(xdev->clk); 246 clk_disable(xdev->clk);
240 247
241 dev_info(&pdev->dev, "Xilinx Watchdog Timer at %p with timeout %ds\n", 248 dev_info(dev, "Xilinx Watchdog Timer at %p with timeout %ds\n",
242 xdev->base, xilinx_wdt_wdd->timeout); 249 xdev->base, xilinx_wdt_wdd->timeout);
243 250
244 platform_set_drvdata(pdev, xdev); 251 platform_set_drvdata(pdev, xdev);
245 252
246 return 0; 253 return 0;
247err_clk_disable:
248 clk_disable_unprepare(xdev->clk);
249
250 return rc;
251}
252
253static int xwdt_remove(struct platform_device *pdev)
254{
255 struct xwdt_device *xdev = platform_get_drvdata(pdev);
256
257 watchdog_unregister_device(&xdev->xilinx_wdt_wdd);
258 clk_disable_unprepare(xdev->clk);
259
260 return 0;
261} 254}
262 255
263/** 256/**
@@ -305,7 +298,6 @@ MODULE_DEVICE_TABLE(of, xwdt_of_match);
305 298
306static struct platform_driver xwdt_driver = { 299static struct platform_driver xwdt_driver = {
307 .probe = xwdt_probe, 300 .probe = xwdt_probe,
308 .remove = xwdt_remove,
309 .driver = { 301 .driver = {
310 .name = WATCHDOG_NAME, 302 .name = WATCHDOG_NAME,
311 .of_match_table = xwdt_of_match, 303 .of_match_table = xwdt_of_match,
diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c
index cbd752f9ac56..d49688d93f6a 100644
--- a/drivers/watchdog/omap_wdt.c
+++ b/drivers/watchdog/omap_wdt.c
@@ -231,7 +231,6 @@ static const struct watchdog_ops omap_wdt_ops = {
231static int omap_wdt_probe(struct platform_device *pdev) 231static int omap_wdt_probe(struct platform_device *pdev)
232{ 232{
233 struct omap_wd_timer_platform_data *pdata = dev_get_platdata(&pdev->dev); 233 struct omap_wd_timer_platform_data *pdata = dev_get_platdata(&pdev->dev);
234 struct resource *res;
235 struct omap_wdt_dev *wdev; 234 struct omap_wdt_dev *wdev;
236 int ret; 235 int ret;
237 236
@@ -245,8 +244,7 @@ static int omap_wdt_probe(struct platform_device *pdev)
245 mutex_init(&wdev->lock); 244 mutex_init(&wdev->lock);
246 245
247 /* reserve static register mappings */ 246 /* reserve static register mappings */
248 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 247 wdev->base = devm_platform_ioremap_resource(pdev, 0);
249 wdev->base = devm_ioremap_resource(&pdev->dev, res);
250 if (IS_ERR(wdev->base)) 248 if (IS_ERR(wdev->base))
251 return PTR_ERR(wdev->base); 249 return PTR_ERR(wdev->base);
252 250
diff --git a/drivers/watchdog/orion_wdt.c b/drivers/watchdog/orion_wdt.c
index 9db3b09f7568..cdb0d174c5e2 100644
--- a/drivers/watchdog/orion_wdt.c
+++ b/drivers/watchdog/orion_wdt.c
@@ -349,13 +349,6 @@ static unsigned int orion_wdt_get_timeleft(struct watchdog_device *wdt_dev)
349 return readl(dev->reg + dev->data->wdt_counter_offset) / dev->clk_rate; 349 return readl(dev->reg + dev->data->wdt_counter_offset) / dev->clk_rate;
350} 350}
351 351
352static int orion_wdt_set_timeout(struct watchdog_device *wdt_dev,
353 unsigned int timeout)
354{
355 wdt_dev->timeout = timeout;
356 return 0;
357}
358
359static const struct watchdog_info orion_wdt_info = { 352static const struct watchdog_info orion_wdt_info = {
360 .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE, 353 .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
361 .identity = "Orion Watchdog", 354 .identity = "Orion Watchdog",
@@ -366,7 +359,6 @@ static const struct watchdog_ops orion_wdt_ops = {
366 .start = orion_wdt_start, 359 .start = orion_wdt_start,
367 .stop = orion_wdt_stop, 360 .stop = orion_wdt_stop,
368 .ping = orion_wdt_ping, 361 .ping = orion_wdt_ping,
369 .set_timeout = orion_wdt_set_timeout,
370 .get_timeleft = orion_wdt_get_timeleft, 362 .get_timeleft = orion_wdt_get_timeleft,
371}; 363};
372 364
@@ -502,8 +494,7 @@ static int orion_wdt_get_regs(struct platform_device *pdev,
502 of_device_is_compatible(node, "marvell,armada-xp-wdt")) { 494 of_device_is_compatible(node, "marvell,armada-xp-wdt")) {
503 495
504 /* Dedicated RSTOUT register, can be requested. */ 496 /* Dedicated RSTOUT register, can be requested. */
505 res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 497 dev->rstout = devm_platform_ioremap_resource(pdev, 1);
506 dev->rstout = devm_ioremap_resource(&pdev->dev, res);
507 if (IS_ERR(dev->rstout)) 498 if (IS_ERR(dev->rstout))
508 return PTR_ERR(dev->rstout); 499 return PTR_ERR(dev->rstout);
509 500
@@ -511,8 +502,7 @@ static int orion_wdt_get_regs(struct platform_device *pdev,
511 of_device_is_compatible(node, "marvell,armada-380-wdt")) { 502 of_device_is_compatible(node, "marvell,armada-380-wdt")) {
512 503
513 /* Dedicated RSTOUT register, can be requested. */ 504 /* Dedicated RSTOUT register, can be requested. */
514 res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 505 dev->rstout = devm_platform_ioremap_resource(pdev, 1);
515 dev->rstout = devm_ioremap_resource(&pdev->dev, res);
516 if (IS_ERR(dev->rstout)) 506 if (IS_ERR(dev->rstout))
517 return PTR_ERR(dev->rstout); 507 return PTR_ERR(dev->rstout);
518 508
diff --git a/drivers/watchdog/pic32-dmt.c b/drivers/watchdog/pic32-dmt.c
index c797305f8338..9a3c53e03c60 100644
--- a/drivers/watchdog/pic32-dmt.c
+++ b/drivers/watchdog/pic32-dmt.c
@@ -168,70 +168,61 @@ static struct watchdog_device pic32_dmt_wdd = {
168 .ops = &pic32_dmt_fops, 168 .ops = &pic32_dmt_fops,
169}; 169};
170 170
171static void pic32_clk_disable_unprepare(void *data)
172{
173 clk_disable_unprepare(data);
174}
175
171static int pic32_dmt_probe(struct platform_device *pdev) 176static int pic32_dmt_probe(struct platform_device *pdev)
172{ 177{
178 struct device *dev = &pdev->dev;
173 int ret; 179 int ret;
174 struct pic32_dmt *dmt; 180 struct pic32_dmt *dmt;
175 struct resource *mem;
176 struct watchdog_device *wdd = &pic32_dmt_wdd; 181 struct watchdog_device *wdd = &pic32_dmt_wdd;
177 182
178 dmt = devm_kzalloc(&pdev->dev, sizeof(*dmt), GFP_KERNEL); 183 dmt = devm_kzalloc(dev, sizeof(*dmt), GFP_KERNEL);
179 if (!dmt) 184 if (!dmt)
180 return -ENOMEM; 185 return -ENOMEM;
181 186
182 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 187 dmt->regs = devm_platform_ioremap_resource(pdev, 0);
183 dmt->regs = devm_ioremap_resource(&pdev->dev, mem);
184 if (IS_ERR(dmt->regs)) 188 if (IS_ERR(dmt->regs))
185 return PTR_ERR(dmt->regs); 189 return PTR_ERR(dmt->regs);
186 190
187 dmt->clk = devm_clk_get(&pdev->dev, NULL); 191 dmt->clk = devm_clk_get(dev, NULL);
188 if (IS_ERR(dmt->clk)) { 192 if (IS_ERR(dmt->clk)) {
189 dev_err(&pdev->dev, "clk not found\n"); 193 dev_err(dev, "clk not found\n");
190 return PTR_ERR(dmt->clk); 194 return PTR_ERR(dmt->clk);
191 } 195 }
192 196
193 ret = clk_prepare_enable(dmt->clk); 197 ret = clk_prepare_enable(dmt->clk);
194 if (ret) 198 if (ret)
195 return ret; 199 return ret;
200 ret = devm_add_action_or_reset(dev, pic32_clk_disable_unprepare,
201 dmt->clk);
202 if (ret)
203 return ret;
196 204
197 wdd->timeout = pic32_dmt_get_timeout_secs(dmt); 205 wdd->timeout = pic32_dmt_get_timeout_secs(dmt);
198 if (!wdd->timeout) { 206 if (!wdd->timeout) {
199 dev_err(&pdev->dev, 207 dev_err(dev, "failed to read watchdog register timeout\n");
200 "failed to read watchdog register timeout\n"); 208 return -EINVAL;
201 ret = -EINVAL;
202 goto out_disable_clk;
203 } 209 }
204 210
205 dev_info(&pdev->dev, "timeout %d\n", wdd->timeout); 211 dev_info(dev, "timeout %d\n", wdd->timeout);
206 212
207 wdd->bootstatus = pic32_dmt_bootstatus(dmt) ? WDIOF_CARDRESET : 0; 213 wdd->bootstatus = pic32_dmt_bootstatus(dmt) ? WDIOF_CARDRESET : 0;
208 214
209 watchdog_set_nowayout(wdd, WATCHDOG_NOWAYOUT); 215 watchdog_set_nowayout(wdd, WATCHDOG_NOWAYOUT);
210 watchdog_set_drvdata(wdd, dmt); 216 watchdog_set_drvdata(wdd, dmt);
211 217
212 ret = watchdog_register_device(wdd); 218 ret = devm_watchdog_register_device(dev, wdd);
213 if (ret) { 219 if (ret) {
214 dev_err(&pdev->dev, "watchdog register failed, err %d\n", ret); 220 dev_err(dev, "watchdog register failed, err %d\n", ret);
215 goto out_disable_clk; 221 return ret;
216 } 222 }
217 223
218 platform_set_drvdata(pdev, wdd); 224 platform_set_drvdata(pdev, wdd);
219 return 0; 225 return 0;
220
221out_disable_clk:
222 clk_disable_unprepare(dmt->clk);
223 return ret;
224}
225
226static int pic32_dmt_remove(struct platform_device *pdev)
227{
228 struct watchdog_device *wdd = platform_get_drvdata(pdev);
229 struct pic32_dmt *dmt = watchdog_get_drvdata(wdd);
230
231 watchdog_unregister_device(wdd);
232 clk_disable_unprepare(dmt->clk);
233
234 return 0;
235} 226}
236 227
237static const struct of_device_id pic32_dmt_of_ids[] = { 228static const struct of_device_id pic32_dmt_of_ids[] = {
@@ -242,7 +233,6 @@ MODULE_DEVICE_TABLE(of, pic32_dmt_of_ids);
242 233
243static struct platform_driver pic32_dmt_driver = { 234static struct platform_driver pic32_dmt_driver = {
244 .probe = pic32_dmt_probe, 235 .probe = pic32_dmt_probe,
245 .remove = pic32_dmt_remove,
246 .driver = { 236 .driver = {
247 .name = "pic32-dmt", 237 .name = "pic32-dmt",
248 .of_match_table = of_match_ptr(pic32_dmt_of_ids), 238 .of_match_table = of_match_ptr(pic32_dmt_of_ids),
diff --git a/drivers/watchdog/pic32-wdt.c b/drivers/watchdog/pic32-wdt.c
index e2761068dc6f..540500940cc0 100644
--- a/drivers/watchdog/pic32-wdt.c
+++ b/drivers/watchdog/pic32-wdt.c
@@ -166,89 +166,77 @@ static const struct of_device_id pic32_wdt_dt_ids[] = {
166}; 166};
167MODULE_DEVICE_TABLE(of, pic32_wdt_dt_ids); 167MODULE_DEVICE_TABLE(of, pic32_wdt_dt_ids);
168 168
169static void pic32_clk_disable_unprepare(void *data)
170{
171 clk_disable_unprepare(data);
172}
173
169static int pic32_wdt_drv_probe(struct platform_device *pdev) 174static int pic32_wdt_drv_probe(struct platform_device *pdev)
170{ 175{
176 struct device *dev = &pdev->dev;
171 int ret; 177 int ret;
172 struct watchdog_device *wdd = &pic32_wdd; 178 struct watchdog_device *wdd = &pic32_wdd;
173 struct pic32_wdt *wdt; 179 struct pic32_wdt *wdt;
174 struct resource *mem;
175 180
176 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 181 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
177 if (!wdt) 182 if (!wdt)
178 return -ENOMEM; 183 return -ENOMEM;
179 184
180 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 185 wdt->regs = devm_platform_ioremap_resource(pdev, 0);
181 wdt->regs = devm_ioremap_resource(&pdev->dev, mem);
182 if (IS_ERR(wdt->regs)) 186 if (IS_ERR(wdt->regs))
183 return PTR_ERR(wdt->regs); 187 return PTR_ERR(wdt->regs);
184 188
185 wdt->rst_base = devm_ioremap(&pdev->dev, PIC32_BASE_RESET, 0x10); 189 wdt->rst_base = devm_ioremap(dev, PIC32_BASE_RESET, 0x10);
186 if (!wdt->rst_base) 190 if (!wdt->rst_base)
187 return -ENOMEM; 191 return -ENOMEM;
188 192
189 wdt->clk = devm_clk_get(&pdev->dev, NULL); 193 wdt->clk = devm_clk_get(dev, NULL);
190 if (IS_ERR(wdt->clk)) { 194 if (IS_ERR(wdt->clk)) {
191 dev_err(&pdev->dev, "clk not found\n"); 195 dev_err(dev, "clk not found\n");
192 return PTR_ERR(wdt->clk); 196 return PTR_ERR(wdt->clk);
193 } 197 }
194 198
195 ret = clk_prepare_enable(wdt->clk); 199 ret = clk_prepare_enable(wdt->clk);
196 if (ret) { 200 if (ret) {
197 dev_err(&pdev->dev, "clk enable failed\n"); 201 dev_err(dev, "clk enable failed\n");
198 return ret; 202 return ret;
199 } 203 }
204 ret = devm_add_action_or_reset(dev, pic32_clk_disable_unprepare,
205 wdt->clk);
206 if (ret)
207 return ret;
200 208
201 if (pic32_wdt_is_win_enabled(wdt)) { 209 if (pic32_wdt_is_win_enabled(wdt)) {
202 dev_err(&pdev->dev, "windowed-clear mode is not supported.\n"); 210 dev_err(dev, "windowed-clear mode is not supported.\n");
203 ret = -ENODEV; 211 return -ENODEV;
204 goto out_disable_clk;
205 } 212 }
206 213
207 wdd->timeout = pic32_wdt_get_timeout_secs(wdt, &pdev->dev); 214 wdd->timeout = pic32_wdt_get_timeout_secs(wdt, dev);
208 if (!wdd->timeout) { 215 if (!wdd->timeout) {
209 dev_err(&pdev->dev, 216 dev_err(dev, "failed to read watchdog register timeout\n");
210 "failed to read watchdog register timeout\n"); 217 return -EINVAL;
211 ret = -EINVAL;
212 goto out_disable_clk;
213 } 218 }
214 219
215 dev_info(&pdev->dev, "timeout %d\n", wdd->timeout); 220 dev_info(dev, "timeout %d\n", wdd->timeout);
216 221
217 wdd->bootstatus = pic32_wdt_bootstatus(wdt) ? WDIOF_CARDRESET : 0; 222 wdd->bootstatus = pic32_wdt_bootstatus(wdt) ? WDIOF_CARDRESET : 0;
218 223
219 watchdog_set_nowayout(wdd, WATCHDOG_NOWAYOUT); 224 watchdog_set_nowayout(wdd, WATCHDOG_NOWAYOUT);
220 watchdog_set_drvdata(wdd, wdt); 225 watchdog_set_drvdata(wdd, wdt);
221 226
222 ret = watchdog_register_device(wdd); 227 ret = devm_watchdog_register_device(dev, wdd);
223 if (ret) { 228 if (ret) {
224 dev_err(&pdev->dev, "watchdog register failed, err %d\n", ret); 229 dev_err(dev, "watchdog register failed, err %d\n", ret);
225 goto out_disable_clk; 230 return ret;
226 } 231 }
227 232
228 platform_set_drvdata(pdev, wdd); 233 platform_set_drvdata(pdev, wdd);
229 234
230 return 0; 235 return 0;
231
232out_disable_clk:
233 clk_disable_unprepare(wdt->clk);
234
235 return ret;
236}
237
238static int pic32_wdt_drv_remove(struct platform_device *pdev)
239{
240 struct watchdog_device *wdd = platform_get_drvdata(pdev);
241 struct pic32_wdt *wdt = watchdog_get_drvdata(wdd);
242
243 watchdog_unregister_device(wdd);
244 clk_disable_unprepare(wdt->clk);
245
246 return 0;
247} 236}
248 237
249static struct platform_driver pic32_wdt_driver = { 238static struct platform_driver pic32_wdt_driver = {
250 .probe = pic32_wdt_drv_probe, 239 .probe = pic32_wdt_drv_probe,
251 .remove = pic32_wdt_drv_remove,
252 .driver = { 240 .driver = {
253 .name = "pic32-wdt", 241 .name = "pic32-wdt",
254 .of_match_table = of_match_ptr(pic32_wdt_dt_ids), 242 .of_match_table = of_match_ptr(pic32_wdt_dt_ids),
diff --git a/drivers/watchdog/pm8916_wdt.c b/drivers/watchdog/pm8916_wdt.c
index 7f10041fcf5b..2d3652004e39 100644
--- a/drivers/watchdog/pm8916_wdt.c
+++ b/drivers/watchdog/pm8916_wdt.c
@@ -132,15 +132,16 @@ static const struct watchdog_ops pm8916_wdt_ops = {
132 132
133static int pm8916_wdt_probe(struct platform_device *pdev) 133static int pm8916_wdt_probe(struct platform_device *pdev)
134{ 134{
135 struct device *dev = &pdev->dev;
135 struct pm8916_wdt *wdt; 136 struct pm8916_wdt *wdt;
136 struct device *parent; 137 struct device *parent;
137 int err, irq; 138 int err, irq;
138 139
139 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 140 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
140 if (!wdt) 141 if (!wdt)
141 return -ENOMEM; 142 return -ENOMEM;
142 143
143 parent = pdev->dev.parent; 144 parent = dev->parent;
144 145
145 /* 146 /*
146 * The pm8916-pon-wdt is a child of the pon device, which is a child 147 * The pm8916-pon-wdt is a child of the pon device, which is a child
@@ -150,20 +151,20 @@ static int pm8916_wdt_probe(struct platform_device *pdev)
150 */ 151 */
151 wdt->regmap = dev_get_regmap(parent->parent, NULL); 152 wdt->regmap = dev_get_regmap(parent->parent, NULL);
152 if (!wdt->regmap) { 153 if (!wdt->regmap) {
153 dev_err(&pdev->dev, "failed to locate regmap\n"); 154 dev_err(dev, "failed to locate regmap\n");
154 return -ENODEV; 155 return -ENODEV;
155 } 156 }
156 157
157 err = device_property_read_u32(parent, "reg", &wdt->baseaddr); 158 err = device_property_read_u32(parent, "reg", &wdt->baseaddr);
158 if (err) { 159 if (err) {
159 dev_err(&pdev->dev, "failed to get pm8916-pon address\n"); 160 dev_err(dev, "failed to get pm8916-pon address\n");
160 return err; 161 return err;
161 } 162 }
162 163
163 irq = platform_get_irq(pdev, 0); 164 irq = platform_get_irq(pdev, 0);
164 if (irq > 0) { 165 if (irq > 0) {
165 if (devm_request_irq(&pdev->dev, irq, pm8916_wdt_isr, 0, 166 if (devm_request_irq(dev, irq, pm8916_wdt_isr, 0, "pm8916_wdt",
166 "pm8916_wdt", wdt)) 167 wdt))
167 irq = 0; 168 irq = 0;
168 } 169 }
169 170
@@ -172,23 +173,23 @@ static int pm8916_wdt_probe(struct platform_device *pdev)
172 wdt->baseaddr + PON_PMIC_WD_RESET_S2_CTL, 173 wdt->baseaddr + PON_PMIC_WD_RESET_S2_CTL,
173 RESET_TYPE_HARD); 174 RESET_TYPE_HARD);
174 if (err) { 175 if (err) {
175 dev_err(&pdev->dev, "failed configure watchdog\n"); 176 dev_err(dev, "failed configure watchdog\n");
176 return err; 177 return err;
177 } 178 }
178 179
179 wdt->wdev.info = (irq > 0) ? &pm8916_wdt_pt_ident : &pm8916_wdt_ident, 180 wdt->wdev.info = (irq > 0) ? &pm8916_wdt_pt_ident : &pm8916_wdt_ident,
180 wdt->wdev.ops = &pm8916_wdt_ops, 181 wdt->wdev.ops = &pm8916_wdt_ops,
181 wdt->wdev.parent = &pdev->dev; 182 wdt->wdev.parent = dev;
182 wdt->wdev.min_timeout = PM8916_WDT_MIN_TIMEOUT; 183 wdt->wdev.min_timeout = PM8916_WDT_MIN_TIMEOUT;
183 wdt->wdev.max_timeout = PM8916_WDT_MAX_TIMEOUT; 184 wdt->wdev.max_timeout = PM8916_WDT_MAX_TIMEOUT;
184 wdt->wdev.timeout = PM8916_WDT_DEFAULT_TIMEOUT; 185 wdt->wdev.timeout = PM8916_WDT_DEFAULT_TIMEOUT;
185 wdt->wdev.pretimeout = 0; 186 wdt->wdev.pretimeout = 0;
186 watchdog_set_drvdata(&wdt->wdev, wdt); 187 watchdog_set_drvdata(&wdt->wdev, wdt);
187 188
188 watchdog_init_timeout(&wdt->wdev, 0, &pdev->dev); 189 watchdog_init_timeout(&wdt->wdev, 0, dev);
189 pm8916_wdt_configure_timers(&wdt->wdev); 190 pm8916_wdt_configure_timers(&wdt->wdev);
190 191
191 return devm_watchdog_register_device(&pdev->dev, &wdt->wdev); 192 return devm_watchdog_register_device(dev, &wdt->wdev);
192} 193}
193 194
194static const struct of_device_id pm8916_wdt_id_table[] = { 195static const struct of_device_id pm8916_wdt_id_table[] = {
diff --git a/drivers/watchdog/pnx4008_wdt.c b/drivers/watchdog/pnx4008_wdt.c
index 8e261799c84e..d9e03544aeae 100644
--- a/drivers/watchdog/pnx4008_wdt.c
+++ b/drivers/watchdog/pnx4008_wdt.c
@@ -183,54 +183,50 @@ static struct watchdog_device pnx4008_wdd = {
183 .max_timeout = MAX_HEARTBEAT, 183 .max_timeout = MAX_HEARTBEAT,
184}; 184};
185 185
186static void pnx4008_clk_disable_unprepare(void *data)
187{
188 clk_disable_unprepare(data);
189}
190
186static int pnx4008_wdt_probe(struct platform_device *pdev) 191static int pnx4008_wdt_probe(struct platform_device *pdev)
187{ 192{
188 struct resource *r; 193 struct device *dev = &pdev->dev;
189 int ret = 0; 194 int ret = 0;
190 195
191 watchdog_init_timeout(&pnx4008_wdd, heartbeat, &pdev->dev); 196 watchdog_init_timeout(&pnx4008_wdd, heartbeat, dev);
192 197
193 r = platform_get_resource(pdev, IORESOURCE_MEM, 0); 198 wdt_base = devm_platform_ioremap_resource(pdev, 0);
194 wdt_base = devm_ioremap_resource(&pdev->dev, r);
195 if (IS_ERR(wdt_base)) 199 if (IS_ERR(wdt_base))
196 return PTR_ERR(wdt_base); 200 return PTR_ERR(wdt_base);
197 201
198 wdt_clk = devm_clk_get(&pdev->dev, NULL); 202 wdt_clk = devm_clk_get(dev, NULL);
199 if (IS_ERR(wdt_clk)) 203 if (IS_ERR(wdt_clk))
200 return PTR_ERR(wdt_clk); 204 return PTR_ERR(wdt_clk);
201 205
202 ret = clk_prepare_enable(wdt_clk); 206 ret = clk_prepare_enable(wdt_clk);
203 if (ret) 207 if (ret)
204 return ret; 208 return ret;
209 ret = devm_add_action_or_reset(dev, pnx4008_clk_disable_unprepare,
210 wdt_clk);
211 if (ret)
212 return ret;
205 213
206 pnx4008_wdd.bootstatus = (readl(WDTIM_RES(wdt_base)) & WDOG_RESET) ? 214 pnx4008_wdd.bootstatus = (readl(WDTIM_RES(wdt_base)) & WDOG_RESET) ?
207 WDIOF_CARDRESET : 0; 215 WDIOF_CARDRESET : 0;
208 pnx4008_wdd.parent = &pdev->dev; 216 pnx4008_wdd.parent = dev;
209 watchdog_set_nowayout(&pnx4008_wdd, nowayout); 217 watchdog_set_nowayout(&pnx4008_wdd, nowayout);
210 watchdog_set_restart_priority(&pnx4008_wdd, 128); 218 watchdog_set_restart_priority(&pnx4008_wdd, 128);
211 219
212 pnx4008_wdt_stop(&pnx4008_wdd); /* disable for now */ 220 if (readl(WDTIM_CTRL(wdt_base)) & COUNT_ENAB)
221 set_bit(WDOG_HW_RUNNING, &pnx4008_wdd.status);
213 222
214 ret = watchdog_register_device(&pnx4008_wdd); 223 ret = devm_watchdog_register_device(dev, &pnx4008_wdd);
215 if (ret < 0) { 224 if (ret < 0) {
216 dev_err(&pdev->dev, "cannot register watchdog device\n"); 225 dev_err(dev, "cannot register watchdog device\n");
217 goto disable_clk; 226 return ret;
218 } 227 }
219 228
220 dev_info(&pdev->dev, "heartbeat %d sec\n", pnx4008_wdd.timeout); 229 dev_info(dev, "heartbeat %d sec\n", pnx4008_wdd.timeout);
221
222 return 0;
223
224disable_clk:
225 clk_disable_unprepare(wdt_clk);
226 return ret;
227}
228
229static int pnx4008_wdt_remove(struct platform_device *pdev)
230{
231 watchdog_unregister_device(&pnx4008_wdd);
232
233 clk_disable_unprepare(wdt_clk);
234 230
235 return 0; 231 return 0;
236} 232}
@@ -249,7 +245,6 @@ static struct platform_driver platform_wdt_driver = {
249 .of_match_table = of_match_ptr(pnx4008_wdt_match), 245 .of_match_table = of_match_ptr(pnx4008_wdt_match),
250 }, 246 },
251 .probe = pnx4008_wdt_probe, 247 .probe = pnx4008_wdt_probe,
252 .remove = pnx4008_wdt_remove,
253}; 248};
254 249
255module_platform_driver(platform_wdt_driver); 250module_platform_driver(platform_wdt_driver);
diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c
index 5dfd604477a4..6d29c33b1316 100644
--- a/drivers/watchdog/qcom-wdt.c
+++ b/drivers/watchdog/qcom-wdt.c
@@ -142,22 +142,28 @@ static const struct watchdog_info qcom_wdt_info = {
142 .identity = KBUILD_MODNAME, 142 .identity = KBUILD_MODNAME,
143}; 143};
144 144
145static void qcom_clk_disable_unprepare(void *data)
146{
147 clk_disable_unprepare(data);
148}
149
145static int qcom_wdt_probe(struct platform_device *pdev) 150static int qcom_wdt_probe(struct platform_device *pdev)
146{ 151{
152 struct device *dev = &pdev->dev;
147 struct qcom_wdt *wdt; 153 struct qcom_wdt *wdt;
148 struct resource *res; 154 struct resource *res;
149 struct device_node *np = pdev->dev.of_node; 155 struct device_node *np = dev->of_node;
150 const u32 *regs; 156 const u32 *regs;
151 u32 percpu_offset; 157 u32 percpu_offset;
152 int ret; 158 int ret;
153 159
154 regs = of_device_get_match_data(&pdev->dev); 160 regs = of_device_get_match_data(dev);
155 if (!regs) { 161 if (!regs) {
156 dev_err(&pdev->dev, "Unsupported QCOM WDT module\n"); 162 dev_err(dev, "Unsupported QCOM WDT module\n");
157 return -ENODEV; 163 return -ENODEV;
158 } 164 }
159 165
160 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 166 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
161 if (!wdt) 167 if (!wdt)
162 return -ENOMEM; 168 return -ENOMEM;
163 169
@@ -172,21 +178,25 @@ static int qcom_wdt_probe(struct platform_device *pdev)
172 res->start += percpu_offset; 178 res->start += percpu_offset;
173 res->end += percpu_offset; 179 res->end += percpu_offset;
174 180
175 wdt->base = devm_ioremap_resource(&pdev->dev, res); 181 wdt->base = devm_ioremap_resource(dev, res);
176 if (IS_ERR(wdt->base)) 182 if (IS_ERR(wdt->base))
177 return PTR_ERR(wdt->base); 183 return PTR_ERR(wdt->base);
178 184
179 wdt->clk = devm_clk_get(&pdev->dev, NULL); 185 wdt->clk = devm_clk_get(dev, NULL);
180 if (IS_ERR(wdt->clk)) { 186 if (IS_ERR(wdt->clk)) {
181 dev_err(&pdev->dev, "failed to get input clock\n"); 187 dev_err(dev, "failed to get input clock\n");
182 return PTR_ERR(wdt->clk); 188 return PTR_ERR(wdt->clk);
183 } 189 }
184 190
185 ret = clk_prepare_enable(wdt->clk); 191 ret = clk_prepare_enable(wdt->clk);
186 if (ret) { 192 if (ret) {
187 dev_err(&pdev->dev, "failed to setup clock\n"); 193 dev_err(dev, "failed to setup clock\n");
188 return ret; 194 return ret;
189 } 195 }
196 ret = devm_add_action_or_reset(dev, qcom_clk_disable_unprepare,
197 wdt->clk);
198 if (ret)
199 return ret;
190 200
191 /* 201 /*
192 * We use the clock rate to calculate the max timeout, so ensure it's 202 * We use the clock rate to calculate the max timeout, so ensure it's
@@ -199,16 +209,15 @@ static int qcom_wdt_probe(struct platform_device *pdev)
199 wdt->rate = clk_get_rate(wdt->clk); 209 wdt->rate = clk_get_rate(wdt->clk);
200 if (wdt->rate == 0 || 210 if (wdt->rate == 0 ||
201 wdt->rate > 0x10000000U) { 211 wdt->rate > 0x10000000U) {
202 dev_err(&pdev->dev, "invalid clock rate\n"); 212 dev_err(dev, "invalid clock rate\n");
203 ret = -EINVAL; 213 return -EINVAL;
204 goto err_clk_unprepare;
205 } 214 }
206 215
207 wdt->wdd.info = &qcom_wdt_info; 216 wdt->wdd.info = &qcom_wdt_info;
208 wdt->wdd.ops = &qcom_wdt_ops; 217 wdt->wdd.ops = &qcom_wdt_ops;
209 wdt->wdd.min_timeout = 1; 218 wdt->wdd.min_timeout = 1;
210 wdt->wdd.max_timeout = 0x10000000U / wdt->rate; 219 wdt->wdd.max_timeout = 0x10000000U / wdt->rate;
211 wdt->wdd.parent = &pdev->dev; 220 wdt->wdd.parent = dev;
212 wdt->layout = regs; 221 wdt->layout = regs;
213 222
214 if (readl(wdt_addr(wdt, WDT_STS)) & 1) 223 if (readl(wdt_addr(wdt, WDT_STS)) & 1)
@@ -220,29 +229,16 @@ static int qcom_wdt_probe(struct platform_device *pdev)
220 * the max instead. 229 * the max instead.
221 */ 230 */
222 wdt->wdd.timeout = min(wdt->wdd.max_timeout, 30U); 231 wdt->wdd.timeout = min(wdt->wdd.max_timeout, 30U);
223 watchdog_init_timeout(&wdt->wdd, 0, &pdev->dev); 232 watchdog_init_timeout(&wdt->wdd, 0, dev);
224 233
225 ret = watchdog_register_device(&wdt->wdd); 234 ret = devm_watchdog_register_device(dev, &wdt->wdd);
226 if (ret) { 235 if (ret) {
227 dev_err(&pdev->dev, "failed to register watchdog\n"); 236 dev_err(dev, "failed to register watchdog\n");
228 goto err_clk_unprepare; 237 return ret;
229 } 238 }
230 239
231 platform_set_drvdata(pdev, wdt); 240 platform_set_drvdata(pdev, wdt);
232 return 0; 241 return 0;
233
234err_clk_unprepare:
235 clk_disable_unprepare(wdt->clk);
236 return ret;
237}
238
239static int qcom_wdt_remove(struct platform_device *pdev)
240{
241 struct qcom_wdt *wdt = platform_get_drvdata(pdev);
242
243 watchdog_unregister_device(&wdt->wdd);
244 clk_disable_unprepare(wdt->clk);
245 return 0;
246} 242}
247 243
248static int __maybe_unused qcom_wdt_suspend(struct device *dev) 244static int __maybe_unused qcom_wdt_suspend(struct device *dev)
@@ -277,7 +273,6 @@ MODULE_DEVICE_TABLE(of, qcom_wdt_of_table);
277 273
278static struct platform_driver qcom_watchdog_driver = { 274static struct platform_driver qcom_watchdog_driver = {
279 .probe = qcom_wdt_probe, 275 .probe = qcom_wdt_probe,
280 .remove = qcom_wdt_remove,
281 .driver = { 276 .driver = {
282 .name = KBUILD_MODNAME, 277 .name = KBUILD_MODNAME,
283 .of_match_table = qcom_wdt_of_table, 278 .of_match_table = qcom_wdt_of_table,
diff --git a/drivers/watchdog/renesas_wdt.c b/drivers/watchdog/renesas_wdt.c
index 622ede529912..565dbc1ec638 100644
--- a/drivers/watchdog/renesas_wdt.c
+++ b/drivers/watchdog/renesas_wdt.c
@@ -151,7 +151,6 @@ static const struct soc_device_attribute rwdt_quirks_match[] = {
151 .data = (void *)1, /* needs single CPU */ 151 .data = (void *)1, /* needs single CPU */
152 }, { 152 }, {
153 .soc_id = "r8a7792", 153 .soc_id = "r8a7792",
154 .revision = "*",
155 .data = (void *)0, /* needs SMP disabled */ 154 .data = (void *)0, /* needs SMP disabled */
156 }, 155 },
157 { /* sentinel */ } 156 { /* sentinel */ }
@@ -177,7 +176,6 @@ static inline bool rwdt_blacklisted(struct device *dev) { return false; }
177static int rwdt_probe(struct platform_device *pdev) 176static int rwdt_probe(struct platform_device *pdev)
178{ 177{
179 struct rwdt_priv *priv; 178 struct rwdt_priv *priv;
180 struct resource *res;
181 struct clk *clk; 179 struct clk *clk;
182 unsigned long clks_per_sec; 180 unsigned long clks_per_sec;
183 int ret, i; 181 int ret, i;
@@ -189,8 +187,7 @@ static int rwdt_probe(struct platform_device *pdev)
189 if (!priv) 187 if (!priv)
190 return -ENOMEM; 188 return -ENOMEM;
191 189
192 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 190 priv->base = devm_platform_ioremap_resource(pdev, 0);
193 priv->base = devm_ioremap_resource(&pdev->dev, res);
194 if (IS_ERR(priv->base)) 191 if (IS_ERR(priv->base))
195 return PTR_ERR(priv->base); 192 return PTR_ERR(priv->base);
196 193
@@ -238,9 +235,7 @@ static int rwdt_probe(struct platform_device *pdev)
238 watchdog_stop_on_unregister(&priv->wdev); 235 watchdog_stop_on_unregister(&priv->wdev);
239 236
240 /* This overrides the default timeout only if DT configuration was found */ 237 /* This overrides the default timeout only if DT configuration was found */
241 ret = watchdog_init_timeout(&priv->wdev, 0, &pdev->dev); 238 watchdog_init_timeout(&priv->wdev, 0, &pdev->dev);
242 if (ret)
243 dev_warn(&pdev->dev, "Specified timeout value invalid, using default\n");
244 239
245 ret = watchdog_register_device(&priv->wdev); 240 ret = watchdog_register_device(&priv->wdev);
246 if (ret < 0) 241 if (ret < 0)
diff --git a/drivers/watchdog/rn5t618_wdt.c b/drivers/watchdog/rn5t618_wdt.c
index e60f55702ab7..21fcb36f9074 100644
--- a/drivers/watchdog/rn5t618_wdt.c
+++ b/drivers/watchdog/rn5t618_wdt.c
@@ -146,11 +146,12 @@ static const struct watchdog_ops rn5t618_wdt_ops = {
146 146
147static int rn5t618_wdt_probe(struct platform_device *pdev) 147static int rn5t618_wdt_probe(struct platform_device *pdev)
148{ 148{
149 struct rn5t618 *rn5t618 = dev_get_drvdata(pdev->dev.parent); 149 struct device *dev = &pdev->dev;
150 struct rn5t618 *rn5t618 = dev_get_drvdata(dev->parent);
150 struct rn5t618_wdt *wdt; 151 struct rn5t618_wdt *wdt;
151 int min_timeout, max_timeout; 152 int min_timeout, max_timeout;
152 153
153 wdt = devm_kzalloc(&pdev->dev, sizeof(struct rn5t618_wdt), GFP_KERNEL); 154 wdt = devm_kzalloc(dev, sizeof(struct rn5t618_wdt), GFP_KERNEL);
154 if (!wdt) 155 if (!wdt)
155 return -ENOMEM; 156 return -ENOMEM;
156 157
@@ -163,10 +164,10 @@ static int rn5t618_wdt_probe(struct platform_device *pdev)
163 wdt->wdt_dev.min_timeout = min_timeout; 164 wdt->wdt_dev.min_timeout = min_timeout;
164 wdt->wdt_dev.max_timeout = max_timeout; 165 wdt->wdt_dev.max_timeout = max_timeout;
165 wdt->wdt_dev.timeout = max_timeout; 166 wdt->wdt_dev.timeout = max_timeout;
166 wdt->wdt_dev.parent = &pdev->dev; 167 wdt->wdt_dev.parent = dev;
167 168
168 watchdog_set_drvdata(&wdt->wdt_dev, wdt); 169 watchdog_set_drvdata(&wdt->wdt_dev, wdt);
169 watchdog_init_timeout(&wdt->wdt_dev, timeout, &pdev->dev); 170 watchdog_init_timeout(&wdt->wdt_dev, timeout, dev);
170 watchdog_set_nowayout(&wdt->wdt_dev, nowayout); 171 watchdog_set_nowayout(&wdt->wdt_dev, nowayout);
171 172
172 platform_set_drvdata(pdev, wdt); 173 platform_set_drvdata(pdev, wdt);
diff --git a/drivers/watchdog/rt2880_wdt.c b/drivers/watchdog/rt2880_wdt.c
index db7c57d82cfd..905e60f45eec 100644
--- a/drivers/watchdog/rt2880_wdt.c
+++ b/drivers/watchdog/rt2880_wdt.c
@@ -141,19 +141,18 @@ static struct watchdog_device rt288x_wdt_dev = {
141 141
142static int rt288x_wdt_probe(struct platform_device *pdev) 142static int rt288x_wdt_probe(struct platform_device *pdev)
143{ 143{
144 struct resource *res; 144 struct device *dev = &pdev->dev;
145 int ret; 145 int ret;
146 146
147 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 147 rt288x_wdt_base = devm_platform_ioremap_resource(pdev, 0);
148 rt288x_wdt_base = devm_ioremap_resource(&pdev->dev, res);
149 if (IS_ERR(rt288x_wdt_base)) 148 if (IS_ERR(rt288x_wdt_base))
150 return PTR_ERR(rt288x_wdt_base); 149 return PTR_ERR(rt288x_wdt_base);
151 150
152 rt288x_wdt_clk = devm_clk_get(&pdev->dev, NULL); 151 rt288x_wdt_clk = devm_clk_get(dev, NULL);
153 if (IS_ERR(rt288x_wdt_clk)) 152 if (IS_ERR(rt288x_wdt_clk))
154 return PTR_ERR(rt288x_wdt_clk); 153 return PTR_ERR(rt288x_wdt_clk);
155 154
156 rt288x_wdt_reset = devm_reset_control_get_exclusive(&pdev->dev, NULL); 155 rt288x_wdt_reset = devm_reset_control_get_exclusive(dev, NULL);
157 if (!IS_ERR(rt288x_wdt_reset)) 156 if (!IS_ERR(rt288x_wdt_reset))
158 reset_control_deassert(rt288x_wdt_reset); 157 reset_control_deassert(rt288x_wdt_reset);
159 158
@@ -161,31 +160,20 @@ static int rt288x_wdt_probe(struct platform_device *pdev)
161 160
162 rt288x_wdt_dev.bootstatus = rt288x_wdt_bootcause(); 161 rt288x_wdt_dev.bootstatus = rt288x_wdt_bootcause();
163 rt288x_wdt_dev.max_timeout = (0xfffful / rt288x_wdt_freq); 162 rt288x_wdt_dev.max_timeout = (0xfffful / rt288x_wdt_freq);
164 rt288x_wdt_dev.parent = &pdev->dev; 163 rt288x_wdt_dev.parent = dev;
165 164
166 watchdog_init_timeout(&rt288x_wdt_dev, rt288x_wdt_dev.max_timeout, 165 watchdog_init_timeout(&rt288x_wdt_dev, rt288x_wdt_dev.max_timeout,
167 &pdev->dev); 166 dev);
168 watchdog_set_nowayout(&rt288x_wdt_dev, nowayout); 167 watchdog_set_nowayout(&rt288x_wdt_dev, nowayout);
169 168
170 ret = watchdog_register_device(&rt288x_wdt_dev); 169 watchdog_stop_on_reboot(&rt288x_wdt_dev);
170 ret = devm_watchdog_register_device(dev, &rt288x_wdt_dev);
171 if (!ret) 171 if (!ret)
172 dev_info(&pdev->dev, "Initialized\n"); 172 dev_info(dev, "Initialized\n");
173 173
174 return 0; 174 return 0;
175} 175}
176 176
177static int rt288x_wdt_remove(struct platform_device *pdev)
178{
179 watchdog_unregister_device(&rt288x_wdt_dev);
180
181 return 0;
182}
183
184static void rt288x_wdt_shutdown(struct platform_device *pdev)
185{
186 rt288x_wdt_stop(&rt288x_wdt_dev);
187}
188
189static const struct of_device_id rt288x_wdt_match[] = { 177static const struct of_device_id rt288x_wdt_match[] = {
190 { .compatible = "ralink,rt2880-wdt" }, 178 { .compatible = "ralink,rt2880-wdt" },
191 {}, 179 {},
@@ -194,8 +182,6 @@ MODULE_DEVICE_TABLE(of, rt288x_wdt_match);
194 182
195static struct platform_driver rt288x_wdt_driver = { 183static struct platform_driver rt288x_wdt_driver = {
196 .probe = rt288x_wdt_probe, 184 .probe = rt288x_wdt_probe,
197 .remove = rt288x_wdt_remove,
198 .shutdown = rt288x_wdt_shutdown,
199 .driver = { 185 .driver = {
200 .name = KBUILD_MODNAME, 186 .name = KBUILD_MODNAME,
201 .of_match_table = rt288x_wdt_match, 187 .of_match_table = rt288x_wdt_match,
diff --git a/drivers/watchdog/rtd119x_wdt.c b/drivers/watchdog/rtd119x_wdt.c
index d001c17ddfde..834b94ff3f90 100644
--- a/drivers/watchdog/rtd119x_wdt.c
+++ b/drivers/watchdog/rtd119x_wdt.c
@@ -9,7 +9,6 @@
9#include <linux/bitops.h> 9#include <linux/bitops.h>
10#include <linux/clk.h> 10#include <linux/clk.h>
11#include <linux/io.h> 11#include <linux/io.h>
12#include <linux/module.h>
13#include <linux/of.h> 12#include <linux/of.h>
14#include <linux/of_address.h> 13#include <linux/of_address.h>
15#include <linux/platform_device.h> 14#include <linux/platform_device.h>
@@ -95,37 +94,43 @@ static const struct of_device_id rtd119x_wdt_dt_ids[] = {
95 { } 94 { }
96}; 95};
97 96
97static void rtd119x_clk_disable_unprepare(void *data)
98{
99 clk_disable_unprepare(data);
100}
101
98static int rtd119x_wdt_probe(struct platform_device *pdev) 102static int rtd119x_wdt_probe(struct platform_device *pdev)
99{ 103{
104 struct device *dev = &pdev->dev;
100 struct rtd119x_watchdog_device *data; 105 struct rtd119x_watchdog_device *data;
101 struct resource *res;
102 int ret; 106 int ret;
103 107
104 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); 108 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
105 if (!data) 109 if (!data)
106 return -ENOMEM; 110 return -ENOMEM;
107 111
108 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 112 data->base = devm_platform_ioremap_resource(pdev, 0);
109 data->base = devm_ioremap_resource(&pdev->dev, res);
110 if (IS_ERR(data->base)) 113 if (IS_ERR(data->base))
111 return PTR_ERR(data->base); 114 return PTR_ERR(data->base);
112 115
113 data->clk = of_clk_get(pdev->dev.of_node, 0); 116 data->clk = devm_clk_get(dev, NULL);
114 if (IS_ERR(data->clk)) 117 if (IS_ERR(data->clk))
115 return PTR_ERR(data->clk); 118 return PTR_ERR(data->clk);
116 119
117 ret = clk_prepare_enable(data->clk); 120 ret = clk_prepare_enable(data->clk);
118 if (ret) { 121 if (ret)
119 clk_put(data->clk); 122 return ret;
123 ret = devm_add_action_or_reset(dev, rtd119x_clk_disable_unprepare,
124 data->clk);
125 if (ret)
120 return ret; 126 return ret;
121 }
122 127
123 data->wdt_dev.info = &rtd119x_wdt_info; 128 data->wdt_dev.info = &rtd119x_wdt_info;
124 data->wdt_dev.ops = &rtd119x_wdt_ops; 129 data->wdt_dev.ops = &rtd119x_wdt_ops;
125 data->wdt_dev.timeout = 120; 130 data->wdt_dev.timeout = 120;
126 data->wdt_dev.max_timeout = 0xffffffff / clk_get_rate(data->clk); 131 data->wdt_dev.max_timeout = 0xffffffff / clk_get_rate(data->clk);
127 data->wdt_dev.min_timeout = 1; 132 data->wdt_dev.min_timeout = 1;
128 data->wdt_dev.parent = &pdev->dev; 133 data->wdt_dev.parent = dev;
129 134
130 watchdog_stop_on_reboot(&data->wdt_dev); 135 watchdog_stop_on_reboot(&data->wdt_dev);
131 watchdog_set_drvdata(&data->wdt_dev, data); 136 watchdog_set_drvdata(&data->wdt_dev, data);
@@ -135,31 +140,11 @@ static int rtd119x_wdt_probe(struct platform_device *pdev)
135 rtd119x_wdt_set_timeout(&data->wdt_dev, data->wdt_dev.timeout); 140 rtd119x_wdt_set_timeout(&data->wdt_dev, data->wdt_dev.timeout);
136 rtd119x_wdt_stop(&data->wdt_dev); 141 rtd119x_wdt_stop(&data->wdt_dev);
137 142
138 ret = devm_watchdog_register_device(&pdev->dev, &data->wdt_dev); 143 return devm_watchdog_register_device(dev, &data->wdt_dev);
139 if (ret) {
140 clk_disable_unprepare(data->clk);
141 clk_put(data->clk);
142 return ret;
143 }
144
145 return 0;
146}
147
148static int rtd119x_wdt_remove(struct platform_device *pdev)
149{
150 struct rtd119x_watchdog_device *data = platform_get_drvdata(pdev);
151
152 watchdog_unregister_device(&data->wdt_dev);
153
154 clk_disable_unprepare(data->clk);
155 clk_put(data->clk);
156
157 return 0;
158} 144}
159 145
160static struct platform_driver rtd119x_wdt_driver = { 146static struct platform_driver rtd119x_wdt_driver = {
161 .probe = rtd119x_wdt_probe, 147 .probe = rtd119x_wdt_probe,
162 .remove = rtd119x_wdt_remove,
163 .driver = { 148 .driver = {
164 .name = "rtd1295-watchdog", 149 .name = "rtd1295-watchdog",
165 .of_match_table = rtd119x_wdt_dt_ids, 150 .of_match_table = rtd119x_wdt_dt_ids,
diff --git a/drivers/watchdog/rza_wdt.c b/drivers/watchdog/rza_wdt.c
index 781bb572e6af..7b6c365f7cd3 100644
--- a/drivers/watchdog/rza_wdt.c
+++ b/drivers/watchdog/rza_wdt.c
@@ -166,35 +166,34 @@ static const struct watchdog_ops rza_wdt_ops = {
166 166
167static int rza_wdt_probe(struct platform_device *pdev) 167static int rza_wdt_probe(struct platform_device *pdev)
168{ 168{
169 struct device *dev = &pdev->dev;
169 struct rza_wdt *priv; 170 struct rza_wdt *priv;
170 struct resource *res;
171 unsigned long rate; 171 unsigned long rate;
172 int ret; 172 int ret;
173 173
174 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 174 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
175 if (!priv) 175 if (!priv)
176 return -ENOMEM; 176 return -ENOMEM;
177 177
178 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 178 priv->base = devm_platform_ioremap_resource(pdev, 0);
179 priv->base = devm_ioremap_resource(&pdev->dev, res);
180 if (IS_ERR(priv->base)) 179 if (IS_ERR(priv->base))
181 return PTR_ERR(priv->base); 180 return PTR_ERR(priv->base);
182 181
183 priv->clk = devm_clk_get(&pdev->dev, NULL); 182 priv->clk = devm_clk_get(dev, NULL);
184 if (IS_ERR(priv->clk)) 183 if (IS_ERR(priv->clk))
185 return PTR_ERR(priv->clk); 184 return PTR_ERR(priv->clk);
186 185
187 rate = clk_get_rate(priv->clk); 186 rate = clk_get_rate(priv->clk);
188 if (rate < 16384) { 187 if (rate < 16384) {
189 dev_err(&pdev->dev, "invalid clock rate (%ld)\n", rate); 188 dev_err(dev, "invalid clock rate (%ld)\n", rate);
190 return -ENOENT; 189 return -ENOENT;
191 } 190 }
192 191
193 priv->wdev.info = &rza_wdt_ident, 192 priv->wdev.info = &rza_wdt_ident,
194 priv->wdev.ops = &rza_wdt_ops, 193 priv->wdev.ops = &rza_wdt_ops,
195 priv->wdev.parent = &pdev->dev; 194 priv->wdev.parent = dev;
196 195
197 priv->cks = (u8)(uintptr_t)of_device_get_match_data(&pdev->dev); 196 priv->cks = (u8)(uintptr_t) of_device_get_match_data(dev);
198 if (priv->cks == CKS_4BIT) { 197 if (priv->cks == CKS_4BIT) {
199 /* Assume slowest clock rate possible (CKS=0xF) */ 198 /* Assume slowest clock rate possible (CKS=0xF) */
200 priv->wdev.max_timeout = (DIVIDER_4BIT * U8_MAX) / rate; 199 priv->wdev.max_timeout = (DIVIDER_4BIT * U8_MAX) / rate;
@@ -209,19 +208,19 @@ static int rza_wdt_probe(struct platform_device *pdev)
209 * max_hw_heartbeat_ms. 208 * max_hw_heartbeat_ms.
210 */ 209 */
211 priv->wdev.max_hw_heartbeat_ms = (1000 * U8_MAX) / rate; 210 priv->wdev.max_hw_heartbeat_ms = (1000 * U8_MAX) / rate;
212 dev_dbg(&pdev->dev, "max hw timeout of %dms\n", 211 dev_dbg(dev, "max hw timeout of %dms\n",
213 priv->wdev.max_hw_heartbeat_ms); 212 priv->wdev.max_hw_heartbeat_ms);
214 } 213 }
215 214
216 priv->wdev.min_timeout = 1; 215 priv->wdev.min_timeout = 1;
217 priv->wdev.timeout = DEFAULT_TIMEOUT; 216 priv->wdev.timeout = DEFAULT_TIMEOUT;
218 217
219 watchdog_init_timeout(&priv->wdev, 0, &pdev->dev); 218 watchdog_init_timeout(&priv->wdev, 0, dev);
220 watchdog_set_drvdata(&priv->wdev, priv); 219 watchdog_set_drvdata(&priv->wdev, priv);
221 220
222 ret = devm_watchdog_register_device(&pdev->dev, &priv->wdev); 221 ret = devm_watchdog_register_device(dev, &priv->wdev);
223 if (ret) 222 if (ret)
224 dev_err(&pdev->dev, "Cannot register watchdog device\n"); 223 dev_err(dev, "Cannot register watchdog device\n");
225 224
226 return ret; 225 return ret;
227} 226}
diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c
index adaa43543f0a..4267b9e8734b 100644
--- a/drivers/watchdog/s3c2410_wdt.c
+++ b/drivers/watchdog/s3c2410_wdt.c
@@ -522,7 +522,6 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
522{ 522{
523 struct device *dev = &pdev->dev; 523 struct device *dev = &pdev->dev;
524 struct s3c2410_wdt *wdt; 524 struct s3c2410_wdt *wdt;
525 struct resource *wdt_mem;
526 struct resource *wdt_irq; 525 struct resource *wdt_irq;
527 unsigned int wtcon; 526 unsigned int wtcon;
528 int started = 0; 527 int started = 0;
@@ -554,8 +553,7 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
554 } 553 }
555 554
556 /* get the memory region for the watchdog timer */ 555 /* get the memory region for the watchdog timer */
557 wdt_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 556 wdt->reg_base = devm_platform_ioremap_resource(pdev, 0);
558 wdt->reg_base = devm_ioremap_resource(dev, wdt_mem);
559 if (IS_ERR(wdt->reg_base)) { 557 if (IS_ERR(wdt->reg_base)) {
560 ret = PTR_ERR(wdt->reg_base); 558 ret = PTR_ERR(wdt->reg_base);
561 goto err; 559 goto err;
diff --git a/drivers/watchdog/sama5d4_wdt.c b/drivers/watchdog/sama5d4_wdt.c
index 1e93c1b0e3cf..111695223aae 100644
--- a/drivers/watchdog/sama5d4_wdt.c
+++ b/drivers/watchdog/sama5d4_wdt.c
@@ -199,15 +199,15 @@ static int sama5d4_wdt_init(struct sama5d4_wdt *wdt)
199 199
200static int sama5d4_wdt_probe(struct platform_device *pdev) 200static int sama5d4_wdt_probe(struct platform_device *pdev)
201{ 201{
202 struct device *dev = &pdev->dev;
202 struct watchdog_device *wdd; 203 struct watchdog_device *wdd;
203 struct sama5d4_wdt *wdt; 204 struct sama5d4_wdt *wdt;
204 struct resource *res;
205 void __iomem *regs; 205 void __iomem *regs;
206 u32 irq = 0; 206 u32 irq = 0;
207 u32 timeout; 207 u32 timeout;
208 int ret; 208 int ret;
209 209
210 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 210 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
211 if (!wdt) 211 if (!wdt)
212 return -ENOMEM; 212 return -ENOMEM;
213 213
@@ -221,33 +221,31 @@ static int sama5d4_wdt_probe(struct platform_device *pdev)
221 221
222 watchdog_set_drvdata(wdd, wdt); 222 watchdog_set_drvdata(wdd, wdt);
223 223
224 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 224 regs = devm_platform_ioremap_resource(pdev, 0);
225 regs = devm_ioremap_resource(&pdev->dev, res);
226 if (IS_ERR(regs)) 225 if (IS_ERR(regs))
227 return PTR_ERR(regs); 226 return PTR_ERR(regs);
228 227
229 wdt->reg_base = regs; 228 wdt->reg_base = regs;
230 229
231 irq = irq_of_parse_and_map(pdev->dev.of_node, 0); 230 irq = irq_of_parse_and_map(dev->of_node, 0);
232 if (!irq) 231 if (!irq)
233 dev_warn(&pdev->dev, "failed to get IRQ from DT\n"); 232 dev_warn(dev, "failed to get IRQ from DT\n");
234 233
235 ret = of_sama5d4_wdt_init(pdev->dev.of_node, wdt); 234 ret = of_sama5d4_wdt_init(dev->of_node, wdt);
236 if (ret) 235 if (ret)
237 return ret; 236 return ret;
238 237
239 if ((wdt->mr & AT91_WDT_WDFIEN) && irq) { 238 if ((wdt->mr & AT91_WDT_WDFIEN) && irq) {
240 ret = devm_request_irq(&pdev->dev, irq, sama5d4_wdt_irq_handler, 239 ret = devm_request_irq(dev, irq, sama5d4_wdt_irq_handler,
241 IRQF_SHARED | IRQF_IRQPOLL | 240 IRQF_SHARED | IRQF_IRQPOLL |
242 IRQF_NO_SUSPEND, pdev->name, pdev); 241 IRQF_NO_SUSPEND, pdev->name, pdev);
243 if (ret) { 242 if (ret) {
244 dev_err(&pdev->dev, 243 dev_err(dev, "cannot register interrupt handler\n");
245 "cannot register interrupt handler\n");
246 return ret; 244 return ret;
247 } 245 }
248 } 246 }
249 247
250 watchdog_init_timeout(wdd, wdt_timeout, &pdev->dev); 248 watchdog_init_timeout(wdd, wdt_timeout, dev);
251 249
252 timeout = WDT_SEC2TICKS(wdd->timeout); 250 timeout = WDT_SEC2TICKS(wdd->timeout);
253 251
@@ -260,31 +258,21 @@ static int sama5d4_wdt_probe(struct platform_device *pdev)
260 258
261 watchdog_set_nowayout(wdd, nowayout); 259 watchdog_set_nowayout(wdd, nowayout);
262 260
263 ret = watchdog_register_device(wdd); 261 watchdog_stop_on_unregister(wdd);
262 ret = devm_watchdog_register_device(dev, wdd);
264 if (ret) { 263 if (ret) {
265 dev_err(&pdev->dev, "failed to register watchdog device\n"); 264 dev_err(dev, "failed to register watchdog device\n");
266 return ret; 265 return ret;
267 } 266 }
268 267
269 platform_set_drvdata(pdev, wdt); 268 platform_set_drvdata(pdev, wdt);
270 269
271 dev_info(&pdev->dev, "initialized (timeout = %d sec, nowayout = %d)\n", 270 dev_info(dev, "initialized (timeout = %d sec, nowayout = %d)\n",
272 wdd->timeout, nowayout); 271 wdd->timeout, nowayout);
273 272
274 return 0; 273 return 0;
275} 274}
276 275
277static int sama5d4_wdt_remove(struct platform_device *pdev)
278{
279 struct sama5d4_wdt *wdt = platform_get_drvdata(pdev);
280
281 sama5d4_wdt_stop(&wdt->wdd);
282
283 watchdog_unregister_device(&wdt->wdd);
284
285 return 0;
286}
287
288static const struct of_device_id sama5d4_wdt_of_match[] = { 276static const struct of_device_id sama5d4_wdt_of_match[] = {
289 { .compatible = "atmel,sama5d4-wdt", }, 277 { .compatible = "atmel,sama5d4-wdt", },
290 { } 278 { }
@@ -312,7 +300,6 @@ static SIMPLE_DEV_PM_OPS(sama5d4_wdt_pm_ops, NULL,
312 300
313static struct platform_driver sama5d4_wdt_driver = { 301static struct platform_driver sama5d4_wdt_driver = {
314 .probe = sama5d4_wdt_probe, 302 .probe = sama5d4_wdt_probe,
315 .remove = sama5d4_wdt_remove,
316 .driver = { 303 .driver = {
317 .name = "sama5d4_wdt", 304 .name = "sama5d4_wdt",
318 .pm = &sama5d4_wdt_pm_ops, 305 .pm = &sama5d4_wdt_pm_ops,
diff --git a/drivers/watchdog/sb_wdog.c b/drivers/watchdog/sb_wdog.c
index 0692d42e5c67..5a6ced7a7e8f 100644
--- a/drivers/watchdog/sb_wdog.c
+++ b/drivers/watchdog/sb_wdog.c
@@ -67,7 +67,7 @@ static DEFINE_SPINLOCK(sbwd_lock);
67 * 67 *
68 * wdog is the iomem address of the cfg register 68 * wdog is the iomem address of the cfg register
69 */ 69 */
70void sbwdog_set(char __iomem *wdog, unsigned long t) 70static void sbwdog_set(char __iomem *wdog, unsigned long t)
71{ 71{
72 spin_lock(&sbwd_lock); 72 spin_lock(&sbwd_lock);
73 __raw_writeb(0, wdog); 73 __raw_writeb(0, wdog);
@@ -81,7 +81,7 @@ void sbwdog_set(char __iomem *wdog, unsigned long t)
81 * 81 *
82 * wdog is the iomem address of the cfg register 82 * wdog is the iomem address of the cfg register
83 */ 83 */
84void sbwdog_pet(char __iomem *wdog) 84static void sbwdog_pet(char __iomem *wdog)
85{ 85{
86 spin_lock(&sbwd_lock); 86 spin_lock(&sbwd_lock);
87 __raw_writeb(__raw_readb(wdog) | 1, wdog); 87 __raw_writeb(__raw_readb(wdog) | 1, wdog);
diff --git a/drivers/watchdog/sbsa_gwdt.c b/drivers/watchdog/sbsa_gwdt.c
index e221e47396ab..3219422f67a9 100644
--- a/drivers/watchdog/sbsa_gwdt.c
+++ b/drivers/watchdog/sbsa_gwdt.c
@@ -231,7 +231,6 @@ static int sbsa_gwdt_probe(struct platform_device *pdev)
231 struct device *dev = &pdev->dev; 231 struct device *dev = &pdev->dev;
232 struct watchdog_device *wdd; 232 struct watchdog_device *wdd;
233 struct sbsa_gwdt *gwdt; 233 struct sbsa_gwdt *gwdt;
234 struct resource *res;
235 int ret, irq; 234 int ret, irq;
236 u32 status; 235 u32 status;
237 236
@@ -240,13 +239,11 @@ static int sbsa_gwdt_probe(struct platform_device *pdev)
240 return -ENOMEM; 239 return -ENOMEM;
241 platform_set_drvdata(pdev, gwdt); 240 platform_set_drvdata(pdev, gwdt);
242 241
243 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 242 cf_base = devm_platform_ioremap_resource(pdev, 0);
244 cf_base = devm_ioremap_resource(dev, res);
245 if (IS_ERR(cf_base)) 243 if (IS_ERR(cf_base))
246 return PTR_ERR(cf_base); 244 return PTR_ERR(cf_base);
247 245
248 res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 246 rf_base = devm_platform_ioremap_resource(pdev, 1);
249 rf_base = devm_ioremap_resource(dev, res);
250 if (IS_ERR(rf_base)) 247 if (IS_ERR(rf_base))
251 return PTR_ERR(rf_base); 248 return PTR_ERR(rf_base);
252 249
@@ -313,7 +310,8 @@ static int sbsa_gwdt_probe(struct platform_device *pdev)
313 */ 310 */
314 sbsa_gwdt_set_timeout(wdd, wdd->timeout); 311 sbsa_gwdt_set_timeout(wdd, wdd->timeout);
315 312
316 ret = watchdog_register_device(wdd); 313 watchdog_stop_on_reboot(wdd);
314 ret = devm_watchdog_register_device(dev, wdd);
317 if (ret) 315 if (ret)
318 return ret; 316 return ret;
319 317
@@ -324,22 +322,6 @@ static int sbsa_gwdt_probe(struct platform_device *pdev)
324 return 0; 322 return 0;
325} 323}
326 324
327static void sbsa_gwdt_shutdown(struct platform_device *pdev)
328{
329 struct sbsa_gwdt *gwdt = platform_get_drvdata(pdev);
330
331 sbsa_gwdt_stop(&gwdt->wdd);
332}
333
334static int sbsa_gwdt_remove(struct platform_device *pdev)
335{
336 struct sbsa_gwdt *gwdt = platform_get_drvdata(pdev);
337
338 watchdog_unregister_device(&gwdt->wdd);
339
340 return 0;
341}
342
343/* Disable watchdog if it is active during suspend */ 325/* Disable watchdog if it is active during suspend */
344static int __maybe_unused sbsa_gwdt_suspend(struct device *dev) 326static int __maybe_unused sbsa_gwdt_suspend(struct device *dev)
345{ 327{
@@ -385,8 +367,6 @@ static struct platform_driver sbsa_gwdt_driver = {
385 .of_match_table = sbsa_gwdt_of_match, 367 .of_match_table = sbsa_gwdt_of_match,
386 }, 368 },
387 .probe = sbsa_gwdt_probe, 369 .probe = sbsa_gwdt_probe,
388 .remove = sbsa_gwdt_remove,
389 .shutdown = sbsa_gwdt_shutdown,
390 .id_table = sbsa_gwdt_pdev_match, 370 .id_table = sbsa_gwdt_pdev_match,
391}; 371};
392 372
diff --git a/drivers/watchdog/shwdt.c b/drivers/watchdog/shwdt.c
index a7d6425db807..e7617b7df70b 100644
--- a/drivers/watchdog/shwdt.c
+++ b/drivers/watchdog/shwdt.c
@@ -220,7 +220,6 @@ static struct watchdog_device sh_wdt_dev = {
220static int sh_wdt_probe(struct platform_device *pdev) 220static int sh_wdt_probe(struct platform_device *pdev)
221{ 221{
222 struct sh_wdt *wdt; 222 struct sh_wdt *wdt;
223 struct resource *res;
224 int rc; 223 int rc;
225 224
226 /* 225 /*
@@ -245,8 +244,7 @@ static int sh_wdt_probe(struct platform_device *pdev)
245 wdt->clk = NULL; 244 wdt->clk = NULL;
246 } 245 }
247 246
248 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 247 wdt->base = devm_platform_ioremap_resource(pdev, 0);
249 wdt->base = devm_ioremap_resource(wdt->dev, res);
250 if (IS_ERR(wdt->base)) 248 if (IS_ERR(wdt->base))
251 return PTR_ERR(wdt->base); 249 return PTR_ERR(wdt->base);
252 250
diff --git a/drivers/watchdog/sirfsoc_wdt.c b/drivers/watchdog/sirfsoc_wdt.c
index ac0c9d2c4aee..e79a4097d50b 100644
--- a/drivers/watchdog/sirfsoc_wdt.c
+++ b/drivers/watchdog/sirfsoc_wdt.c
@@ -146,22 +146,23 @@ static struct watchdog_device sirfsoc_wdd = {
146 146
147static int sirfsoc_wdt_probe(struct platform_device *pdev) 147static int sirfsoc_wdt_probe(struct platform_device *pdev)
148{ 148{
149 struct resource *res; 149 struct device *dev = &pdev->dev;
150 int ret; 150 int ret;
151 void __iomem *base; 151 void __iomem *base;
152 152
153 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 153 base = devm_platform_ioremap_resource(pdev, 0);
154 base = devm_ioremap_resource(&pdev->dev, res);
155 if (IS_ERR(base)) 154 if (IS_ERR(base))
156 return PTR_ERR(base); 155 return PTR_ERR(base);
157 156
158 watchdog_set_drvdata(&sirfsoc_wdd, (__force void *)base); 157 watchdog_set_drvdata(&sirfsoc_wdd, (__force void *)base);
159 158
160 watchdog_init_timeout(&sirfsoc_wdd, timeout, &pdev->dev); 159 watchdog_init_timeout(&sirfsoc_wdd, timeout, dev);
161 watchdog_set_nowayout(&sirfsoc_wdd, nowayout); 160 watchdog_set_nowayout(&sirfsoc_wdd, nowayout);
162 sirfsoc_wdd.parent = &pdev->dev; 161 sirfsoc_wdd.parent = dev;
163 162
164 ret = watchdog_register_device(&sirfsoc_wdd); 163 watchdog_stop_on_reboot(&sirfsoc_wdd);
164 watchdog_stop_on_unregister(&sirfsoc_wdd);
165 ret = devm_watchdog_register_device(dev, &sirfsoc_wdd);
165 if (ret) 166 if (ret)
166 return ret; 167 return ret;
167 168
@@ -170,19 +171,6 @@ static int sirfsoc_wdt_probe(struct platform_device *pdev)
170 return 0; 171 return 0;
171} 172}
172 173
173static void sirfsoc_wdt_shutdown(struct platform_device *pdev)
174{
175 struct watchdog_device *wdd = platform_get_drvdata(pdev);
176
177 sirfsoc_wdt_disable(wdd);
178}
179
180static int sirfsoc_wdt_remove(struct platform_device *pdev)
181{
182 sirfsoc_wdt_shutdown(pdev);
183 return 0;
184}
185
186#ifdef CONFIG_PM_SLEEP 174#ifdef CONFIG_PM_SLEEP
187static int sirfsoc_wdt_suspend(struct device *dev) 175static int sirfsoc_wdt_suspend(struct device *dev)
188{ 176{
@@ -220,8 +208,6 @@ static struct platform_driver sirfsoc_wdt_driver = {
220 .of_match_table = sirfsoc_wdt_of_match, 208 .of_match_table = sirfsoc_wdt_of_match,
221 }, 209 },
222 .probe = sirfsoc_wdt_probe, 210 .probe = sirfsoc_wdt_probe,
223 .remove = sirfsoc_wdt_remove,
224 .shutdown = sirfsoc_wdt_shutdown,
225}; 211};
226module_platform_driver(sirfsoc_wdt_driver); 212module_platform_driver(sirfsoc_wdt_driver);
227 213
diff --git a/drivers/watchdog/sp5100_tco.c b/drivers/watchdog/sp5100_tco.c
index 41aaae2d5287..553735b256e2 100644
--- a/drivers/watchdog/sp5100_tco.c
+++ b/drivers/watchdog/sp5100_tco.c
@@ -395,9 +395,7 @@ static int sp5100_tco_probe(struct platform_device *pdev)
395 wdd->min_timeout = 1; 395 wdd->min_timeout = 1;
396 wdd->max_timeout = 0xffff; 396 wdd->max_timeout = 0xffff;
397 397
398 if (watchdog_init_timeout(wdd, heartbeat, NULL)) 398 watchdog_init_timeout(wdd, heartbeat, NULL);
399 dev_info(dev, "timeout value invalid, using %d\n",
400 wdd->timeout);
401 watchdog_set_nowayout(wdd, nowayout); 399 watchdog_set_nowayout(wdd, nowayout);
402 watchdog_stop_on_reboot(wdd); 400 watchdog_stop_on_reboot(wdd);
403 watchdog_stop_on_unregister(wdd); 401 watchdog_stop_on_unregister(wdd);
diff --git a/drivers/watchdog/sprd_wdt.c b/drivers/watchdog/sprd_wdt.c
index ff9397d9638a..14874e9b207b 100644
--- a/drivers/watchdog/sprd_wdt.c
+++ b/drivers/watchdog/sprd_wdt.c
@@ -245,9 +245,7 @@ static u32 sprd_wdt_get_timeleft(struct watchdog_device *wdd)
245 u32 val; 245 u32 val;
246 246
247 val = sprd_wdt_get_cnt_value(wdt); 247 val = sprd_wdt_get_cnt_value(wdt);
248 val = val / SPRD_WDT_CNT_STEP; 248 return val / SPRD_WDT_CNT_STEP;
249
250 return val;
251} 249}
252 250
253static const struct watchdog_ops sprd_wdt_ops = { 251static const struct watchdog_ops sprd_wdt_ops = {
@@ -269,70 +267,68 @@ static const struct watchdog_info sprd_wdt_info = {
269 267
270static int sprd_wdt_probe(struct platform_device *pdev) 268static int sprd_wdt_probe(struct platform_device *pdev)
271{ 269{
272 struct resource *wdt_res; 270 struct device *dev = &pdev->dev;
273 struct sprd_wdt *wdt; 271 struct sprd_wdt *wdt;
274 int ret; 272 int ret;
275 273
276 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 274 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
277 if (!wdt) 275 if (!wdt)
278 return -ENOMEM; 276 return -ENOMEM;
279 277
280 wdt_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 278 wdt->base = devm_platform_ioremap_resource(pdev, 0);
281 wdt->base = devm_ioremap_resource(&pdev->dev, wdt_res);
282 if (IS_ERR(wdt->base)) 279 if (IS_ERR(wdt->base))
283 return PTR_ERR(wdt->base); 280 return PTR_ERR(wdt->base);
284 281
285 wdt->enable = devm_clk_get(&pdev->dev, "enable"); 282 wdt->enable = devm_clk_get(dev, "enable");
286 if (IS_ERR(wdt->enable)) { 283 if (IS_ERR(wdt->enable)) {
287 dev_err(&pdev->dev, "can't get the enable clock\n"); 284 dev_err(dev, "can't get the enable clock\n");
288 return PTR_ERR(wdt->enable); 285 return PTR_ERR(wdt->enable);
289 } 286 }
290 287
291 wdt->rtc_enable = devm_clk_get(&pdev->dev, "rtc_enable"); 288 wdt->rtc_enable = devm_clk_get(dev, "rtc_enable");
292 if (IS_ERR(wdt->rtc_enable)) { 289 if (IS_ERR(wdt->rtc_enable)) {
293 dev_err(&pdev->dev, "can't get the rtc enable clock\n"); 290 dev_err(dev, "can't get the rtc enable clock\n");
294 return PTR_ERR(wdt->rtc_enable); 291 return PTR_ERR(wdt->rtc_enable);
295 } 292 }
296 293
297 wdt->irq = platform_get_irq(pdev, 0); 294 wdt->irq = platform_get_irq(pdev, 0);
298 if (wdt->irq < 0) { 295 if (wdt->irq < 0) {
299 dev_err(&pdev->dev, "failed to get IRQ resource\n"); 296 dev_err(dev, "failed to get IRQ resource\n");
300 return wdt->irq; 297 return wdt->irq;
301 } 298 }
302 299
303 ret = devm_request_irq(&pdev->dev, wdt->irq, sprd_wdt_isr, 300 ret = devm_request_irq(dev, wdt->irq, sprd_wdt_isr, IRQF_NO_SUSPEND,
304 IRQF_NO_SUSPEND, "sprd-wdt", (void *)wdt); 301 "sprd-wdt", (void *)wdt);
305 if (ret) { 302 if (ret) {
306 dev_err(&pdev->dev, "failed to register irq\n"); 303 dev_err(dev, "failed to register irq\n");
307 return ret; 304 return ret;
308 } 305 }
309 306
310 wdt->wdd.info = &sprd_wdt_info; 307 wdt->wdd.info = &sprd_wdt_info;
311 wdt->wdd.ops = &sprd_wdt_ops; 308 wdt->wdd.ops = &sprd_wdt_ops;
312 wdt->wdd.parent = &pdev->dev; 309 wdt->wdd.parent = dev;
313 wdt->wdd.min_timeout = SPRD_WDT_MIN_TIMEOUT; 310 wdt->wdd.min_timeout = SPRD_WDT_MIN_TIMEOUT;
314 wdt->wdd.max_timeout = SPRD_WDT_MAX_TIMEOUT; 311 wdt->wdd.max_timeout = SPRD_WDT_MAX_TIMEOUT;
315 wdt->wdd.timeout = SPRD_WDT_MAX_TIMEOUT; 312 wdt->wdd.timeout = SPRD_WDT_MAX_TIMEOUT;
316 313
317 ret = sprd_wdt_enable(wdt); 314 ret = sprd_wdt_enable(wdt);
318 if (ret) { 315 if (ret) {
319 dev_err(&pdev->dev, "failed to enable wdt\n"); 316 dev_err(dev, "failed to enable wdt\n");
320 return ret; 317 return ret;
321 } 318 }
322 ret = devm_add_action(&pdev->dev, sprd_wdt_disable, wdt); 319 ret = devm_add_action_or_reset(dev, sprd_wdt_disable, wdt);
323 if (ret) { 320 if (ret) {
324 sprd_wdt_disable(wdt); 321 dev_err(dev, "Failed to add wdt disable action\n");
325 dev_err(&pdev->dev, "Failed to add wdt disable action\n");
326 return ret; 322 return ret;
327 } 323 }
328 324
329 watchdog_set_nowayout(&wdt->wdd, WATCHDOG_NOWAYOUT); 325 watchdog_set_nowayout(&wdt->wdd, WATCHDOG_NOWAYOUT);
330 watchdog_init_timeout(&wdt->wdd, 0, &pdev->dev); 326 watchdog_init_timeout(&wdt->wdd, 0, dev);
331 327
332 ret = devm_watchdog_register_device(&pdev->dev, &wdt->wdd); 328 ret = devm_watchdog_register_device(dev, &wdt->wdd);
333 if (ret) { 329 if (ret) {
334 sprd_wdt_disable(wdt); 330 sprd_wdt_disable(wdt);
335 dev_err(&pdev->dev, "failed to register watchdog\n"); 331 dev_err(dev, "failed to register watchdog\n");
336 return ret; 332 return ret;
337 } 333 }
338 platform_set_drvdata(pdev, wdt); 334 platform_set_drvdata(pdev, wdt);
diff --git a/drivers/watchdog/st_lpc_wdt.c b/drivers/watchdog/st_lpc_wdt.c
index 177829b379da..7a90184eb950 100644
--- a/drivers/watchdog/st_lpc_wdt.c
+++ b/drivers/watchdog/st_lpc_wdt.c
@@ -142,13 +142,18 @@ static struct watchdog_device st_wdog_dev = {
142 .ops = &st_wdog_ops, 142 .ops = &st_wdog_ops,
143}; 143};
144 144
145static void st_clk_disable_unprepare(void *data)
146{
147 clk_disable_unprepare(data);
148}
149
145static int st_wdog_probe(struct platform_device *pdev) 150static int st_wdog_probe(struct platform_device *pdev)
146{ 151{
152 struct device *dev = &pdev->dev;
147 const struct of_device_id *match; 153 const struct of_device_id *match;
148 struct device_node *np = pdev->dev.of_node; 154 struct device_node *np = dev->of_node;
149 struct st_wdog *st_wdog; 155 struct st_wdog *st_wdog;
150 struct regmap *regmap; 156 struct regmap *regmap;
151 struct resource *res;
152 struct clk *clk; 157 struct clk *clk;
153 void __iomem *base; 158 void __iomem *base;
154 uint32_t mode; 159 uint32_t mode;
@@ -156,7 +161,7 @@ static int st_wdog_probe(struct platform_device *pdev)
156 161
157 ret = of_property_read_u32(np, "st,lpc-mode", &mode); 162 ret = of_property_read_u32(np, "st,lpc-mode", &mode);
158 if (ret) { 163 if (ret) {
159 dev_err(&pdev->dev, "An LPC mode must be provided\n"); 164 dev_err(dev, "An LPC mode must be provided\n");
160 return -EINVAL; 165 return -EINVAL;
161 } 166 }
162 167
@@ -164,35 +169,34 @@ static int st_wdog_probe(struct platform_device *pdev)
164 if (mode != ST_LPC_MODE_WDT) 169 if (mode != ST_LPC_MODE_WDT)
165 return -ENODEV; 170 return -ENODEV;
166 171
167 st_wdog = devm_kzalloc(&pdev->dev, sizeof(*st_wdog), GFP_KERNEL); 172 st_wdog = devm_kzalloc(dev, sizeof(*st_wdog), GFP_KERNEL);
168 if (!st_wdog) 173 if (!st_wdog)
169 return -ENOMEM; 174 return -ENOMEM;
170 175
171 match = of_match_device(st_wdog_match, &pdev->dev); 176 match = of_match_device(st_wdog_match, dev);
172 if (!match) { 177 if (!match) {
173 dev_err(&pdev->dev, "Couldn't match device\n"); 178 dev_err(dev, "Couldn't match device\n");
174 return -ENODEV; 179 return -ENODEV;
175 } 180 }
176 st_wdog->syscfg = (struct st_wdog_syscfg *)match->data; 181 st_wdog->syscfg = (struct st_wdog_syscfg *)match->data;
177 182
178 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 183 base = devm_platform_ioremap_resource(pdev, 0);
179 base = devm_ioremap_resource(&pdev->dev, res);
180 if (IS_ERR(base)) 184 if (IS_ERR(base))
181 return PTR_ERR(base); 185 return PTR_ERR(base);
182 186
183 regmap = syscon_regmap_lookup_by_phandle(np, "st,syscfg"); 187 regmap = syscon_regmap_lookup_by_phandle(np, "st,syscfg");
184 if (IS_ERR(regmap)) { 188 if (IS_ERR(regmap)) {
185 dev_err(&pdev->dev, "No syscfg phandle specified\n"); 189 dev_err(dev, "No syscfg phandle specified\n");
186 return PTR_ERR(regmap); 190 return PTR_ERR(regmap);
187 } 191 }
188 192
189 clk = devm_clk_get(&pdev->dev, NULL); 193 clk = devm_clk_get(dev, NULL);
190 if (IS_ERR(clk)) { 194 if (IS_ERR(clk)) {
191 dev_err(&pdev->dev, "Unable to request clock\n"); 195 dev_err(dev, "Unable to request clock\n");
192 return PTR_ERR(clk); 196 return PTR_ERR(clk);
193 } 197 }
194 198
195 st_wdog->dev = &pdev->dev; 199 st_wdog->dev = dev;
196 st_wdog->base = base; 200 st_wdog->base = base;
197 st_wdog->clk = clk; 201 st_wdog->clk = clk;
198 st_wdog->regmap = regmap; 202 st_wdog->regmap = regmap;
@@ -200,39 +204,38 @@ static int st_wdog_probe(struct platform_device *pdev)
200 st_wdog->clkrate = clk_get_rate(st_wdog->clk); 204 st_wdog->clkrate = clk_get_rate(st_wdog->clk);
201 205
202 if (!st_wdog->clkrate) { 206 if (!st_wdog->clkrate) {
203 dev_err(&pdev->dev, "Unable to fetch clock rate\n"); 207 dev_err(dev, "Unable to fetch clock rate\n");
204 return -EINVAL; 208 return -EINVAL;
205 } 209 }
206 st_wdog_dev.max_timeout = 0xFFFFFFFF / st_wdog->clkrate; 210 st_wdog_dev.max_timeout = 0xFFFFFFFF / st_wdog->clkrate;
207 st_wdog_dev.parent = &pdev->dev; 211 st_wdog_dev.parent = dev;
208 212
209 ret = clk_prepare_enable(clk); 213 ret = clk_prepare_enable(clk);
210 if (ret) { 214 if (ret) {
211 dev_err(&pdev->dev, "Unable to enable clock\n"); 215 dev_err(dev, "Unable to enable clock\n");
212 return ret; 216 return ret;
213 } 217 }
218 ret = devm_add_action_or_reset(dev, st_clk_disable_unprepare, clk);
219 if (ret)
220 return ret;
214 221
215 watchdog_set_drvdata(&st_wdog_dev, st_wdog); 222 watchdog_set_drvdata(&st_wdog_dev, st_wdog);
216 watchdog_set_nowayout(&st_wdog_dev, WATCHDOG_NOWAYOUT); 223 watchdog_set_nowayout(&st_wdog_dev, WATCHDOG_NOWAYOUT);
217 224
218 /* Init Watchdog timeout with value in DT */ 225 /* Init Watchdog timeout with value in DT */
219 ret = watchdog_init_timeout(&st_wdog_dev, 0, &pdev->dev); 226 ret = watchdog_init_timeout(&st_wdog_dev, 0, dev);
220 if (ret) { 227 if (ret)
221 dev_err(&pdev->dev, "Unable to initialise watchdog timeout\n");
222 clk_disable_unprepare(clk);
223 return ret; 228 return ret;
224 }
225 229
226 ret = watchdog_register_device(&st_wdog_dev); 230 ret = devm_watchdog_register_device(dev, &st_wdog_dev);
227 if (ret) { 231 if (ret) {
228 dev_err(&pdev->dev, "Unable to register watchdog\n"); 232 dev_err(dev, "Unable to register watchdog\n");
229 clk_disable_unprepare(clk);
230 return ret; 233 return ret;
231 } 234 }
232 235
233 st_wdog_setup(st_wdog, true); 236 st_wdog_setup(st_wdog, true);
234 237
235 dev_info(&pdev->dev, "LPC Watchdog driver registered, reset type is %s", 238 dev_info(dev, "LPC Watchdog driver registered, reset type is %s",
236 st_wdog->warm_reset ? "warm" : "cold"); 239 st_wdog->warm_reset ? "warm" : "cold");
237 240
238 return ret; 241 return ret;
@@ -243,8 +246,6 @@ static int st_wdog_remove(struct platform_device *pdev)
243 struct st_wdog *st_wdog = watchdog_get_drvdata(&st_wdog_dev); 246 struct st_wdog *st_wdog = watchdog_get_drvdata(&st_wdog_dev);
244 247
245 st_wdog_setup(st_wdog, false); 248 st_wdog_setup(st_wdog, false);
246 watchdog_unregister_device(&st_wdog_dev);
247 clk_disable_unprepare(st_wdog->clk);
248 249
249 return 0; 250 return 0;
250} 251}
diff --git a/drivers/watchdog/stm32_iwdg.c b/drivers/watchdog/stm32_iwdg.c
index e00e3b3526c6..d569a3634d9b 100644
--- a/drivers/watchdog/stm32_iwdg.c
+++ b/drivers/watchdog/stm32_iwdg.c
@@ -34,36 +34,44 @@
34#define KR_KEY_EWA 0x5555 /* write access enable */ 34#define KR_KEY_EWA 0x5555 /* write access enable */
35#define KR_KEY_DWA 0x0000 /* write access disable */ 35#define KR_KEY_DWA 0x0000 /* write access disable */
36 36
37/* IWDG_PR register bit values */ 37/* IWDG_PR register */
38#define PR_4 0x00 /* prescaler set to 4 */ 38#define PR_SHIFT 2
39#define PR_8 0x01 /* prescaler set to 8 */ 39#define PR_MIN BIT(PR_SHIFT)
40#define PR_16 0x02 /* prescaler set to 16 */
41#define PR_32 0x03 /* prescaler set to 32 */
42#define PR_64 0x04 /* prescaler set to 64 */
43#define PR_128 0x05 /* prescaler set to 128 */
44#define PR_256 0x06 /* prescaler set to 256 */
45 40
46/* IWDG_RLR register values */ 41/* IWDG_RLR register values */
47#define RLR_MIN 0x07C /* min value supported by reload register */ 42#define RLR_MIN 0x2 /* min value recommended */
48#define RLR_MAX 0xFFF /* max value supported by reload register */ 43#define RLR_MAX GENMASK(11, 0) /* max value of reload register */
49 44
50/* IWDG_SR register bit mask */ 45/* IWDG_SR register bit mask */
51#define FLAG_PVU BIT(0) /* Watchdog prescaler value update */ 46#define SR_PVU BIT(0) /* Watchdog prescaler value update */
52#define FLAG_RVU BIT(1) /* Watchdog counter reload value update */ 47#define SR_RVU BIT(1) /* Watchdog counter reload value update */
53 48
54/* set timeout to 100000 us */ 49/* set timeout to 100000 us */
55#define TIMEOUT_US 100000 50#define TIMEOUT_US 100000
56#define SLEEP_US 1000 51#define SLEEP_US 1000
57 52
58#define HAS_PCLK true 53struct stm32_iwdg_data {
54 bool has_pclk;
55 u32 max_prescaler;
56};
57
58static const struct stm32_iwdg_data stm32_iwdg_data = {
59 .has_pclk = false,
60 .max_prescaler = 256,
61};
62
63static const struct stm32_iwdg_data stm32mp1_iwdg_data = {
64 .has_pclk = true,
65 .max_prescaler = 1024,
66};
59 67
60struct stm32_iwdg { 68struct stm32_iwdg {
61 struct watchdog_device wdd; 69 struct watchdog_device wdd;
70 const struct stm32_iwdg_data *data;
62 void __iomem *regs; 71 void __iomem *regs;
63 struct clk *clk_lsi; 72 struct clk *clk_lsi;
64 struct clk *clk_pclk; 73 struct clk *clk_pclk;
65 unsigned int rate; 74 unsigned int rate;
66 bool has_pclk;
67}; 75};
68 76
69static inline u32 reg_read(void __iomem *base, u32 reg) 77static inline u32 reg_read(void __iomem *base, u32 reg)
@@ -79,31 +87,35 @@ static inline void reg_write(void __iomem *base, u32 reg, u32 val)
79static int stm32_iwdg_start(struct watchdog_device *wdd) 87static int stm32_iwdg_start(struct watchdog_device *wdd)
80{ 88{
81 struct stm32_iwdg *wdt = watchdog_get_drvdata(wdd); 89 struct stm32_iwdg *wdt = watchdog_get_drvdata(wdd);
82 u32 val = FLAG_PVU | FLAG_RVU; 90 u32 tout, presc, iwdg_rlr, iwdg_pr, iwdg_sr;
83 u32 reload;
84 int ret; 91 int ret;
85 92
86 dev_dbg(wdd->parent, "%s\n", __func__); 93 dev_dbg(wdd->parent, "%s\n", __func__);
87 94
88 /* prescaler fixed to 256 */ 95 tout = clamp_t(unsigned int, wdd->timeout,
89 reload = clamp_t(unsigned int, ((wdd->timeout * wdt->rate) / 256) - 1, 96 wdd->min_timeout, wdd->max_hw_heartbeat_ms / 1000);
90 RLR_MIN, RLR_MAX); 97
98 presc = DIV_ROUND_UP(tout * wdt->rate, RLR_MAX + 1);
99
100 /* The prescaler is align on power of 2 and start at 2 ^ PR_SHIFT. */
101 presc = roundup_pow_of_two(presc);
102 iwdg_pr = presc <= 1 << PR_SHIFT ? 0 : ilog2(presc) - PR_SHIFT;
103 iwdg_rlr = ((tout * wdt->rate) / presc) - 1;
91 104
92 /* enable write access */ 105 /* enable write access */
93 reg_write(wdt->regs, IWDG_KR, KR_KEY_EWA); 106 reg_write(wdt->regs, IWDG_KR, KR_KEY_EWA);
94 107
95 /* set prescaler & reload registers */ 108 /* set prescaler & reload registers */
96 reg_write(wdt->regs, IWDG_PR, PR_256); /* prescaler fix to 256 */ 109 reg_write(wdt->regs, IWDG_PR, iwdg_pr);
97 reg_write(wdt->regs, IWDG_RLR, reload); 110 reg_write(wdt->regs, IWDG_RLR, iwdg_rlr);
98 reg_write(wdt->regs, IWDG_KR, KR_KEY_ENABLE); 111 reg_write(wdt->regs, IWDG_KR, KR_KEY_ENABLE);
99 112
100 /* wait for the registers to be updated (max 100ms) */ 113 /* wait for the registers to be updated (max 100ms) */
101 ret = readl_relaxed_poll_timeout(wdt->regs + IWDG_SR, val, 114 ret = readl_relaxed_poll_timeout(wdt->regs + IWDG_SR, iwdg_sr,
102 !(val & (FLAG_PVU | FLAG_RVU)), 115 !(iwdg_sr & (SR_PVU | SR_RVU)),
103 SLEEP_US, TIMEOUT_US); 116 SLEEP_US, TIMEOUT_US);
104 if (ret) { 117 if (ret) {
105 dev_err(wdd->parent, 118 dev_err(wdd->parent, "Fail to set prescaler, reload regs\n");
106 "Fail to set prescaler or reload registers\n");
107 return ret; 119 return ret;
108 } 120 }
109 121
@@ -138,38 +150,52 @@ static int stm32_iwdg_set_timeout(struct watchdog_device *wdd,
138 return 0; 150 return 0;
139} 151}
140 152
153static void stm32_clk_disable_unprepare(void *data)
154{
155 clk_disable_unprepare(data);
156}
157
141static int stm32_iwdg_clk_init(struct platform_device *pdev, 158static int stm32_iwdg_clk_init(struct platform_device *pdev,
142 struct stm32_iwdg *wdt) 159 struct stm32_iwdg *wdt)
143{ 160{
161 struct device *dev = &pdev->dev;
144 u32 ret; 162 u32 ret;
145 163
146 wdt->clk_lsi = devm_clk_get(&pdev->dev, "lsi"); 164 wdt->clk_lsi = devm_clk_get(dev, "lsi");
147 if (IS_ERR(wdt->clk_lsi)) { 165 if (IS_ERR(wdt->clk_lsi)) {
148 dev_err(&pdev->dev, "Unable to get lsi clock\n"); 166 dev_err(dev, "Unable to get lsi clock\n");
149 return PTR_ERR(wdt->clk_lsi); 167 return PTR_ERR(wdt->clk_lsi);
150 } 168 }
151 169
152 /* optional peripheral clock */ 170 /* optional peripheral clock */
153 if (wdt->has_pclk) { 171 if (wdt->data->has_pclk) {
154 wdt->clk_pclk = devm_clk_get(&pdev->dev, "pclk"); 172 wdt->clk_pclk = devm_clk_get(dev, "pclk");
155 if (IS_ERR(wdt->clk_pclk)) { 173 if (IS_ERR(wdt->clk_pclk)) {
156 dev_err(&pdev->dev, "Unable to get pclk clock\n"); 174 dev_err(dev, "Unable to get pclk clock\n");
157 return PTR_ERR(wdt->clk_pclk); 175 return PTR_ERR(wdt->clk_pclk);
158 } 176 }
159 177
160 ret = clk_prepare_enable(wdt->clk_pclk); 178 ret = clk_prepare_enable(wdt->clk_pclk);
161 if (ret) { 179 if (ret) {
162 dev_err(&pdev->dev, "Unable to prepare pclk clock\n"); 180 dev_err(dev, "Unable to prepare pclk clock\n");
163 return ret; 181 return ret;
164 } 182 }
183 ret = devm_add_action_or_reset(dev,
184 stm32_clk_disable_unprepare,
185 wdt->clk_pclk);
186 if (ret)
187 return ret;
165 } 188 }
166 189
167 ret = clk_prepare_enable(wdt->clk_lsi); 190 ret = clk_prepare_enable(wdt->clk_lsi);
168 if (ret) { 191 if (ret) {
169 dev_err(&pdev->dev, "Unable to prepare lsi clock\n"); 192 dev_err(dev, "Unable to prepare lsi clock\n");
170 clk_disable_unprepare(wdt->clk_pclk);
171 return ret; 193 return ret;
172 } 194 }
195 ret = devm_add_action_or_reset(dev, stm32_clk_disable_unprepare,
196 wdt->clk_lsi);
197 if (ret)
198 return ret;
173 199
174 wdt->rate = clk_get_rate(wdt->clk_lsi); 200 wdt->rate = clk_get_rate(wdt->clk_lsi);
175 201
@@ -191,35 +217,31 @@ static const struct watchdog_ops stm32_iwdg_ops = {
191}; 217};
192 218
193static const struct of_device_id stm32_iwdg_of_match[] = { 219static const struct of_device_id stm32_iwdg_of_match[] = {
194 { .compatible = "st,stm32-iwdg", .data = (void *)!HAS_PCLK }, 220 { .compatible = "st,stm32-iwdg", .data = &stm32_iwdg_data },
195 { .compatible = "st,stm32mp1-iwdg", .data = (void *)HAS_PCLK }, 221 { .compatible = "st,stm32mp1-iwdg", .data = &stm32mp1_iwdg_data },
196 { /* end node */ } 222 { /* end node */ }
197}; 223};
198MODULE_DEVICE_TABLE(of, stm32_iwdg_of_match); 224MODULE_DEVICE_TABLE(of, stm32_iwdg_of_match);
199 225
200static int stm32_iwdg_probe(struct platform_device *pdev) 226static int stm32_iwdg_probe(struct platform_device *pdev)
201{ 227{
228 struct device *dev = &pdev->dev;
202 struct watchdog_device *wdd; 229 struct watchdog_device *wdd;
203 const struct of_device_id *match;
204 struct stm32_iwdg *wdt; 230 struct stm32_iwdg *wdt;
205 struct resource *res;
206 int ret; 231 int ret;
207 232
208 match = of_match_device(stm32_iwdg_of_match, &pdev->dev); 233 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
209 if (!match)
210 return -ENODEV;
211
212 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL);
213 if (!wdt) 234 if (!wdt)
214 return -ENOMEM; 235 return -ENOMEM;
215 236
216 wdt->has_pclk = match->data; 237 wdt->data = of_device_get_match_data(&pdev->dev);
238 if (!wdt->data)
239 return -ENODEV;
217 240
218 /* This is the timer base. */ 241 /* This is the timer base. */
219 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 242 wdt->regs = devm_platform_ioremap_resource(pdev, 0);
220 wdt->regs = devm_ioremap_resource(&pdev->dev, res);
221 if (IS_ERR(wdt->regs)) { 243 if (IS_ERR(wdt->regs)) {
222 dev_err(&pdev->dev, "Could not get resource\n"); 244 dev_err(dev, "Could not get resource\n");
223 return PTR_ERR(wdt->regs); 245 return PTR_ERR(wdt->regs);
224 } 246 }
225 247
@@ -229,50 +251,30 @@ static int stm32_iwdg_probe(struct platform_device *pdev)
229 251
230 /* Initialize struct watchdog_device. */ 252 /* Initialize struct watchdog_device. */
231 wdd = &wdt->wdd; 253 wdd = &wdt->wdd;
254 wdd->parent = dev;
232 wdd->info = &stm32_iwdg_info; 255 wdd->info = &stm32_iwdg_info;
233 wdd->ops = &stm32_iwdg_ops; 256 wdd->ops = &stm32_iwdg_ops;
234 wdd->min_timeout = ((RLR_MIN + 1) * 256) / wdt->rate; 257 wdd->min_timeout = DIV_ROUND_UP((RLR_MIN + 1) * PR_MIN, wdt->rate);
235 wdd->max_hw_heartbeat_ms = ((RLR_MAX + 1) * 256 * 1000) / wdt->rate; 258 wdd->max_hw_heartbeat_ms = ((RLR_MAX + 1) * wdt->data->max_prescaler *
236 wdd->parent = &pdev->dev; 259 1000) / wdt->rate;
237 260
238 watchdog_set_drvdata(wdd, wdt); 261 watchdog_set_drvdata(wdd, wdt);
239 watchdog_set_nowayout(wdd, WATCHDOG_NOWAYOUT); 262 watchdog_set_nowayout(wdd, WATCHDOG_NOWAYOUT);
263 watchdog_init_timeout(wdd, 0, dev);
240 264
241 ret = watchdog_init_timeout(wdd, 0, &pdev->dev); 265 ret = devm_watchdog_register_device(dev, wdd);
242 if (ret)
243 dev_warn(&pdev->dev,
244 "unable to set timeout value, using default\n");
245
246 ret = watchdog_register_device(wdd);
247 if (ret) { 266 if (ret) {
248 dev_err(&pdev->dev, "failed to register watchdog device\n"); 267 dev_err(dev, "failed to register watchdog device\n");
249 goto err; 268 return ret;
250 } 269 }
251 270
252 platform_set_drvdata(pdev, wdt); 271 platform_set_drvdata(pdev, wdt);
253 272
254 return 0; 273 return 0;
255err:
256 clk_disable_unprepare(wdt->clk_lsi);
257 clk_disable_unprepare(wdt->clk_pclk);
258
259 return ret;
260}
261
262static int stm32_iwdg_remove(struct platform_device *pdev)
263{
264 struct stm32_iwdg *wdt = platform_get_drvdata(pdev);
265
266 watchdog_unregister_device(&wdt->wdd);
267 clk_disable_unprepare(wdt->clk_lsi);
268 clk_disable_unprepare(wdt->clk_pclk);
269
270 return 0;
271} 274}
272 275
273static struct platform_driver stm32_iwdg_driver = { 276static struct platform_driver stm32_iwdg_driver = {
274 .probe = stm32_iwdg_probe, 277 .probe = stm32_iwdg_probe,
275 .remove = stm32_iwdg_remove,
276 .driver = { 278 .driver = {
277 .name = "iwdg", 279 .name = "iwdg",
278 .of_match_table = of_match_ptr(stm32_iwdg_of_match), 280 .of_match_table = of_match_ptr(stm32_iwdg_of_match),
diff --git a/drivers/watchdog/stmp3xxx_rtc_wdt.c b/drivers/watchdog/stmp3xxx_rtc_wdt.c
index 994c54cc68e9..671f4ba7b4ed 100644
--- a/drivers/watchdog/stmp3xxx_rtc_wdt.c
+++ b/drivers/watchdog/stmp3xxx_rtc_wdt.c
@@ -89,31 +89,31 @@ static struct notifier_block wdt_notifier = {
89 89
90static int stmp3xxx_wdt_probe(struct platform_device *pdev) 90static int stmp3xxx_wdt_probe(struct platform_device *pdev)
91{ 91{
92 struct device *dev = &pdev->dev;
92 int ret; 93 int ret;
93 94
94 watchdog_set_drvdata(&stmp3xxx_wdd, &pdev->dev); 95 watchdog_set_drvdata(&stmp3xxx_wdd, dev);
95 96
96 stmp3xxx_wdd.timeout = clamp_t(unsigned, heartbeat, 1, STMP3XXX_MAX_TIMEOUT); 97 stmp3xxx_wdd.timeout = clamp_t(unsigned, heartbeat, 1, STMP3XXX_MAX_TIMEOUT);
97 stmp3xxx_wdd.parent = &pdev->dev; 98 stmp3xxx_wdd.parent = dev;
98 99
99 ret = watchdog_register_device(&stmp3xxx_wdd); 100 ret = devm_watchdog_register_device(dev, &stmp3xxx_wdd);
100 if (ret < 0) { 101 if (ret < 0) {
101 dev_err(&pdev->dev, "cannot register watchdog device\n"); 102 dev_err(dev, "cannot register watchdog device\n");
102 return ret; 103 return ret;
103 } 104 }
104 105
105 if (register_reboot_notifier(&wdt_notifier)) 106 if (register_reboot_notifier(&wdt_notifier))
106 dev_warn(&pdev->dev, "cannot register reboot notifier\n"); 107 dev_warn(dev, "cannot register reboot notifier\n");
107 108
108 dev_info(&pdev->dev, "initialized watchdog with heartbeat %ds\n", 109 dev_info(dev, "initialized watchdog with heartbeat %ds\n",
109 stmp3xxx_wdd.timeout); 110 stmp3xxx_wdd.timeout);
110 return 0; 111 return 0;
111} 112}
112 113
113static int stmp3xxx_wdt_remove(struct platform_device *pdev) 114static int stmp3xxx_wdt_remove(struct platform_device *pdev)
114{ 115{
115 unregister_reboot_notifier(&wdt_notifier); 116 unregister_reboot_notifier(&wdt_notifier);
116 watchdog_unregister_device(&stmp3xxx_wdd);
117 return 0; 117 return 0;
118} 118}
119 119
diff --git a/drivers/watchdog/stpmic1_wdt.c b/drivers/watchdog/stpmic1_wdt.c
index ad431d8ad95f..45d0c543466f 100644
--- a/drivers/watchdog/stpmic1_wdt.c
+++ b/drivers/watchdog/stpmic1_wdt.c
@@ -81,18 +81,19 @@ static const struct watchdog_ops pmic_watchdog_ops = {
81 81
82static int pmic_wdt_probe(struct platform_device *pdev) 82static int pmic_wdt_probe(struct platform_device *pdev)
83{ 83{
84 struct device *dev = &pdev->dev;
84 int ret; 85 int ret;
85 struct stpmic1 *pmic; 86 struct stpmic1 *pmic;
86 struct stpmic1_wdt *wdt; 87 struct stpmic1_wdt *wdt;
87 88
88 if (!pdev->dev.parent) 89 if (!dev->parent)
89 return -EINVAL; 90 return -EINVAL;
90 91
91 pmic = dev_get_drvdata(pdev->dev.parent); 92 pmic = dev_get_drvdata(dev->parent);
92 if (!pmic) 93 if (!pmic)
93 return -EINVAL; 94 return -EINVAL;
94 95
95 wdt = devm_kzalloc(&pdev->dev, sizeof(struct stpmic1_wdt), GFP_KERNEL); 96 wdt = devm_kzalloc(dev, sizeof(struct stpmic1_wdt), GFP_KERNEL);
96 if (!wdt) 97 if (!wdt)
97 return -ENOMEM; 98 return -ENOMEM;
98 99
@@ -102,15 +103,15 @@ static int pmic_wdt_probe(struct platform_device *pdev)
102 wdt->wdtdev.ops = &pmic_watchdog_ops; 103 wdt->wdtdev.ops = &pmic_watchdog_ops;
103 wdt->wdtdev.min_timeout = PMIC_WDT_MIN_TIMEOUT; 104 wdt->wdtdev.min_timeout = PMIC_WDT_MIN_TIMEOUT;
104 wdt->wdtdev.max_timeout = PMIC_WDT_MAX_TIMEOUT; 105 wdt->wdtdev.max_timeout = PMIC_WDT_MAX_TIMEOUT;
105 wdt->wdtdev.parent = &pdev->dev; 106 wdt->wdtdev.parent = dev;
106 107
107 wdt->wdtdev.timeout = PMIC_WDT_DEFAULT_TIMEOUT; 108 wdt->wdtdev.timeout = PMIC_WDT_DEFAULT_TIMEOUT;
108 watchdog_init_timeout(&wdt->wdtdev, 0, &pdev->dev); 109 watchdog_init_timeout(&wdt->wdtdev, 0, dev);
109 110
110 watchdog_set_nowayout(&wdt->wdtdev, nowayout); 111 watchdog_set_nowayout(&wdt->wdtdev, nowayout);
111 watchdog_set_drvdata(&wdt->wdtdev, wdt); 112 watchdog_set_drvdata(&wdt->wdtdev, wdt);
112 113
113 ret = devm_watchdog_register_device(&pdev->dev, &wdt->wdtdev); 114 ret = devm_watchdog_register_device(dev, &wdt->wdtdev);
114 if (ret) 115 if (ret)
115 return ret; 116 return ret;
116 117
diff --git a/drivers/watchdog/sunxi_wdt.c b/drivers/watchdog/sunxi_wdt.c
index c6c73656997e..9c22f7753c6b 100644
--- a/drivers/watchdog/sunxi_wdt.c
+++ b/drivers/watchdog/sunxi_wdt.c
@@ -233,20 +233,19 @@ MODULE_DEVICE_TABLE(of, sunxi_wdt_dt_ids);
233 233
234static int sunxi_wdt_probe(struct platform_device *pdev) 234static int sunxi_wdt_probe(struct platform_device *pdev)
235{ 235{
236 struct device *dev = &pdev->dev;
236 struct sunxi_wdt_dev *sunxi_wdt; 237 struct sunxi_wdt_dev *sunxi_wdt;
237 struct resource *res;
238 int err; 238 int err;
239 239
240 sunxi_wdt = devm_kzalloc(&pdev->dev, sizeof(*sunxi_wdt), GFP_KERNEL); 240 sunxi_wdt = devm_kzalloc(dev, sizeof(*sunxi_wdt), GFP_KERNEL);
241 if (!sunxi_wdt) 241 if (!sunxi_wdt)
242 return -EINVAL; 242 return -EINVAL;
243 243
244 sunxi_wdt->wdt_regs = of_device_get_match_data(&pdev->dev); 244 sunxi_wdt->wdt_regs = of_device_get_match_data(dev);
245 if (!sunxi_wdt->wdt_regs) 245 if (!sunxi_wdt->wdt_regs)
246 return -ENODEV; 246 return -ENODEV;
247 247
248 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 248 sunxi_wdt->wdt_base = devm_platform_ioremap_resource(pdev, 0);
249 sunxi_wdt->wdt_base = devm_ioremap_resource(&pdev->dev, res);
250 if (IS_ERR(sunxi_wdt->wdt_base)) 249 if (IS_ERR(sunxi_wdt->wdt_base))
251 return PTR_ERR(sunxi_wdt->wdt_base); 250 return PTR_ERR(sunxi_wdt->wdt_base);
252 251
@@ -255,9 +254,9 @@ static int sunxi_wdt_probe(struct platform_device *pdev)
255 sunxi_wdt->wdt_dev.timeout = WDT_MAX_TIMEOUT; 254 sunxi_wdt->wdt_dev.timeout = WDT_MAX_TIMEOUT;
256 sunxi_wdt->wdt_dev.max_timeout = WDT_MAX_TIMEOUT; 255 sunxi_wdt->wdt_dev.max_timeout = WDT_MAX_TIMEOUT;
257 sunxi_wdt->wdt_dev.min_timeout = WDT_MIN_TIMEOUT; 256 sunxi_wdt->wdt_dev.min_timeout = WDT_MIN_TIMEOUT;
258 sunxi_wdt->wdt_dev.parent = &pdev->dev; 257 sunxi_wdt->wdt_dev.parent = dev;
259 258
260 watchdog_init_timeout(&sunxi_wdt->wdt_dev, timeout, &pdev->dev); 259 watchdog_init_timeout(&sunxi_wdt->wdt_dev, timeout, dev);
261 watchdog_set_nowayout(&sunxi_wdt->wdt_dev, nowayout); 260 watchdog_set_nowayout(&sunxi_wdt->wdt_dev, nowayout);
262 watchdog_set_restart_priority(&sunxi_wdt->wdt_dev, 128); 261 watchdog_set_restart_priority(&sunxi_wdt->wdt_dev, 128);
263 262
@@ -266,12 +265,12 @@ static int sunxi_wdt_probe(struct platform_device *pdev)
266 sunxi_wdt_stop(&sunxi_wdt->wdt_dev); 265 sunxi_wdt_stop(&sunxi_wdt->wdt_dev);
267 266
268 watchdog_stop_on_reboot(&sunxi_wdt->wdt_dev); 267 watchdog_stop_on_reboot(&sunxi_wdt->wdt_dev);
269 err = devm_watchdog_register_device(&pdev->dev, &sunxi_wdt->wdt_dev); 268 err = devm_watchdog_register_device(dev, &sunxi_wdt->wdt_dev);
270 if (unlikely(err)) 269 if (unlikely(err))
271 return err; 270 return err;
272 271
273 dev_info(&pdev->dev, "Watchdog enabled (timeout=%d sec, nowayout=%d)", 272 dev_info(dev, "Watchdog enabled (timeout=%d sec, nowayout=%d)",
274 sunxi_wdt->wdt_dev.timeout, nowayout); 273 sunxi_wdt->wdt_dev.timeout, nowayout);
275 274
276 return 0; 275 return 0;
277} 276}
diff --git a/drivers/watchdog/tangox_wdt.c b/drivers/watchdog/tangox_wdt.c
index d0b53f3c0d17..1afb0e9d808c 100644
--- a/drivers/watchdog/tangox_wdt.c
+++ b/drivers/watchdog/tangox_wdt.c
@@ -108,10 +108,14 @@ static const struct watchdog_ops tangox_wdt_ops = {
108 .restart = tangox_wdt_restart, 108 .restart = tangox_wdt_restart,
109}; 109};
110 110
111static void tangox_clk_disable_unprepare(void *data)
112{
113 clk_disable_unprepare(data);
114}
115
111static int tangox_wdt_probe(struct platform_device *pdev) 116static int tangox_wdt_probe(struct platform_device *pdev)
112{ 117{
113 struct tangox_wdt_device *dev; 118 struct tangox_wdt_device *dev;
114 struct resource *res;
115 u32 config; 119 u32 config;
116 int err; 120 int err;
117 121
@@ -119,8 +123,7 @@ static int tangox_wdt_probe(struct platform_device *pdev)
119 if (!dev) 123 if (!dev)
120 return -ENOMEM; 124 return -ENOMEM;
121 125
122 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 126 dev->base = devm_platform_ioremap_resource(pdev, 0);
123 dev->base = devm_ioremap_resource(&pdev->dev, res);
124 if (IS_ERR(dev->base)) 127 if (IS_ERR(dev->base))
125 return PTR_ERR(dev->base); 128 return PTR_ERR(dev->base);
126 129
@@ -131,12 +134,14 @@ static int tangox_wdt_probe(struct platform_device *pdev)
131 err = clk_prepare_enable(dev->clk); 134 err = clk_prepare_enable(dev->clk);
132 if (err) 135 if (err)
133 return err; 136 return err;
137 err = devm_add_action_or_reset(&pdev->dev,
138 tangox_clk_disable_unprepare, dev->clk);
139 if (err)
140 return err;
134 141
135 dev->clk_rate = clk_get_rate(dev->clk); 142 dev->clk_rate = clk_get_rate(dev->clk);
136 if (!dev->clk_rate) { 143 if (!dev->clk_rate)
137 err = -EINVAL; 144 return -EINVAL;
138 goto err;
139 }
140 145
141 dev->wdt.parent = &pdev->dev; 146 dev->wdt.parent = &pdev->dev;
142 dev->wdt.info = &tangox_wdt_info; 147 dev->wdt.info = &tangox_wdt_info;
@@ -170,31 +175,16 @@ static int tangox_wdt_probe(struct platform_device *pdev)
170 175
171 watchdog_set_restart_priority(&dev->wdt, 128); 176 watchdog_set_restart_priority(&dev->wdt, 128);
172 177
173 err = watchdog_register_device(&dev->wdt); 178 watchdog_stop_on_unregister(&dev->wdt);
179 err = devm_watchdog_register_device(&pdev->dev, &dev->wdt);
174 if (err) 180 if (err)
175 goto err; 181 return err;
176 182
177 platform_set_drvdata(pdev, dev); 183 platform_set_drvdata(pdev, dev);
178 184
179 dev_info(&pdev->dev, "SMP86xx/SMP87xx watchdog registered\n"); 185 dev_info(&pdev->dev, "SMP86xx/SMP87xx watchdog registered\n");
180 186
181 return 0; 187 return 0;
182
183 err:
184 clk_disable_unprepare(dev->clk);
185 return err;
186}
187
188static int tangox_wdt_remove(struct platform_device *pdev)
189{
190 struct tangox_wdt_device *dev = platform_get_drvdata(pdev);
191
192 tangox_wdt_stop(&dev->wdt);
193 clk_disable_unprepare(dev->clk);
194
195 watchdog_unregister_device(&dev->wdt);
196
197 return 0;
198} 188}
199 189
200static const struct of_device_id tangox_wdt_dt_ids[] = { 190static const struct of_device_id tangox_wdt_dt_ids[] = {
@@ -206,7 +196,6 @@ MODULE_DEVICE_TABLE(of, tangox_wdt_dt_ids);
206 196
207static struct platform_driver tangox_wdt_driver = { 197static struct platform_driver tangox_wdt_driver = {
208 .probe = tangox_wdt_probe, 198 .probe = tangox_wdt_probe,
209 .remove = tangox_wdt_remove,
210 .driver = { 199 .driver = {
211 .name = "tangox-wdt", 200 .name = "tangox-wdt",
212 .of_match_table = tangox_wdt_dt_ids, 201 .of_match_table = tangox_wdt_dt_ids,
diff --git a/drivers/watchdog/tegra_wdt.c b/drivers/watchdog/tegra_wdt.c
index 877dd39bd41f..a58b000acc4f 100644
--- a/drivers/watchdog/tegra_wdt.c
+++ b/drivers/watchdog/tegra_wdt.c
@@ -181,15 +181,14 @@ static const struct watchdog_ops tegra_wdt_ops = {
181 181
182static int tegra_wdt_probe(struct platform_device *pdev) 182static int tegra_wdt_probe(struct platform_device *pdev)
183{ 183{
184 struct device *dev = &pdev->dev;
184 struct watchdog_device *wdd; 185 struct watchdog_device *wdd;
185 struct tegra_wdt *wdt; 186 struct tegra_wdt *wdt;
186 struct resource *res;
187 void __iomem *regs; 187 void __iomem *regs;
188 int ret; 188 int ret;
189 189
190 /* This is the timer base. */ 190 /* This is the timer base. */
191 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 191 regs = devm_platform_ioremap_resource(pdev, 0);
192 regs = devm_ioremap_resource(&pdev->dev, res);
193 if (IS_ERR(regs)) 192 if (IS_ERR(regs))
194 return PTR_ERR(regs); 193 return PTR_ERR(regs);
195 194
@@ -197,7 +196,7 @@ static int tegra_wdt_probe(struct platform_device *pdev)
197 * Allocate our watchdog driver data, which has the 196 * Allocate our watchdog driver data, which has the
198 * struct watchdog_device nested within it. 197 * struct watchdog_device nested within it.
199 */ 198 */
200 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 199 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
201 if (!wdt) 200 if (!wdt)
202 return -ENOMEM; 201 return -ENOMEM;
203 202
@@ -212,39 +211,27 @@ static int tegra_wdt_probe(struct platform_device *pdev)
212 wdd->ops = &tegra_wdt_ops; 211 wdd->ops = &tegra_wdt_ops;
213 wdd->min_timeout = MIN_WDT_TIMEOUT; 212 wdd->min_timeout = MIN_WDT_TIMEOUT;
214 wdd->max_timeout = MAX_WDT_TIMEOUT; 213 wdd->max_timeout = MAX_WDT_TIMEOUT;
215 wdd->parent = &pdev->dev; 214 wdd->parent = dev;
216 215
217 watchdog_set_drvdata(wdd, wdt); 216 watchdog_set_drvdata(wdd, wdt);
218 217
219 watchdog_set_nowayout(wdd, nowayout); 218 watchdog_set_nowayout(wdd, nowayout);
220 219
221 ret = devm_watchdog_register_device(&pdev->dev, wdd); 220 watchdog_stop_on_unregister(wdd);
221 ret = devm_watchdog_register_device(dev, wdd);
222 if (ret) { 222 if (ret) {
223 dev_err(&pdev->dev, 223 dev_err(dev, "failed to register watchdog device\n");
224 "failed to register watchdog device\n");
225 return ret; 224 return ret;
226 } 225 }
227 226
228 platform_set_drvdata(pdev, wdt); 227 platform_set_drvdata(pdev, wdt);
229 228
230 dev_info(&pdev->dev, 229 dev_info(dev, "initialized (heartbeat = %d sec, nowayout = %d)\n",
231 "initialized (heartbeat = %d sec, nowayout = %d)\n",
232 heartbeat, nowayout); 230 heartbeat, nowayout);
233 231
234 return 0; 232 return 0;
235} 233}
236 234
237static int tegra_wdt_remove(struct platform_device *pdev)
238{
239 struct tegra_wdt *wdt = platform_get_drvdata(pdev);
240
241 tegra_wdt_stop(&wdt->wdd);
242
243 dev_info(&pdev->dev, "removed wdt\n");
244
245 return 0;
246}
247
248#ifdef CONFIG_PM_SLEEP 235#ifdef CONFIG_PM_SLEEP
249static int tegra_wdt_runtime_suspend(struct device *dev) 236static int tegra_wdt_runtime_suspend(struct device *dev)
250{ 237{
@@ -280,7 +267,6 @@ static const struct dev_pm_ops tegra_wdt_pm_ops = {
280 267
281static struct platform_driver tegra_wdt_driver = { 268static struct platform_driver tegra_wdt_driver = {
282 .probe = tegra_wdt_probe, 269 .probe = tegra_wdt_probe,
283 .remove = tegra_wdt_remove,
284 .driver = { 270 .driver = {
285 .name = "tegra-wdt", 271 .name = "tegra-wdt",
286 .pm = &tegra_wdt_pm_ops, 272 .pm = &tegra_wdt_pm_ops,
diff --git a/drivers/watchdog/tqmx86_wdt.c b/drivers/watchdog/tqmx86_wdt.c
index 52941207a12a..72d0b0adde38 100644
--- a/drivers/watchdog/tqmx86_wdt.c
+++ b/drivers/watchdog/tqmx86_wdt.c
@@ -70,11 +70,12 @@ static struct watchdog_ops tqmx86_wdt_ops = {
70 70
71static int tqmx86_wdt_probe(struct platform_device *pdev) 71static int tqmx86_wdt_probe(struct platform_device *pdev)
72{ 72{
73 struct device *dev = &pdev->dev;
73 struct tqmx86_wdt *priv; 74 struct tqmx86_wdt *priv;
74 struct resource *res; 75 struct resource *res;
75 int err; 76 int err;
76 77
77 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 78 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
78 if (!priv) 79 if (!priv)
79 return -ENOMEM; 80 return -ENOMEM;
80 81
@@ -82,14 +83,13 @@ static int tqmx86_wdt_probe(struct platform_device *pdev)
82 if (!res) 83 if (!res)
83 return -ENODEV; 84 return -ENODEV;
84 85
85 priv->io_base = devm_ioport_map(&pdev->dev, res->start, 86 priv->io_base = devm_ioport_map(dev, res->start, resource_size(res));
86 resource_size(res));
87 if (!priv->io_base) 87 if (!priv->io_base)
88 return -ENOMEM; 88 return -ENOMEM;
89 89
90 watchdog_set_drvdata(&priv->wdd, priv); 90 watchdog_set_drvdata(&priv->wdd, priv);
91 91
92 priv->wdd.parent = &pdev->dev; 92 priv->wdd.parent = dev;
93 priv->wdd.info = &tqmx86_wdt_info; 93 priv->wdd.info = &tqmx86_wdt_info;
94 priv->wdd.ops = &tqmx86_wdt_ops; 94 priv->wdd.ops = &tqmx86_wdt_ops;
95 priv->wdd.min_timeout = 1; 95 priv->wdd.min_timeout = 1;
@@ -97,16 +97,16 @@ static int tqmx86_wdt_probe(struct platform_device *pdev)
97 priv->wdd.max_hw_heartbeat_ms = 4096*1000; 97 priv->wdd.max_hw_heartbeat_ms = 4096*1000;
98 priv->wdd.timeout = WDT_TIMEOUT; 98 priv->wdd.timeout = WDT_TIMEOUT;
99 99
100 watchdog_init_timeout(&priv->wdd, timeout, &pdev->dev); 100 watchdog_init_timeout(&priv->wdd, timeout, dev);
101 watchdog_set_nowayout(&priv->wdd, WATCHDOG_NOWAYOUT); 101 watchdog_set_nowayout(&priv->wdd, WATCHDOG_NOWAYOUT);
102 102
103 tqmx86_wdt_set_timeout(&priv->wdd, priv->wdd.timeout); 103 tqmx86_wdt_set_timeout(&priv->wdd, priv->wdd.timeout);
104 104
105 err = devm_watchdog_register_device(&pdev->dev, &priv->wdd); 105 err = devm_watchdog_register_device(dev, &priv->wdd);
106 if (err) 106 if (err)
107 return err; 107 return err;
108 108
109 dev_info(&pdev->dev, "TQMx86 watchdog\n"); 109 dev_info(dev, "TQMx86 watchdog\n");
110 110
111 return 0; 111 return 0;
112} 112}
diff --git a/drivers/watchdog/ts4800_wdt.c b/drivers/watchdog/ts4800_wdt.c
index 89843b16b04a..9dc6d7f45806 100644
--- a/drivers/watchdog/ts4800_wdt.c
+++ b/drivers/watchdog/ts4800_wdt.c
@@ -108,7 +108,8 @@ static const struct watchdog_info ts4800_wdt_info = {
108 108
109static int ts4800_wdt_probe(struct platform_device *pdev) 109static int ts4800_wdt_probe(struct platform_device *pdev)
110{ 110{
111 struct device_node *np = pdev->dev.of_node; 111 struct device *dev = &pdev->dev;
112 struct device_node *np = dev->of_node;
112 struct device_node *syscon_np; 113 struct device_node *syscon_np;
113 struct watchdog_device *wdd; 114 struct watchdog_device *wdd;
114 struct ts4800_wdt *wdt; 115 struct ts4800_wdt *wdt;
@@ -117,18 +118,18 @@ static int ts4800_wdt_probe(struct platform_device *pdev)
117 118
118 syscon_np = of_parse_phandle(np, "syscon", 0); 119 syscon_np = of_parse_phandle(np, "syscon", 0);
119 if (!syscon_np) { 120 if (!syscon_np) {
120 dev_err(&pdev->dev, "no syscon property\n"); 121 dev_err(dev, "no syscon property\n");
121 return -ENODEV; 122 return -ENODEV;
122 } 123 }
123 124
124 ret = of_property_read_u32_index(np, "syscon", 1, &reg); 125 ret = of_property_read_u32_index(np, "syscon", 1, &reg);
125 if (ret < 0) { 126 if (ret < 0) {
126 dev_err(&pdev->dev, "no offset in syscon\n"); 127 dev_err(dev, "no offset in syscon\n");
127 return ret; 128 return ret;
128 } 129 }
129 130
130 /* allocate memory for watchdog struct */ 131 /* allocate memory for watchdog struct */
131 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 132 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
132 if (!wdt) 133 if (!wdt)
133 return -ENOMEM; 134 return -ENOMEM;
134 135
@@ -137,13 +138,13 @@ static int ts4800_wdt_probe(struct platform_device *pdev)
137 wdt->regmap = syscon_node_to_regmap(syscon_np); 138 wdt->regmap = syscon_node_to_regmap(syscon_np);
138 of_node_put(syscon_np); 139 of_node_put(syscon_np);
139 if (IS_ERR(wdt->regmap)) { 140 if (IS_ERR(wdt->regmap)) {
140 dev_err(&pdev->dev, "cannot get parent's regmap\n"); 141 dev_err(dev, "cannot get parent's regmap\n");
141 return PTR_ERR(wdt->regmap); 142 return PTR_ERR(wdt->regmap);
142 } 143 }
143 144
144 /* Initialize struct watchdog_device */ 145 /* Initialize struct watchdog_device */
145 wdd = &wdt->wdd; 146 wdd = &wdt->wdd;
146 wdd->parent = &pdev->dev; 147 wdd->parent = dev;
147 wdd->info = &ts4800_wdt_info; 148 wdd->info = &ts4800_wdt_info;
148 wdd->ops = &ts4800_wdt_ops; 149 wdd->ops = &ts4800_wdt_ops;
149 wdd->min_timeout = ts4800_wdt_map[0].timeout; 150 wdd->min_timeout = ts4800_wdt_map[0].timeout;
@@ -151,7 +152,7 @@ static int ts4800_wdt_probe(struct platform_device *pdev)
151 152
152 watchdog_set_drvdata(wdd, wdt); 153 watchdog_set_drvdata(wdd, wdt);
153 watchdog_set_nowayout(wdd, nowayout); 154 watchdog_set_nowayout(wdd, nowayout);
154 watchdog_init_timeout(wdd, 0, &pdev->dev); 155 watchdog_init_timeout(wdd, 0, dev);
155 156
156 /* 157 /*
157 * As this watchdog supports only a few values, ts4800_wdt_set_timeout 158 * As this watchdog supports only a few values, ts4800_wdt_set_timeout
@@ -169,31 +170,20 @@ static int ts4800_wdt_probe(struct platform_device *pdev)
169 */ 170 */
170 ts4800_wdt_stop(wdd); 171 ts4800_wdt_stop(wdd);
171 172
172 ret = watchdog_register_device(wdd); 173 ret = devm_watchdog_register_device(dev, wdd);
173 if (ret) { 174 if (ret) {
174 dev_err(&pdev->dev, 175 dev_err(dev, "failed to register watchdog device\n");
175 "failed to register watchdog device\n");
176 return ret; 176 return ret;
177 } 177 }
178 178
179 platform_set_drvdata(pdev, wdt); 179 platform_set_drvdata(pdev, wdt);
180 180
181 dev_info(&pdev->dev, 181 dev_info(dev, "initialized (timeout = %d sec, nowayout = %d)\n",
182 "initialized (timeout = %d sec, nowayout = %d)\n",
183 wdd->timeout, nowayout); 182 wdd->timeout, nowayout);
184 183
185 return 0; 184 return 0;
186} 185}
187 186
188static int ts4800_wdt_remove(struct platform_device *pdev)
189{
190 struct ts4800_wdt *wdt = platform_get_drvdata(pdev);
191
192 watchdog_unregister_device(&wdt->wdd);
193
194 return 0;
195}
196
197static const struct of_device_id ts4800_wdt_of_match[] = { 187static const struct of_device_id ts4800_wdt_of_match[] = {
198 { .compatible = "technologic,ts4800-wdt", }, 188 { .compatible = "technologic,ts4800-wdt", },
199 { }, 189 { },
@@ -202,7 +192,6 @@ MODULE_DEVICE_TABLE(of, ts4800_wdt_of_match);
202 192
203static struct platform_driver ts4800_wdt_driver = { 193static struct platform_driver ts4800_wdt_driver = {
204 .probe = ts4800_wdt_probe, 194 .probe = ts4800_wdt_probe,
205 .remove = ts4800_wdt_remove,
206 .driver = { 195 .driver = {
207 .name = "ts4800_wdt", 196 .name = "ts4800_wdt",
208 .of_match_table = ts4800_wdt_of_match, 197 .of_match_table = ts4800_wdt_of_match,
diff --git a/drivers/watchdog/ts72xx_wdt.c b/drivers/watchdog/ts72xx_wdt.c
index 811e43c39ec4..bf918f5fa131 100644
--- a/drivers/watchdog/ts72xx_wdt.c
+++ b/drivers/watchdog/ts72xx_wdt.c
@@ -122,22 +122,20 @@ static const struct watchdog_ops ts72xx_wdt_ops = {
122 122
123static int ts72xx_wdt_probe(struct platform_device *pdev) 123static int ts72xx_wdt_probe(struct platform_device *pdev)
124{ 124{
125 struct device *dev = &pdev->dev;
125 struct ts72xx_wdt_priv *priv; 126 struct ts72xx_wdt_priv *priv;
126 struct watchdog_device *wdd; 127 struct watchdog_device *wdd;
127 struct resource *res;
128 int ret; 128 int ret;
129 129
130 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 130 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
131 if (!priv) 131 if (!priv)
132 return -ENOMEM; 132 return -ENOMEM;
133 133
134 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 134 priv->control_reg = devm_platform_ioremap_resource(pdev, 0);
135 priv->control_reg = devm_ioremap_resource(&pdev->dev, res);
136 if (IS_ERR(priv->control_reg)) 135 if (IS_ERR(priv->control_reg))
137 return PTR_ERR(priv->control_reg); 136 return PTR_ERR(priv->control_reg);
138 137
139 res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 138 priv->feed_reg = devm_platform_ioremap_resource(pdev, 1);
140 priv->feed_reg = devm_ioremap_resource(&pdev->dev, res);
141 if (IS_ERR(priv->feed_reg)) 139 if (IS_ERR(priv->feed_reg))
142 return PTR_ERR(priv->feed_reg); 140 return PTR_ERR(priv->feed_reg);
143 141
@@ -146,20 +144,20 @@ static int ts72xx_wdt_probe(struct platform_device *pdev)
146 wdd->ops = &ts72xx_wdt_ops; 144 wdd->ops = &ts72xx_wdt_ops;
147 wdd->min_timeout = 1; 145 wdd->min_timeout = 1;
148 wdd->max_hw_heartbeat_ms = 8000; 146 wdd->max_hw_heartbeat_ms = 8000;
149 wdd->parent = &pdev->dev; 147 wdd->parent = dev;
150 148
151 watchdog_set_nowayout(wdd, nowayout); 149 watchdog_set_nowayout(wdd, nowayout);
152 150
153 wdd->timeout = TS72XX_WDT_DEFAULT_TIMEOUT; 151 wdd->timeout = TS72XX_WDT_DEFAULT_TIMEOUT;
154 watchdog_init_timeout(wdd, timeout, &pdev->dev); 152 watchdog_init_timeout(wdd, timeout, dev);
155 153
156 watchdog_set_drvdata(wdd, priv); 154 watchdog_set_drvdata(wdd, priv);
157 155
158 ret = devm_watchdog_register_device(&pdev->dev, wdd); 156 ret = devm_watchdog_register_device(dev, wdd);
159 if (ret) 157 if (ret)
160 return ret; 158 return ret;
161 159
162 dev_info(&pdev->dev, "TS-72xx Watchdog driver\n"); 160 dev_info(dev, "TS-72xx Watchdog driver\n");
163 161
164 return 0; 162 return 0;
165} 163}
diff --git a/drivers/watchdog/twl4030_wdt.c b/drivers/watchdog/twl4030_wdt.c
index 569fe85e52da..74c5737cd934 100644
--- a/drivers/watchdog/twl4030_wdt.c
+++ b/drivers/watchdog/twl4030_wdt.c
@@ -70,10 +70,10 @@ static const struct watchdog_ops twl4030_wdt_ops = {
70 70
71static int twl4030_wdt_probe(struct platform_device *pdev) 71static int twl4030_wdt_probe(struct platform_device *pdev)
72{ 72{
73 int ret = 0; 73 struct device *dev = &pdev->dev;
74 struct watchdog_device *wdt; 74 struct watchdog_device *wdt;
75 75
76 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); 76 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
77 if (!wdt) 77 if (!wdt)
78 return -ENOMEM; 78 return -ENOMEM;
79 79
@@ -83,27 +83,14 @@ static int twl4030_wdt_probe(struct platform_device *pdev)
83 wdt->timeout = 30; 83 wdt->timeout = 30;
84 wdt->min_timeout = 1; 84 wdt->min_timeout = 1;
85 wdt->max_timeout = 30; 85 wdt->max_timeout = 30;
86 wdt->parent = &pdev->dev; 86 wdt->parent = dev;
87 87
88 watchdog_set_nowayout(wdt, nowayout); 88 watchdog_set_nowayout(wdt, nowayout);
89 platform_set_drvdata(pdev, wdt); 89 platform_set_drvdata(pdev, wdt);
90 90
91 twl4030_wdt_stop(wdt); 91 twl4030_wdt_stop(wdt);
92 92
93 ret = watchdog_register_device(wdt); 93 return devm_watchdog_register_device(dev, wdt);
94 if (ret)
95 return ret;
96
97 return 0;
98}
99
100static int twl4030_wdt_remove(struct platform_device *pdev)
101{
102 struct watchdog_device *wdt = platform_get_drvdata(pdev);
103
104 watchdog_unregister_device(wdt);
105
106 return 0;
107} 94}
108 95
109#ifdef CONFIG_PM 96#ifdef CONFIG_PM
@@ -137,7 +124,6 @@ MODULE_DEVICE_TABLE(of, twl_wdt_of_match);
137 124
138static struct platform_driver twl4030_wdt_driver = { 125static struct platform_driver twl4030_wdt_driver = {
139 .probe = twl4030_wdt_probe, 126 .probe = twl4030_wdt_probe,
140 .remove = twl4030_wdt_remove,
141 .suspend = twl4030_wdt_suspend, 127 .suspend = twl4030_wdt_suspend,
142 .resume = twl4030_wdt_resume, 128 .resume = twl4030_wdt_resume,
143 .driver = { 129 .driver = {
diff --git a/drivers/watchdog/txx9wdt.c b/drivers/watchdog/txx9wdt.c
index 6f7a9deb27d0..fcb4da5b1f4c 100644
--- a/drivers/watchdog/txx9wdt.c
+++ b/drivers/watchdog/txx9wdt.c
@@ -103,7 +103,6 @@ static struct watchdog_device txx9wdt = {
103 103
104static int __init txx9wdt_probe(struct platform_device *dev) 104static int __init txx9wdt_probe(struct platform_device *dev)
105{ 105{
106 struct resource *res;
107 int ret; 106 int ret;
108 107
109 txx9_imclk = clk_get(NULL, "imbus_clk"); 108 txx9_imclk = clk_get(NULL, "imbus_clk");
@@ -119,8 +118,7 @@ static int __init txx9wdt_probe(struct platform_device *dev)
119 goto exit; 118 goto exit;
120 } 119 }
121 120
122 res = platform_get_resource(dev, IORESOURCE_MEM, 0); 121 txx9wdt_reg = devm_platform_ioremap_resource(dev, 0);
123 txx9wdt_reg = devm_ioremap_resource(&dev->dev, res);
124 if (IS_ERR(txx9wdt_reg)) { 122 if (IS_ERR(txx9wdt_reg)) {
125 ret = PTR_ERR(txx9wdt_reg); 123 ret = PTR_ERR(txx9wdt_reg);
126 goto exit; 124 goto exit;
diff --git a/drivers/watchdog/uniphier_wdt.c b/drivers/watchdog/uniphier_wdt.c
index e20a7a459d69..8e9242c23022 100644
--- a/drivers/watchdog/uniphier_wdt.c
+++ b/drivers/watchdog/uniphier_wdt.c
@@ -191,8 +191,6 @@ static int uniphier_wdt_probe(struct platform_device *pdev)
191 if (!wdev) 191 if (!wdev)
192 return -ENOMEM; 192 return -ENOMEM;
193 193
194 platform_set_drvdata(pdev, wdev);
195
196 parent = of_get_parent(dev->of_node); /* parent should be syscon node */ 194 parent = of_get_parent(dev->of_node); /* parent should be syscon node */
197 regmap = syscon_node_to_regmap(parent); 195 regmap = syscon_node_to_regmap(parent);
198 of_node_put(parent); 196 of_node_put(parent);
diff --git a/drivers/watchdog/ux500_wdt.c b/drivers/watchdog/ux500_wdt.c
index 37c084353cce..9fa7f95f7554 100644
--- a/drivers/watchdog/ux500_wdt.c
+++ b/drivers/watchdog/ux500_wdt.c
@@ -86,8 +86,9 @@ static struct watchdog_device ux500_wdt = {
86 86
87static int ux500_wdt_probe(struct platform_device *pdev) 87static int ux500_wdt_probe(struct platform_device *pdev)
88{ 88{
89 struct device *dev = &pdev->dev;
89 int ret; 90 int ret;
90 struct ux500_wdt_data *pdata = dev_get_platdata(&pdev->dev); 91 struct ux500_wdt_data *pdata = dev_get_platdata(dev);
91 92
92 if (pdata) { 93 if (pdata) {
93 if (pdata->timeout > 0) 94 if (pdata->timeout > 0)
@@ -96,7 +97,7 @@ static int ux500_wdt_probe(struct platform_device *pdev)
96 ux500_wdt.max_timeout = WATCHDOG_MAX28; 97 ux500_wdt.max_timeout = WATCHDOG_MAX28;
97 } 98 }
98 99
99 ux500_wdt.parent = &pdev->dev; 100 ux500_wdt.parent = dev;
100 watchdog_set_nowayout(&ux500_wdt, nowayout); 101 watchdog_set_nowayout(&ux500_wdt, nowayout);
101 102
102 /* disable auto off on sleep */ 103 /* disable auto off on sleep */
@@ -105,18 +106,11 @@ static int ux500_wdt_probe(struct platform_device *pdev)
105 /* set HW initial value */ 106 /* set HW initial value */
106 prcmu_load_a9wdog(PRCMU_WDOG_ALL, timeout * 1000); 107 prcmu_load_a9wdog(PRCMU_WDOG_ALL, timeout * 1000);
107 108
108 ret = watchdog_register_device(&ux500_wdt); 109 ret = devm_watchdog_register_device(dev, &ux500_wdt);
109 if (ret) 110 if (ret)
110 return ret; 111 return ret;
111 112
112 dev_info(&pdev->dev, "initialized\n"); 113 dev_info(dev, "initialized\n");
113
114 return 0;
115}
116
117static int ux500_wdt_remove(struct platform_device *dev)
118{
119 watchdog_unregister_device(&ux500_wdt);
120 114
121 return 0; 115 return 0;
122} 116}
@@ -153,7 +147,6 @@ static int ux500_wdt_resume(struct platform_device *pdev)
153 147
154static struct platform_driver ux500_wdt_driver = { 148static struct platform_driver ux500_wdt_driver = {
155 .probe = ux500_wdt_probe, 149 .probe = ux500_wdt_probe,
156 .remove = ux500_wdt_remove,
157 .suspend = ux500_wdt_suspend, 150 .suspend = ux500_wdt_suspend,
158 .resume = ux500_wdt_resume, 151 .resume = ux500_wdt_resume,
159 .driver = { 152 .driver = {
diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c
index eb8fa25f8eb2..62be9e52a4de 100644
--- a/drivers/watchdog/watchdog_core.c
+++ b/drivers/watchdog/watchdog_core.c
@@ -105,34 +105,48 @@ static void watchdog_check_min_max_timeout(struct watchdog_device *wdd)
105 * timeout module parameter (if it is valid value) or the timeout-sec property 105 * timeout module parameter (if it is valid value) or the timeout-sec property
106 * (only if it is a valid value and the timeout_parm is out of bounds). 106 * (only if it is a valid value and the timeout_parm is out of bounds).
107 * If none of them are valid then we keep the old value (which should normally 107 * If none of them are valid then we keep the old value (which should normally
108 * be the default timeout value). 108 * be the default timeout value). Note that for the module parameter, '0' means
109 * 'use default' while it is an invalid value for the timeout-sec property.
110 * It should simply be dropped if you want to use the default value then.
109 * 111 *
110 * A zero is returned on success and -EINVAL for failure. 112 * A zero is returned on success or -EINVAL if all provided values are out of
113 * bounds.
111 */ 114 */
112int watchdog_init_timeout(struct watchdog_device *wdd, 115int watchdog_init_timeout(struct watchdog_device *wdd,
113 unsigned int timeout_parm, struct device *dev) 116 unsigned int timeout_parm, struct device *dev)
114{ 117{
118 const char *dev_str = wdd->parent ? dev_name(wdd->parent) :
119 (const char *)wdd->info->identity;
115 unsigned int t = 0; 120 unsigned int t = 0;
116 int ret = 0; 121 int ret = 0;
117 122
118 watchdog_check_min_max_timeout(wdd); 123 watchdog_check_min_max_timeout(wdd);
119 124
120 /* try to get the timeout module parameter first */ 125 /* check the driver supplied value (likely a module parameter) first */
121 if (!watchdog_timeout_invalid(wdd, timeout_parm) && timeout_parm) { 126 if (timeout_parm) {
122 wdd->timeout = timeout_parm; 127 if (!watchdog_timeout_invalid(wdd, timeout_parm)) {
123 return ret; 128 wdd->timeout = timeout_parm;
124 } 129 return 0;
125 if (timeout_parm) 130 }
131 pr_err("%s: driver supplied timeout (%u) out of range\n",
132 dev_str, timeout_parm);
126 ret = -EINVAL; 133 ret = -EINVAL;
134 }
127 135
128 /* try to get the timeout_sec property */ 136 /* try to get the timeout_sec property */
129 if (dev == NULL || dev->of_node == NULL) 137 if (dev && dev->of_node &&
130 return ret; 138 of_property_read_u32(dev->of_node, "timeout-sec", &t) == 0) {
131 of_property_read_u32(dev->of_node, "timeout-sec", &t); 139 if (t && !watchdog_timeout_invalid(wdd, t)) {
132 if (!watchdog_timeout_invalid(wdd, t) && t) 140 wdd->timeout = t;
133 wdd->timeout = t; 141 return 0;
134 else 142 }
143 pr_err("%s: DT supplied timeout (%u) out of range\n", dev_str, t);
135 ret = -EINVAL; 144 ret = -EINVAL;
145 }
146
147 if (ret < 0 && wdd->timeout)
148 pr_warn("%s: falling back to default timeout (%u)\n", dev_str,
149 wdd->timeout);
136 150
137 return ret; 151 return ret;
138} 152}
diff --git a/drivers/watchdog/wdat_wdt.c b/drivers/watchdog/wdat_wdt.c
index 56ad19608a9b..430ee4e9b185 100644
--- a/drivers/watchdog/wdat_wdt.c
+++ b/drivers/watchdog/wdat_wdt.c
@@ -287,7 +287,7 @@ static unsigned int wdat_wdt_get_timeleft(struct watchdog_device *wdd)
287 struct wdat_wdt *wdat = to_wdat_wdt(wdd); 287 struct wdat_wdt *wdat = to_wdat_wdt(wdd);
288 u32 periods = 0; 288 u32 periods = 0;
289 289
290 wdat_wdt_run_action(wdat, ACPI_WDAT_GET_COUNTDOWN, 0, &periods); 290 wdat_wdt_run_action(wdat, ACPI_WDAT_GET_CURRENT_COUNTDOWN, 0, &periods);
291 return periods * wdat->period / 1000; 291 return periods * wdat->period / 1000;
292} 292}
293 293
@@ -308,6 +308,7 @@ static const struct watchdog_ops wdat_wdt_ops = {
308 308
309static int wdat_wdt_probe(struct platform_device *pdev) 309static int wdat_wdt_probe(struct platform_device *pdev)
310{ 310{
311 struct device *dev = &pdev->dev;
311 const struct acpi_wdat_entry *entries; 312 const struct acpi_wdat_entry *entries;
312 const struct acpi_table_wdat *tbl; 313 const struct acpi_table_wdat *tbl;
313 struct wdat_wdt *wdat; 314 struct wdat_wdt *wdat;
@@ -321,11 +322,11 @@ static int wdat_wdt_probe(struct platform_device *pdev)
321 if (ACPI_FAILURE(status)) 322 if (ACPI_FAILURE(status))
322 return -ENODEV; 323 return -ENODEV;
323 324
324 wdat = devm_kzalloc(&pdev->dev, sizeof(*wdat), GFP_KERNEL); 325 wdat = devm_kzalloc(dev, sizeof(*wdat), GFP_KERNEL);
325 if (!wdat) 326 if (!wdat)
326 return -ENOMEM; 327 return -ENOMEM;
327 328
328 regs = devm_kcalloc(&pdev->dev, pdev->num_resources, sizeof(*regs), 329 regs = devm_kcalloc(dev, pdev->num_resources, sizeof(*regs),
329 GFP_KERNEL); 330 GFP_KERNEL);
330 if (!regs) 331 if (!regs)
331 return -ENOMEM; 332 return -ENOMEM;
@@ -350,15 +351,15 @@ static int wdat_wdt_probe(struct platform_device *pdev)
350 351
351 res = &pdev->resource[i]; 352 res = &pdev->resource[i];
352 if (resource_type(res) == IORESOURCE_MEM) { 353 if (resource_type(res) == IORESOURCE_MEM) {
353 reg = devm_ioremap_resource(&pdev->dev, res); 354 reg = devm_ioremap_resource(dev, res);
354 if (IS_ERR(reg)) 355 if (IS_ERR(reg))
355 return PTR_ERR(reg); 356 return PTR_ERR(reg);
356 } else if (resource_type(res) == IORESOURCE_IO) { 357 } else if (resource_type(res) == IORESOURCE_IO) {
357 reg = devm_ioport_map(&pdev->dev, res->start, 1); 358 reg = devm_ioport_map(dev, res->start, 1);
358 if (!reg) 359 if (!reg)
359 return -ENOMEM; 360 return -ENOMEM;
360 } else { 361 } else {
361 dev_err(&pdev->dev, "Unsupported resource\n"); 362 dev_err(dev, "Unsupported resource\n");
362 return -EINVAL; 363 return -EINVAL;
363 } 364 }
364 365
@@ -376,12 +377,11 @@ static int wdat_wdt_probe(struct platform_device *pdev)
376 377
377 action = entries[i].action; 378 action = entries[i].action;
378 if (action >= MAX_WDAT_ACTIONS) { 379 if (action >= MAX_WDAT_ACTIONS) {
379 dev_dbg(&pdev->dev, "Skipping unknown action: %u\n", 380 dev_dbg(dev, "Skipping unknown action: %u\n", action);
380 action);
381 continue; 381 continue;
382 } 382 }
383 383
384 instr = devm_kzalloc(&pdev->dev, sizeof(*instr), GFP_KERNEL); 384 instr = devm_kzalloc(dev, sizeof(*instr), GFP_KERNEL);
385 if (!instr) 385 if (!instr)
386 return -ENOMEM; 386 return -ENOMEM;
387 387
@@ -398,7 +398,7 @@ static int wdat_wdt_probe(struct platform_device *pdev)
398 } else if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { 398 } else if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
399 r.flags = IORESOURCE_IO; 399 r.flags = IORESOURCE_IO;
400 } else { 400 } else {
401 dev_dbg(&pdev->dev, "Unsupported address space: %d\n", 401 dev_dbg(dev, "Unsupported address space: %d\n",
402 gas->space_id); 402 gas->space_id);
403 continue; 403 continue;
404 } 404 }
@@ -413,14 +413,15 @@ static int wdat_wdt_probe(struct platform_device *pdev)
413 } 413 }
414 414
415 if (!instr->reg) { 415 if (!instr->reg) {
416 dev_err(&pdev->dev, "I/O resource not found\n"); 416 dev_err(dev, "I/O resource not found\n");
417 return -EINVAL; 417 return -EINVAL;
418 } 418 }
419 419
420 instructions = wdat->instructions[action]; 420 instructions = wdat->instructions[action];
421 if (!instructions) { 421 if (!instructions) {
422 instructions = devm_kzalloc(&pdev->dev, 422 instructions = devm_kzalloc(dev,
423 sizeof(*instructions), GFP_KERNEL); 423 sizeof(*instructions),
424 GFP_KERNEL);
424 if (!instructions) 425 if (!instructions)
425 return -ENOMEM; 426 return -ENOMEM;
426 427
@@ -441,7 +442,7 @@ static int wdat_wdt_probe(struct platform_device *pdev)
441 platform_set_drvdata(pdev, wdat); 442 platform_set_drvdata(pdev, wdat);
442 443
443 watchdog_set_nowayout(&wdat->wdd, nowayout); 444 watchdog_set_nowayout(&wdat->wdd, nowayout);
444 return devm_watchdog_register_device(&pdev->dev, &wdat->wdd); 445 return devm_watchdog_register_device(dev, &wdat->wdd);
445} 446}
446 447
447#ifdef CONFIG_PM_SLEEP 448#ifdef CONFIG_PM_SLEEP
diff --git a/drivers/watchdog/wm831x_wdt.c b/drivers/watchdog/wm831x_wdt.c
index 116c2f47b463..9b6565a3fab4 100644
--- a/drivers/watchdog/wm831x_wdt.c
+++ b/drivers/watchdog/wm831x_wdt.c
@@ -180,8 +180,9 @@ static const struct watchdog_ops wm831x_wdt_ops = {
180 180
181static int wm831x_wdt_probe(struct platform_device *pdev) 181static int wm831x_wdt_probe(struct platform_device *pdev)
182{ 182{
183 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); 183 struct device *dev = &pdev->dev;
184 struct wm831x_pdata *chip_pdata = dev_get_platdata(pdev->dev.parent); 184 struct wm831x *wm831x = dev_get_drvdata(dev->parent);
185 struct wm831x_pdata *chip_pdata = dev_get_platdata(dev->parent);
185 struct wm831x_watchdog_pdata *pdata; 186 struct wm831x_watchdog_pdata *pdata;
186 struct wm831x_wdt_drvdata *driver_data; 187 struct wm831x_wdt_drvdata *driver_data;
187 struct watchdog_device *wm831x_wdt; 188 struct watchdog_device *wm831x_wdt;
@@ -198,8 +199,7 @@ static int wm831x_wdt_probe(struct platform_device *pdev)
198 if (reg & WM831X_WDOG_DEBUG) 199 if (reg & WM831X_WDOG_DEBUG)
199 dev_warn(wm831x->dev, "Watchdog is paused\n"); 200 dev_warn(wm831x->dev, "Watchdog is paused\n");
200 201
201 driver_data = devm_kzalloc(&pdev->dev, sizeof(*driver_data), 202 driver_data = devm_kzalloc(dev, sizeof(*driver_data), GFP_KERNEL);
202 GFP_KERNEL);
203 if (!driver_data) 203 if (!driver_data)
204 return -ENOMEM; 204 return -ENOMEM;
205 205
@@ -210,7 +210,7 @@ static int wm831x_wdt_probe(struct platform_device *pdev)
210 210
211 wm831x_wdt->info = &wm831x_wdt_info; 211 wm831x_wdt->info = &wm831x_wdt_info;
212 wm831x_wdt->ops = &wm831x_wdt_ops; 212 wm831x_wdt->ops = &wm831x_wdt_ops;
213 wm831x_wdt->parent = &pdev->dev; 213 wm831x_wdt->parent = dev;
214 watchdog_set_nowayout(wm831x_wdt, nowayout); 214 watchdog_set_nowayout(wm831x_wdt, nowayout);
215 watchdog_set_drvdata(wm831x_wdt, driver_data); 215 watchdog_set_drvdata(wm831x_wdt, driver_data);
216 216
@@ -240,10 +240,9 @@ static int wm831x_wdt_probe(struct platform_device *pdev)
240 reg |= pdata->software << WM831X_WDOG_RST_SRC_SHIFT; 240 reg |= pdata->software << WM831X_WDOG_RST_SRC_SHIFT;
241 241
242 if (pdata->update_gpio) { 242 if (pdata->update_gpio) {
243 ret = devm_gpio_request_one(&pdev->dev, 243 ret = devm_gpio_request_one(dev, pdata->update_gpio,
244 pdata->update_gpio, 244 GPIOF_OUT_INIT_LOW,
245 GPIOF_OUT_INIT_LOW, 245 "Watchdog update");
246 "Watchdog update");
247 if (ret < 0) { 246 if (ret < 0) {
248 dev_err(wm831x->dev, 247 dev_err(wm831x->dev,
249 "Failed to request update GPIO: %d\n", 248 "Failed to request update GPIO: %d\n",
@@ -268,7 +267,7 @@ static int wm831x_wdt_probe(struct platform_device *pdev)
268 } 267 }
269 } 268 }
270 269
271 ret = devm_watchdog_register_device(&pdev->dev, &driver_data->wdt); 270 ret = devm_watchdog_register_device(dev, &driver_data->wdt);
272 if (ret != 0) { 271 if (ret != 0) {
273 dev_err(wm831x->dev, "watchdog_register_device() failed: %d\n", 272 dev_err(wm831x->dev, "watchdog_register_device() failed: %d\n",
274 ret); 273 ret);
diff --git a/drivers/watchdog/xen_wdt.c b/drivers/watchdog/xen_wdt.c
index f1c016d015b3..25a1af5e1787 100644
--- a/drivers/watchdog/xen_wdt.c
+++ b/drivers/watchdog/xen_wdt.c
@@ -122,35 +122,33 @@ static struct watchdog_device xen_wdt_dev = {
122 122
123static int xen_wdt_probe(struct platform_device *pdev) 123static int xen_wdt_probe(struct platform_device *pdev)
124{ 124{
125 struct device *dev = &pdev->dev;
125 struct sched_watchdog wd = { .id = ~0 }; 126 struct sched_watchdog wd = { .id = ~0 };
126 int ret = HYPERVISOR_sched_op(SCHEDOP_watchdog, &wd); 127 int ret = HYPERVISOR_sched_op(SCHEDOP_watchdog, &wd);
127 128
128 if (ret == -ENOSYS) { 129 if (ret == -ENOSYS) {
129 dev_err(&pdev->dev, "watchdog not supported by hypervisor\n"); 130 dev_err(dev, "watchdog not supported by hypervisor\n");
130 return -ENODEV; 131 return -ENODEV;
131 } 132 }
132 133
133 if (ret != -EINVAL) { 134 if (ret != -EINVAL) {
134 dev_err(&pdev->dev, "unexpected hypervisor error (%d)\n", ret); 135 dev_err(dev, "unexpected hypervisor error (%d)\n", ret);
135 return -ENODEV; 136 return -ENODEV;
136 } 137 }
137 138
138 if (watchdog_init_timeout(&xen_wdt_dev, timeout, NULL)) 139 watchdog_init_timeout(&xen_wdt_dev, timeout, NULL);
139 dev_info(&pdev->dev, "timeout value invalid, using %d\n",
140 xen_wdt_dev.timeout);
141 watchdog_set_nowayout(&xen_wdt_dev, nowayout); 140 watchdog_set_nowayout(&xen_wdt_dev, nowayout);
142 watchdog_stop_on_reboot(&xen_wdt_dev); 141 watchdog_stop_on_reboot(&xen_wdt_dev);
143 watchdog_stop_on_unregister(&xen_wdt_dev); 142 watchdog_stop_on_unregister(&xen_wdt_dev);
144 143
145 ret = devm_watchdog_register_device(&pdev->dev, &xen_wdt_dev); 144 ret = devm_watchdog_register_device(dev, &xen_wdt_dev);
146 if (ret) { 145 if (ret) {
147 dev_err(&pdev->dev, "cannot register watchdog device (%d)\n", 146 dev_err(dev, "cannot register watchdog device (%d)\n", ret);
148 ret);
149 return ret; 147 return ret;
150 } 148 }
151 149
152 dev_info(&pdev->dev, "initialized (timeout=%ds, nowayout=%d)\n", 150 dev_info(dev, "initialized (timeout=%ds, nowayout=%d)\n",
153 xen_wdt_dev.timeout, nowayout); 151 xen_wdt_dev.timeout, nowayout);
154 152
155 return 0; 153 return 0;
156} 154}
diff --git a/drivers/watchdog/ziirave_wdt.c b/drivers/watchdog/ziirave_wdt.c
index d3594aa3a374..43e6b575c32c 100644
--- a/drivers/watchdog/ziirave_wdt.c
+++ b/drivers/watchdog/ziirave_wdt.c
@@ -658,11 +658,7 @@ static int ziirave_wdt_probe(struct i2c_client *client,
658 w_priv->wdd.parent = &client->dev; 658 w_priv->wdd.parent = &client->dev;
659 w_priv->wdd.groups = ziirave_wdt_groups; 659 w_priv->wdd.groups = ziirave_wdt_groups;
660 660
661 ret = watchdog_init_timeout(&w_priv->wdd, wdt_timeout, &client->dev); 661 watchdog_init_timeout(&w_priv->wdd, wdt_timeout, &client->dev);
662 if (ret) {
663 dev_info(&client->dev,
664 "Unable to select timeout value, using default\n");
665 }
666 662
667 /* 663 /*
668 * The default value set in the watchdog should be perfectly valid, so 664 * The default value set in the watchdog should be perfectly valid, so
diff --git a/drivers/watchdog/zx2967_wdt.c b/drivers/watchdog/zx2967_wdt.c
index 9261f7c77f6d..c8549bf07cc9 100644
--- a/drivers/watchdog/zx2967_wdt.c
+++ b/drivers/watchdog/zx2967_wdt.c
@@ -188,11 +188,15 @@ static void zx2967_wdt_reset_sysctrl(struct device *dev)
188 of_node_put(out_args.np); 188 of_node_put(out_args.np);
189} 189}
190 190
191static void zx2967_clk_disable_unprepare(void *data)
192{
193 clk_disable_unprepare(data);
194}
195
191static int zx2967_wdt_probe(struct platform_device *pdev) 196static int zx2967_wdt_probe(struct platform_device *pdev)
192{ 197{
193 struct device *dev = &pdev->dev; 198 struct device *dev = &pdev->dev;
194 struct zx2967_wdt *wdt; 199 struct zx2967_wdt *wdt;
195 struct resource *base;
196 int ret; 200 int ret;
197 struct reset_control *rstc; 201 struct reset_control *rstc;
198 202
@@ -207,10 +211,9 @@ static int zx2967_wdt_probe(struct platform_device *pdev)
207 wdt->wdt_device.timeout = ZX2967_WDT_DEFAULT_TIMEOUT; 211 wdt->wdt_device.timeout = ZX2967_WDT_DEFAULT_TIMEOUT;
208 wdt->wdt_device.max_timeout = ZX2967_WDT_MAX_TIMEOUT; 212 wdt->wdt_device.max_timeout = ZX2967_WDT_MAX_TIMEOUT;
209 wdt->wdt_device.min_timeout = ZX2967_WDT_MIN_TIMEOUT; 213 wdt->wdt_device.min_timeout = ZX2967_WDT_MIN_TIMEOUT;
210 wdt->wdt_device.parent = &pdev->dev; 214 wdt->wdt_device.parent = dev;
211 215
212 base = platform_get_resource(pdev, IORESOURCE_MEM, 0); 216 wdt->reg_base = devm_platform_ioremap_resource(pdev, 0);
213 wdt->reg_base = devm_ioremap_resource(dev, base);
214 if (IS_ERR(wdt->reg_base)) 217 if (IS_ERR(wdt->reg_base))
215 return PTR_ERR(wdt->reg_base); 218 return PTR_ERR(wdt->reg_base);
216 219
@@ -227,13 +230,16 @@ static int zx2967_wdt_probe(struct platform_device *pdev)
227 dev_err(dev, "failed to enable clock\n"); 230 dev_err(dev, "failed to enable clock\n");
228 return ret; 231 return ret;
229 } 232 }
233 ret = devm_add_action_or_reset(dev, zx2967_clk_disable_unprepare,
234 wdt->clock);
235 if (ret)
236 return ret;
230 clk_set_rate(wdt->clock, ZX2967_WDT_CLK_FREQ); 237 clk_set_rate(wdt->clock, ZX2967_WDT_CLK_FREQ);
231 238
232 rstc = devm_reset_control_get_exclusive(dev, NULL); 239 rstc = devm_reset_control_get_exclusive(dev, NULL);
233 if (IS_ERR(rstc)) { 240 if (IS_ERR(rstc)) {
234 dev_err(dev, "failed to get rstc"); 241 dev_err(dev, "failed to get rstc");
235 ret = PTR_ERR(rstc); 242 return PTR_ERR(rstc);
236 goto err;
237 } 243 }
238 244
239 reset_control_assert(rstc); 245 reset_control_assert(rstc);
@@ -244,28 +250,14 @@ static int zx2967_wdt_probe(struct platform_device *pdev)
244 ZX2967_WDT_DEFAULT_TIMEOUT, dev); 250 ZX2967_WDT_DEFAULT_TIMEOUT, dev);
245 watchdog_set_nowayout(&wdt->wdt_device, WATCHDOG_NOWAYOUT); 251 watchdog_set_nowayout(&wdt->wdt_device, WATCHDOG_NOWAYOUT);
246 252
247 ret = watchdog_register_device(&wdt->wdt_device); 253 ret = devm_watchdog_register_device(dev, &wdt->wdt_device);
248 if (ret) 254 if (ret)
249 goto err; 255 return ret;
250 256
251 dev_info(dev, "watchdog enabled (timeout=%d sec, nowayout=%d)", 257 dev_info(dev, "watchdog enabled (timeout=%d sec, nowayout=%d)",
252 wdt->wdt_device.timeout, WATCHDOG_NOWAYOUT); 258 wdt->wdt_device.timeout, WATCHDOG_NOWAYOUT);
253 259
254 return 0; 260 return 0;
255
256err:
257 clk_disable_unprepare(wdt->clock);
258 return ret;
259}
260
261static int zx2967_wdt_remove(struct platform_device *pdev)
262{
263 struct zx2967_wdt *wdt = platform_get_drvdata(pdev);
264
265 watchdog_unregister_device(&wdt->wdt_device);
266 clk_disable_unprepare(wdt->clock);
267
268 return 0;
269} 261}
270 262
271static const struct of_device_id zx2967_wdt_match[] = { 263static const struct of_device_id zx2967_wdt_match[] = {
@@ -276,7 +268,6 @@ MODULE_DEVICE_TABLE(of, zx2967_wdt_match);
276 268
277static struct platform_driver zx2967_wdt_driver = { 269static struct platform_driver zx2967_wdt_driver = {
278 .probe = zx2967_wdt_probe, 270 .probe = zx2967_wdt_probe,
279 .remove = zx2967_wdt_remove,
280 .driver = { 271 .driver = {
281 .name = "zx2967-wdt", 272 .name = "zx2967-wdt",
282 .of_match_table = of_match_ptr(zx2967_wdt_match), 273 .of_match_table = of_match_ptr(zx2967_wdt_match),