hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/watchdog/pic32-dmt.c
....@@ -1,13 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * PIC32 deadman timer driver
34 *
45 * Purna Chandra Mandal <purna.mandal@microchip.com>
56 * Copyright (c) 2016, Microchip Technology Inc.
6
- *
7
- * This program is free software; you can redistribute it and/or
8
- * modify it under the terms of the GNU General Public License
9
- * as published by the Free Software Foundation; either version
10
- * 2 of the License, or (at your option) any later version.
117 */
128 #include <linux/clk.h>
139 #include <linux/device.h>
....@@ -168,69 +164,58 @@
168164 .ops = &pic32_dmt_fops,
169165 };
170166
167
+static void pic32_clk_disable_unprepare(void *data)
168
+{
169
+ clk_disable_unprepare(data);
170
+}
171
+
171172 static int pic32_dmt_probe(struct platform_device *pdev)
172173 {
174
+ struct device *dev = &pdev->dev;
173175 int ret;
174176 struct pic32_dmt *dmt;
175
- struct resource *mem;
176177 struct watchdog_device *wdd = &pic32_dmt_wdd;
177178
178
- dmt = devm_kzalloc(&pdev->dev, sizeof(*dmt), GFP_KERNEL);
179
+ dmt = devm_kzalloc(dev, sizeof(*dmt), GFP_KERNEL);
179180 if (!dmt)
180181 return -ENOMEM;
181182
182
- mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
183
- dmt->regs = devm_ioremap_resource(&pdev->dev, mem);
183
+ dmt->regs = devm_platform_ioremap_resource(pdev, 0);
184184 if (IS_ERR(dmt->regs))
185185 return PTR_ERR(dmt->regs);
186186
187
- dmt->clk = devm_clk_get(&pdev->dev, NULL);
187
+ dmt->clk = devm_clk_get(dev, NULL);
188188 if (IS_ERR(dmt->clk)) {
189
- dev_err(&pdev->dev, "clk not found\n");
189
+ dev_err(dev, "clk not found\n");
190190 return PTR_ERR(dmt->clk);
191191 }
192192
193193 ret = clk_prepare_enable(dmt->clk);
194194 if (ret)
195195 return ret;
196
+ ret = devm_add_action_or_reset(dev, pic32_clk_disable_unprepare,
197
+ dmt->clk);
198
+ if (ret)
199
+ return ret;
196200
197201 wdd->timeout = pic32_dmt_get_timeout_secs(dmt);
198202 if (!wdd->timeout) {
199
- dev_err(&pdev->dev,
200
- "failed to read watchdog register timeout\n");
201
- ret = -EINVAL;
202
- goto out_disable_clk;
203
+ dev_err(dev, "failed to read watchdog register timeout\n");
204
+ return -EINVAL;
203205 }
204206
205
- dev_info(&pdev->dev, "timeout %d\n", wdd->timeout);
207
+ dev_info(dev, "timeout %d\n", wdd->timeout);
206208
207209 wdd->bootstatus = pic32_dmt_bootstatus(dmt) ? WDIOF_CARDRESET : 0;
208210
209211 watchdog_set_nowayout(wdd, WATCHDOG_NOWAYOUT);
210212 watchdog_set_drvdata(wdd, dmt);
211213
212
- ret = watchdog_register_device(wdd);
213
- if (ret) {
214
- dev_err(&pdev->dev, "watchdog register failed, err %d\n", ret);
215
- goto out_disable_clk;
216
- }
214
+ ret = devm_watchdog_register_device(dev, wdd);
215
+ if (ret)
216
+ return ret;
217217
218218 platform_set_drvdata(pdev, wdd);
219
- return 0;
220
-
221
-out_disable_clk:
222
- clk_disable_unprepare(dmt->clk);
223
- return ret;
224
-}
225
-
226
-static 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
-
234219 return 0;
235220 }
236221
....@@ -242,7 +227,6 @@
242227
243228 static struct platform_driver pic32_dmt_driver = {
244229 .probe = pic32_dmt_probe,
245
- .remove = pic32_dmt_remove,
246230 .driver = {
247231 .name = "pic32-dmt",
248232 .of_match_table = of_match_ptr(pic32_dmt_of_ids),