hc
2024-05-14 bedbef8ad3e75a304af6361af235302bcc61d06b
kernel/drivers/watchdog/zx2967_wdt.c
....@@ -1,11 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * watchdog driver for ZTE's zx2967 family
34 *
45 * Copyright (C) 2017 ZTE Ltd.
56 *
67 * Author: Baoyou Xie <baoyou.xie@linaro.org>
7
- *
8
- * License terms: GNU General Public License (GPL) version 2
98 */
109
1110 #include <linux/clk.h>
....@@ -188,11 +187,15 @@
188187 of_node_put(out_args.np);
189188 }
190189
190
+static void zx2967_clk_disable_unprepare(void *data)
191
+{
192
+ clk_disable_unprepare(data);
193
+}
194
+
191195 static int zx2967_wdt_probe(struct platform_device *pdev)
192196 {
193197 struct device *dev = &pdev->dev;
194198 struct zx2967_wdt *wdt;
195
- struct resource *base;
196199 int ret;
197200 struct reset_control *rstc;
198201
....@@ -207,10 +210,9 @@
207210 wdt->wdt_device.timeout = ZX2967_WDT_DEFAULT_TIMEOUT;
208211 wdt->wdt_device.max_timeout = ZX2967_WDT_MAX_TIMEOUT;
209212 wdt->wdt_device.min_timeout = ZX2967_WDT_MIN_TIMEOUT;
210
- wdt->wdt_device.parent = &pdev->dev;
213
+ wdt->wdt_device.parent = dev;
211214
212
- base = platform_get_resource(pdev, IORESOURCE_MEM, 0);
213
- wdt->reg_base = devm_ioremap_resource(dev, base);
215
+ wdt->reg_base = devm_platform_ioremap_resource(pdev, 0);
214216 if (IS_ERR(wdt->reg_base))
215217 return PTR_ERR(wdt->reg_base);
216218
....@@ -227,13 +229,16 @@
227229 dev_err(dev, "failed to enable clock\n");
228230 return ret;
229231 }
232
+ ret = devm_add_action_or_reset(dev, zx2967_clk_disable_unprepare,
233
+ wdt->clock);
234
+ if (ret)
235
+ return ret;
230236 clk_set_rate(wdt->clock, ZX2967_WDT_CLK_FREQ);
231237
232238 rstc = devm_reset_control_get_exclusive(dev, NULL);
233239 if (IS_ERR(rstc)) {
234240 dev_err(dev, "failed to get rstc");
235
- ret = PTR_ERR(rstc);
236
- goto err;
241
+ return PTR_ERR(rstc);
237242 }
238243
239244 reset_control_assert(rstc);
....@@ -244,26 +249,12 @@
244249 ZX2967_WDT_DEFAULT_TIMEOUT, dev);
245250 watchdog_set_nowayout(&wdt->wdt_device, WATCHDOG_NOWAYOUT);
246251
247
- ret = watchdog_register_device(&wdt->wdt_device);
252
+ ret = devm_watchdog_register_device(dev, &wdt->wdt_device);
248253 if (ret)
249
- goto err;
254
+ return ret;
250255
251256 dev_info(dev, "watchdog enabled (timeout=%d sec, nowayout=%d)",
252257 wdt->wdt_device.timeout, WATCHDOG_NOWAYOUT);
253
-
254
- return 0;
255
-
256
-err:
257
- clk_disable_unprepare(wdt->clock);
258
- return ret;
259
-}
260
-
261
-static 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);
267258
268259 return 0;
269260 }
....@@ -276,7 +267,6 @@
276267
277268 static struct platform_driver zx2967_wdt_driver = {
278269 .probe = zx2967_wdt_probe,
279
- .remove = zx2967_wdt_remove,
280270 .driver = {
281271 .name = "zx2967-wdt",
282272 .of_match_table = of_match_ptr(zx2967_wdt_match),