|
1 | 1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | 2 |
|
3 | | -/* SpacemiT reset controller driver */ |
| 3 | +/* SpacemiT K1 reset controller driver */ |
4 | 4 |
|
5 | | -#include <linux/auxiliary_bus.h> |
6 | | -#include <linux/container_of.h> |
7 | | -#include <linux/device.h> |
8 | 5 | #include <linux/module.h> |
9 | | -#include <linux/regmap.h> |
10 | | -#include <linux/reset-controller.h> |
11 | | -#include <linux/types.h> |
12 | 6 |
|
13 | | -#include <soc/spacemit/k1-syscon.h> |
14 | 7 | #include <dt-bindings/clock/spacemit,k1-syscon.h> |
| 8 | +#include <soc/spacemit/k1-syscon.h> |
15 | 9 |
|
16 | | -struct ccu_reset_data { |
17 | | - u32 offset; |
18 | | - u32 assert_mask; |
19 | | - u32 deassert_mask; |
20 | | -}; |
21 | | - |
22 | | -struct ccu_reset_controller_data { |
23 | | - const struct ccu_reset_data *reset_data; /* array */ |
24 | | - size_t count; |
25 | | -}; |
26 | | - |
27 | | -struct ccu_reset_controller { |
28 | | - struct reset_controller_dev rcdev; |
29 | | - const struct ccu_reset_controller_data *data; |
30 | | - struct regmap *regmap; |
31 | | -}; |
32 | | - |
33 | | -#define RESET_DATA(_offset, _assert_mask, _deassert_mask) \ |
34 | | - { \ |
35 | | - .offset = (_offset), \ |
36 | | - .assert_mask = (_assert_mask), \ |
37 | | - .deassert_mask = (_deassert_mask), \ |
38 | | - } |
| 10 | +#include "reset-spacemit-common.h" |
39 | 11 |
|
40 | 12 | static const struct ccu_reset_data k1_mpmu_resets[] = { |
41 | 13 | [RESET_WDT] = RESET_DATA(MPMU_WDTPCR, BIT(2), 0), |
@@ -214,91 +186,30 @@ static const struct ccu_reset_controller_data k1_apbc2_reset_data = { |
214 | 186 | .count = ARRAY_SIZE(k1_apbc2_resets), |
215 | 187 | }; |
216 | 188 |
|
217 | | -static int spacemit_reset_update(struct reset_controller_dev *rcdev, |
218 | | - unsigned long id, bool assert) |
219 | | -{ |
220 | | - struct ccu_reset_controller *controller; |
221 | | - const struct ccu_reset_data *data; |
222 | | - u32 mask; |
223 | | - u32 val; |
224 | | - |
225 | | - controller = container_of(rcdev, struct ccu_reset_controller, rcdev); |
226 | | - data = &controller->data->reset_data[id]; |
227 | | - mask = data->assert_mask | data->deassert_mask; |
228 | | - val = assert ? data->assert_mask : data->deassert_mask; |
229 | | - |
230 | | - return regmap_update_bits(controller->regmap, data->offset, mask, val); |
231 | | -} |
232 | | - |
233 | | -static int spacemit_reset_assert(struct reset_controller_dev *rcdev, |
234 | | - unsigned long id) |
235 | | -{ |
236 | | - return spacemit_reset_update(rcdev, id, true); |
237 | | -} |
238 | | - |
239 | | -static int spacemit_reset_deassert(struct reset_controller_dev *rcdev, |
240 | | - unsigned long id) |
241 | | -{ |
242 | | - return spacemit_reset_update(rcdev, id, false); |
243 | | -} |
244 | | - |
245 | | -static const struct reset_control_ops spacemit_reset_control_ops = { |
246 | | - .assert = spacemit_reset_assert, |
247 | | - .deassert = spacemit_reset_deassert, |
248 | | -}; |
249 | | - |
250 | | -static int spacemit_reset_controller_register(struct device *dev, |
251 | | - struct ccu_reset_controller *controller) |
252 | | -{ |
253 | | - struct reset_controller_dev *rcdev = &controller->rcdev; |
254 | | - |
255 | | - rcdev->ops = &spacemit_reset_control_ops; |
256 | | - rcdev->owner = THIS_MODULE; |
257 | | - rcdev->of_node = dev->of_node; |
258 | | - rcdev->nr_resets = controller->data->count; |
259 | | - |
260 | | - return devm_reset_controller_register(dev, &controller->rcdev); |
261 | | -} |
262 | | - |
263 | | -static int spacemit_reset_probe(struct auxiliary_device *adev, |
264 | | - const struct auxiliary_device_id *id) |
265 | | -{ |
266 | | - struct spacemit_ccu_adev *rdev = to_spacemit_ccu_adev(adev); |
267 | | - struct ccu_reset_controller *controller; |
268 | | - struct device *dev = &adev->dev; |
269 | | - |
270 | | - controller = devm_kzalloc(dev, sizeof(*controller), GFP_KERNEL); |
271 | | - if (!controller) |
272 | | - return -ENOMEM; |
273 | | - controller->data = (const struct ccu_reset_controller_data *)id->driver_data; |
274 | | - controller->regmap = rdev->regmap; |
275 | | - |
276 | | - return spacemit_reset_controller_register(dev, controller); |
277 | | -} |
278 | | - |
279 | 189 | #define K1_AUX_DEV_ID(_unit) \ |
280 | 190 | { \ |
281 | 191 | .name = "spacemit_ccu.k1-" #_unit "-reset", \ |
282 | 192 | .driver_data = (kernel_ulong_t)&k1_ ## _unit ## _reset_data, \ |
283 | 193 | } |
284 | 194 |
|
285 | | -static const struct auxiliary_device_id spacemit_reset_ids[] = { |
| 195 | +static const struct auxiliary_device_id spacemit_k1_reset_ids[] = { |
286 | 196 | K1_AUX_DEV_ID(mpmu), |
287 | 197 | K1_AUX_DEV_ID(apbc), |
288 | 198 | K1_AUX_DEV_ID(apmu), |
289 | 199 | K1_AUX_DEV_ID(rcpu), |
290 | 200 | K1_AUX_DEV_ID(rcpu2), |
291 | 201 | K1_AUX_DEV_ID(apbc2), |
292 | | - { }, |
| 202 | + { /* sentinel */ } |
293 | 203 | }; |
294 | | -MODULE_DEVICE_TABLE(auxiliary, spacemit_reset_ids); |
| 204 | +MODULE_DEVICE_TABLE(auxiliary, spacemit_k1_reset_ids); |
295 | 205 |
|
296 | 206 | static struct auxiliary_driver spacemit_k1_reset_driver = { |
297 | 207 | .probe = spacemit_reset_probe, |
298 | | - .id_table = spacemit_reset_ids, |
| 208 | + .id_table = spacemit_k1_reset_ids, |
299 | 209 | }; |
300 | 210 | module_auxiliary_driver(spacemit_k1_reset_driver); |
301 | 211 |
|
| 212 | +MODULE_IMPORT_NS("RESET_SPACEMIT"); |
302 | 213 | MODULE_AUTHOR("Alex Elder <elder@kernel.org>"); |
303 | | -MODULE_DESCRIPTION("SpacemiT reset controller driver"); |
| 214 | +MODULE_DESCRIPTION("SpacemiT K1 reset controller driver"); |
304 | 215 | MODULE_LICENSE("GPL"); |
0 commit comments