hc
2024-05-14 bedbef8ad3e75a304af6361af235302bcc61d06b
kernel/drivers/watchdog/meson_gxbb_wdt.c
....@@ -136,32 +136,40 @@
136136 };
137137 MODULE_DEVICE_TABLE(of, meson_gxbb_wdt_dt_ids);
138138
139
+static void meson_clk_disable_unprepare(void *data)
140
+{
141
+ clk_disable_unprepare(data);
142
+}
143
+
139144 static int meson_gxbb_wdt_probe(struct platform_device *pdev)
140145 {
146
+ struct device *dev = &pdev->dev;
141147 struct meson_gxbb_wdt *data;
142
- struct resource *res;
143148 int ret;
144149
145
- data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
150
+ data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
146151 if (!data)
147152 return -ENOMEM;
148153
149
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
150
- data->reg_base = devm_ioremap_resource(&pdev->dev, res);
154
+ data->reg_base = devm_platform_ioremap_resource(pdev, 0);
151155 if (IS_ERR(data->reg_base))
152156 return PTR_ERR(data->reg_base);
153157
154
- data->clk = devm_clk_get(&pdev->dev, NULL);
158
+ data->clk = devm_clk_get(dev, NULL);
155159 if (IS_ERR(data->clk))
156160 return PTR_ERR(data->clk);
157161
158162 ret = clk_prepare_enable(data->clk);
159163 if (ret)
160164 return ret;
165
+ ret = devm_add_action_or_reset(dev, meson_clk_disable_unprepare,
166
+ data->clk);
167
+ if (ret)
168
+ return ret;
161169
162170 platform_set_drvdata(pdev, data);
163171
164
- data->wdt_dev.parent = &pdev->dev;
172
+ data->wdt_dev.parent = dev;
165173 data->wdt_dev.info = &meson_gxbb_wdt_info;
166174 data->wdt_dev.ops = &meson_gxbb_wdt_ops;
167175 data->wdt_dev.max_hw_heartbeat_ms = GXBB_WDT_TCNT_SETUP_MASK;
....@@ -178,37 +186,12 @@
178186
179187 meson_gxbb_wdt_set_timeout(&data->wdt_dev, data->wdt_dev.timeout);
180188
181
- ret = watchdog_register_device(&data->wdt_dev);
182
- if (ret) {
183
- clk_disable_unprepare(data->clk);
184
- return ret;
185
- }
186
-
187
- return 0;
188
-}
189
-
190
-static 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
-
201
-static 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);
189
+ watchdog_stop_on_reboot(&data->wdt_dev);
190
+ return devm_watchdog_register_device(dev, &data->wdt_dev);
206191 }
207192
208193 static struct platform_driver meson_gxbb_wdt_driver = {
209194 .probe = meson_gxbb_wdt_probe,
210
- .remove = meson_gxbb_wdt_remove,
211
- .shutdown = meson_gxbb_wdt_shutdown,
212195 .driver = {
213196 .name = "meson-gxbb-wdt",
214197 .pm = &meson_gxbb_wdt_pm_ops,