hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/watchdog/imx2_wdt.c
....@@ -2,7 +2,7 @@
22 /*
33 * Watchdog driver for IMX2 and later processors
44 *
5
- * Copyright (C) 2010 Wolfram Sang, Pengutronix e.K. <w.sang@pengutronix.de>
5
+ * Copyright (C) 2010 Wolfram Sang, Pengutronix e.K. <kernel@pengutronix.de>
66 * Copyright (C) 2014 Freescale Semiconductor, Inc.
77 *
88 * some parts adapted by similar drivers from Darius Augulis and Vladimir
....@@ -71,7 +71,6 @@
7171 module_param(nowayout, bool, 0);
7272 MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
7373 __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
74
-
7574
7675 static unsigned timeout;
7776 module_param(timeout, uint, 0);
....@@ -245,34 +244,38 @@
245244 .max_register = 0x8,
246245 };
247246
247
+static void imx2_wdt_action(void *data)
248
+{
249
+ clk_disable_unprepare(data);
250
+}
251
+
248252 static int __init imx2_wdt_probe(struct platform_device *pdev)
249253 {
254
+ struct device *dev = &pdev->dev;
250255 struct imx2_wdt_device *wdev;
251256 struct watchdog_device *wdog;
252
- struct resource *res;
253257 void __iomem *base;
254258 int ret;
255259 u32 val;
256260
257
- wdev = devm_kzalloc(&pdev->dev, sizeof(*wdev), GFP_KERNEL);
261
+ wdev = devm_kzalloc(dev, sizeof(*wdev), GFP_KERNEL);
258262 if (!wdev)
259263 return -ENOMEM;
260264
261
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
262
- base = devm_ioremap_resource(&pdev->dev, res);
265
+ base = devm_platform_ioremap_resource(pdev, 0);
263266 if (IS_ERR(base))
264267 return PTR_ERR(base);
265268
266
- wdev->regmap = devm_regmap_init_mmio_clk(&pdev->dev, NULL, base,
269
+ wdev->regmap = devm_regmap_init_mmio_clk(dev, NULL, base,
267270 &imx2_wdt_regmap_config);
268271 if (IS_ERR(wdev->regmap)) {
269
- dev_err(&pdev->dev, "regmap init failed\n");
272
+ dev_err(dev, "regmap init failed\n");
270273 return PTR_ERR(wdev->regmap);
271274 }
272275
273
- wdev->clk = devm_clk_get(&pdev->dev, NULL);
276
+ wdev->clk = devm_clk_get(dev, NULL);
274277 if (IS_ERR(wdev->clk)) {
275
- dev_err(&pdev->dev, "can't get Watchdog clock\n");
278
+ dev_err(dev, "can't get Watchdog clock\n");
276279 return PTR_ERR(wdev->clk);
277280 }
278281
....@@ -282,28 +285,32 @@
282285 wdog->min_timeout = 1;
283286 wdog->timeout = IMX2_WDT_DEFAULT_TIME;
284287 wdog->max_hw_heartbeat_ms = IMX2_WDT_MAX_TIME * 1000;
285
- wdog->parent = &pdev->dev;
288
+ wdog->parent = dev;
286289
287290 ret = platform_get_irq(pdev, 0);
288291 if (ret > 0)
289
- if (!devm_request_irq(&pdev->dev, ret, imx2_wdt_isr, 0,
290
- dev_name(&pdev->dev), wdog))
292
+ if (!devm_request_irq(dev, ret, imx2_wdt_isr, 0,
293
+ dev_name(dev), wdog))
291294 wdog->info = &imx2_wdt_pretimeout_info;
292295
293296 ret = clk_prepare_enable(wdev->clk);
294297 if (ret)
295298 return ret;
296299
300
+ ret = devm_add_action_or_reset(dev, imx2_wdt_action, wdev->clk);
301
+ if (ret)
302
+ return ret;
303
+
297304 regmap_read(wdev->regmap, IMX2_WDT_WRSR, &val);
298305 wdog->bootstatus = val & IMX2_WDT_WRSR_TOUT ? WDIOF_CARDRESET : 0;
299306
300
- wdev->ext_reset = of_property_read_bool(pdev->dev.of_node,
307
+ wdev->ext_reset = of_property_read_bool(dev->of_node,
301308 "fsl,ext-reset-output");
302309 platform_set_drvdata(pdev, wdog);
303310 watchdog_set_drvdata(wdog, wdev);
304311 watchdog_set_nowayout(wdog, nowayout);
305312 watchdog_set_restart_priority(wdog, 128);
306
- watchdog_init_timeout(wdog, timeout, &pdev->dev);
313
+ watchdog_init_timeout(wdog, timeout, dev);
307314
308315 if (imx2_wdt_is_running(wdev)) {
309316 imx2_wdt_set_timeout(wdog, wdog->timeout);
....@@ -317,34 +324,7 @@
317324 */
318325 regmap_write(wdev->regmap, IMX2_WDT_WMCR, 0);
319326
320
- ret = watchdog_register_device(wdog);
321
- if (ret) {
322
- dev_err(&pdev->dev, "cannot register watchdog device\n");
323
- goto disable_clk;
324
- }
325
-
326
- dev_info(&pdev->dev, "timeout %d sec (nowayout=%d)\n",
327
- wdog->timeout, nowayout);
328
-
329
- return 0;
330
-
331
-disable_clk:
332
- clk_disable_unprepare(wdev->clk);
333
- return ret;
334
-}
335
-
336
-static int __exit imx2_wdt_remove(struct platform_device *pdev)
337
-{
338
- struct watchdog_device *wdog = platform_get_drvdata(pdev);
339
- struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog);
340
-
341
- watchdog_unregister_device(wdog);
342
-
343
- if (imx2_wdt_is_running(wdev)) {
344
- imx2_wdt_ping(wdog);
345
- dev_crit(&pdev->dev, "Device removed: Expect reboot!\n");
346
- }
347
- return 0;
327
+ return devm_watchdog_register_device(dev, wdog);
348328 }
349329
350330 static void imx2_wdt_shutdown(struct platform_device *pdev)
....@@ -363,9 +343,8 @@
363343 }
364344 }
365345
366
-#ifdef CONFIG_PM_SLEEP
367346 /* Disable watchdog if it is active or non-active but still running */
368
-static int imx2_wdt_suspend(struct device *dev)
347
+static int __maybe_unused imx2_wdt_suspend(struct device *dev)
369348 {
370349 struct watchdog_device *wdog = dev_get_drvdata(dev);
371350 struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog);
....@@ -386,7 +365,7 @@
386365 }
387366
388367 /* Enable watchdog and configure it if necessary */
389
-static int imx2_wdt_resume(struct device *dev)
368
+static int __maybe_unused imx2_wdt_resume(struct device *dev)
390369 {
391370 struct watchdog_device *wdog = dev_get_drvdata(dev);
392371 struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog);
....@@ -411,7 +390,6 @@
411390
412391 return 0;
413392 }
414
-#endif
415393
416394 static SIMPLE_DEV_PM_OPS(imx2_wdt_pm_ops, imx2_wdt_suspend,
417395 imx2_wdt_resume);
....@@ -423,7 +401,6 @@
423401 MODULE_DEVICE_TABLE(of, imx2_wdt_dt_ids);
424402
425403 static struct platform_driver imx2_wdt_driver = {
426
- .remove = __exit_p(imx2_wdt_remove),
427404 .shutdown = imx2_wdt_shutdown,
428405 .driver = {
429406 .name = DRIVER_NAME,