.. | .. |
---|
136 | 136 | }; |
---|
137 | 137 | MODULE_DEVICE_TABLE(of, meson_gxbb_wdt_dt_ids); |
---|
138 | 138 | |
---|
| 139 | +static void meson_clk_disable_unprepare(void *data) |
---|
| 140 | +{ |
---|
| 141 | + clk_disable_unprepare(data); |
---|
| 142 | +} |
---|
| 143 | + |
---|
139 | 144 | static int meson_gxbb_wdt_probe(struct platform_device *pdev) |
---|
140 | 145 | { |
---|
| 146 | + struct device *dev = &pdev->dev; |
---|
141 | 147 | struct meson_gxbb_wdt *data; |
---|
142 | | - struct resource *res; |
---|
143 | 148 | int ret; |
---|
144 | 149 | |
---|
145 | | - data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); |
---|
| 150 | + data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); |
---|
146 | 151 | if (!data) |
---|
147 | 152 | return -ENOMEM; |
---|
148 | 153 | |
---|
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); |
---|
151 | 155 | if (IS_ERR(data->reg_base)) |
---|
152 | 156 | return PTR_ERR(data->reg_base); |
---|
153 | 157 | |
---|
154 | | - data->clk = devm_clk_get(&pdev->dev, NULL); |
---|
| 158 | + data->clk = devm_clk_get(dev, NULL); |
---|
155 | 159 | if (IS_ERR(data->clk)) |
---|
156 | 160 | return PTR_ERR(data->clk); |
---|
157 | 161 | |
---|
158 | 162 | ret = clk_prepare_enable(data->clk); |
---|
159 | 163 | if (ret) |
---|
160 | 164 | return ret; |
---|
| 165 | + ret = devm_add_action_or_reset(dev, meson_clk_disable_unprepare, |
---|
| 166 | + data->clk); |
---|
| 167 | + if (ret) |
---|
| 168 | + return ret; |
---|
161 | 169 | |
---|
162 | 170 | platform_set_drvdata(pdev, data); |
---|
163 | 171 | |
---|
164 | | - data->wdt_dev.parent = &pdev->dev; |
---|
| 172 | + data->wdt_dev.parent = dev; |
---|
165 | 173 | data->wdt_dev.info = &meson_gxbb_wdt_info; |
---|
166 | 174 | data->wdt_dev.ops = &meson_gxbb_wdt_ops; |
---|
167 | 175 | data->wdt_dev.max_hw_heartbeat_ms = GXBB_WDT_TCNT_SETUP_MASK; |
---|
.. | .. |
---|
178 | 186 | |
---|
179 | 187 | meson_gxbb_wdt_set_timeout(&data->wdt_dev, data->wdt_dev.timeout); |
---|
180 | 188 | |
---|
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); |
---|
206 | 191 | } |
---|
207 | 192 | |
---|
208 | 193 | static struct platform_driver meson_gxbb_wdt_driver = { |
---|
209 | 194 | .probe = meson_gxbb_wdt_probe, |
---|
210 | | - .remove = meson_gxbb_wdt_remove, |
---|
211 | | - .shutdown = meson_gxbb_wdt_shutdown, |
---|
212 | 195 | .driver = { |
---|
213 | 196 | .name = "meson-gxbb-wdt", |
---|
214 | 197 | .pm = &meson_gxbb_wdt_pm_ops, |
---|