hc
2024-05-14 bedbef8ad3e75a304af6361af235302bcc61d06b
kernel/drivers/watchdog/rtd119x_wdt.c
....@@ -9,7 +9,6 @@
99 #include <linux/bitops.h>
1010 #include <linux/clk.h>
1111 #include <linux/io.h>
12
-#include <linux/module.h>
1312 #include <linux/of.h>
1413 #include <linux/of_address.h>
1514 #include <linux/platform_device.h>
....@@ -95,37 +94,43 @@
9594 { }
9695 };
9796
97
+static void rtd119x_clk_disable_unprepare(void *data)
98
+{
99
+ clk_disable_unprepare(data);
100
+}
101
+
98102 static int rtd119x_wdt_probe(struct platform_device *pdev)
99103 {
104
+ struct device *dev = &pdev->dev;
100105 struct rtd119x_watchdog_device *data;
101
- struct resource *res;
102106 int ret;
103107
104
- data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
108
+ data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
105109 if (!data)
106110 return -ENOMEM;
107111
108
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
109
- data->base = devm_ioremap_resource(&pdev->dev, res);
112
+ data->base = devm_platform_ioremap_resource(pdev, 0);
110113 if (IS_ERR(data->base))
111114 return PTR_ERR(data->base);
112115
113
- data->clk = of_clk_get(pdev->dev.of_node, 0);
116
+ data->clk = devm_clk_get(dev, NULL);
114117 if (IS_ERR(data->clk))
115118 return PTR_ERR(data->clk);
116119
117120 ret = clk_prepare_enable(data->clk);
118
- if (ret) {
119
- clk_put(data->clk);
121
+ if (ret)
120122 return ret;
121
- }
123
+ ret = devm_add_action_or_reset(dev, rtd119x_clk_disable_unprepare,
124
+ data->clk);
125
+ if (ret)
126
+ return ret;
122127
123128 data->wdt_dev.info = &rtd119x_wdt_info;
124129 data->wdt_dev.ops = &rtd119x_wdt_ops;
125130 data->wdt_dev.timeout = 120;
126131 data->wdt_dev.max_timeout = 0xffffffff / clk_get_rate(data->clk);
127132 data->wdt_dev.min_timeout = 1;
128
- data->wdt_dev.parent = &pdev->dev;
133
+ data->wdt_dev.parent = dev;
129134
130135 watchdog_stop_on_reboot(&data->wdt_dev);
131136 watchdog_set_drvdata(&data->wdt_dev, data);
....@@ -135,31 +140,11 @@
135140 rtd119x_wdt_set_timeout(&data->wdt_dev, data->wdt_dev.timeout);
136141 rtd119x_wdt_stop(&data->wdt_dev);
137142
138
- ret = watchdog_register_device(&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
-
148
-static 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;
143
+ return devm_watchdog_register_device(dev, &data->wdt_dev);
158144 }
159145
160146 static struct platform_driver rtd119x_wdt_driver = {
161147 .probe = rtd119x_wdt_probe,
162
- .remove = rtd119x_wdt_remove,
163148 .driver = {
164149 .name = "rtd1295-watchdog",
165150 .of_match_table = rtd119x_wdt_dt_ids,