xref: /linux-6.15/include/linux/reset.h (revision ef04d4ff)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LINUX_RESET_H_
3 #define _LINUX_RESET_H_
4 
5 #include <linux/err.h>
6 #include <linux/errno.h>
7 #include <linux/types.h>
8 
9 struct device;
10 struct device_node;
11 struct reset_control;
12 
13 #ifdef CONFIG_RESET_CONTROLLER
14 
15 int reset_control_reset(struct reset_control *rstc);
16 int reset_control_rearm(struct reset_control *rstc);
17 int reset_control_assert(struct reset_control *rstc);
18 int reset_control_deassert(struct reset_control *rstc);
19 int reset_control_status(struct reset_control *rstc);
20 int reset_control_acquire(struct reset_control *rstc);
21 void reset_control_release(struct reset_control *rstc);
22 
23 struct reset_control *__of_reset_control_get(struct device_node *node,
24 				     const char *id, int index, bool shared,
25 				     bool optional, bool acquired);
26 struct reset_control *__reset_control_get(struct device *dev, const char *id,
27 					  int index, bool shared,
28 					  bool optional, bool acquired);
29 void reset_control_put(struct reset_control *rstc);
30 int __device_reset(struct device *dev, bool optional);
31 struct reset_control *__devm_reset_control_get(struct device *dev,
32 				     const char *id, int index, bool shared,
33 				     bool optional, bool acquired);
34 
35 struct reset_control *devm_reset_control_array_get(struct device *dev,
36 						   bool shared, bool optional);
37 struct reset_control *of_reset_control_array_get(struct device_node *np,
38 						 bool shared, bool optional,
39 						 bool acquired);
40 
41 int reset_control_get_count(struct device *dev);
42 
43 #else
44 
45 static inline int reset_control_reset(struct reset_control *rstc)
46 {
47 	return 0;
48 }
49 
50 static inline int reset_control_assert(struct reset_control *rstc)
51 {
52 	return 0;
53 }
54 
55 static inline int reset_control_deassert(struct reset_control *rstc)
56 {
57 	return 0;
58 }
59 
60 static inline int reset_control_status(struct reset_control *rstc)
61 {
62 	return 0;
63 }
64 
65 static inline int reset_control_acquire(struct reset_control *rstc)
66 {
67 	return 0;
68 }
69 
70 static inline void reset_control_release(struct reset_control *rstc)
71 {
72 }
73 
74 static inline void reset_control_put(struct reset_control *rstc)
75 {
76 }
77 
78 static inline int __device_reset(struct device *dev, bool optional)
79 {
80 	return optional ? 0 : -ENOTSUPP;
81 }
82 
83 static inline struct reset_control *__of_reset_control_get(
84 					struct device_node *node,
85 					const char *id, int index, bool shared,
86 					bool optional, bool acquired)
87 {
88 	return optional ? NULL : ERR_PTR(-ENOTSUPP);
89 }
90 
91 static inline struct reset_control *__reset_control_get(
92 					struct device *dev, const char *id,
93 					int index, bool shared, bool optional,
94 					bool acquired)
95 {
96 	return optional ? NULL : ERR_PTR(-ENOTSUPP);
97 }
98 
99 static inline struct reset_control *__devm_reset_control_get(
100 					struct device *dev, const char *id,
101 					int index, bool shared, bool optional,
102 					bool acquired)
103 {
104 	return optional ? NULL : ERR_PTR(-ENOTSUPP);
105 }
106 
107 static inline struct reset_control *
108 devm_reset_control_array_get(struct device *dev, bool shared, bool optional)
109 {
110 	return optional ? NULL : ERR_PTR(-ENOTSUPP);
111 }
112 
113 static inline struct reset_control *
114 of_reset_control_array_get(struct device_node *np, bool shared, bool optional,
115 			   bool acquired)
116 {
117 	return optional ? NULL : ERR_PTR(-ENOTSUPP);
118 }
119 
120 static inline int reset_control_get_count(struct device *dev)
121 {
122 	return -ENOENT;
123 }
124 
125 #endif /* CONFIG_RESET_CONTROLLER */
126 
127 static inline int __must_check device_reset(struct device *dev)
128 {
129 	return __device_reset(dev, false);
130 }
131 
132 static inline int device_reset_optional(struct device *dev)
133 {
134 	return __device_reset(dev, true);
135 }
136 
137 /**
138  * reset_control_get_exclusive - Lookup and obtain an exclusive reference
139  *                               to a reset controller.
140  * @dev: device to be reset by the controller
141  * @id: reset line name
142  *
143  * Returns a struct reset_control or IS_ERR() condition containing errno.
144  * If this function is called more than once for the same reset_control it will
145  * return -EBUSY.
146  *
147  * See reset_control_get_shared() for details on shared references to
148  * reset-controls.
149  *
150  * Use of id names is optional.
151  */
152 static inline struct reset_control *
153 __must_check reset_control_get_exclusive(struct device *dev, const char *id)
154 {
155 	return __reset_control_get(dev, id, 0, false, false, true);
156 }
157 
158 /**
159  * reset_control_get_exclusive_released - Lookup and obtain a temoprarily
160  *                                        exclusive reference to a reset
161  *                                        controller.
162  * @dev: device to be reset by the controller
163  * @id: reset line name
164  *
165  * Returns a struct reset_control or IS_ERR() condition containing errno.
166  * reset-controls returned by this function must be acquired via
167  * reset_control_acquire() before they can be used and should be released
168  * via reset_control_release() afterwards.
169  *
170  * Use of id names is optional.
171  */
172 static inline struct reset_control *
173 __must_check reset_control_get_exclusive_released(struct device *dev,
174 						  const char *id)
175 {
176 	return __reset_control_get(dev, id, 0, false, false, false);
177 }
178 
179 /**
180  * reset_control_get_shared - Lookup and obtain a shared reference to a
181  *                            reset controller.
182  * @dev: device to be reset by the controller
183  * @id: reset line name
184  *
185  * Returns a struct reset_control or IS_ERR() condition containing errno.
186  * This function is intended for use with reset-controls which are shared
187  * between hardware blocks.
188  *
189  * When a reset-control is shared, the behavior of reset_control_assert /
190  * deassert is changed, the reset-core will keep track of a deassert_count
191  * and only (re-)assert the reset after reset_control_assert has been called
192  * as many times as reset_control_deassert was called. Also see the remark
193  * about shared reset-controls in the reset_control_assert docs.
194  *
195  * Calling reset_control_assert without first calling reset_control_deassert
196  * is not allowed on a shared reset control. Calling reset_control_reset is
197  * also not allowed on a shared reset control.
198  *
199  * Use of id names is optional.
200  */
201 static inline struct reset_control *reset_control_get_shared(
202 					struct device *dev, const char *id)
203 {
204 	return __reset_control_get(dev, id, 0, true, false, false);
205 }
206 
207 /**
208  * reset_control_get_optional_exclusive - optional reset_control_get_exclusive()
209  * @dev: device to be reset by the controller
210  * @id: reset line name
211  *
212  * Optional variant of reset_control_get_exclusive(). If the requested reset
213  * is not specified in the device tree, this function returns NULL instead of
214  * an error.
215  *
216  * See reset_control_get_exclusive() for more information.
217  */
218 static inline struct reset_control *reset_control_get_optional_exclusive(
219 					struct device *dev, const char *id)
220 {
221 	return __reset_control_get(dev, id, 0, false, true, true);
222 }
223 
224 /**
225  * reset_control_get_optional_shared - optional reset_control_get_shared()
226  * @dev: device to be reset by the controller
227  * @id: reset line name
228  *
229  * Optional variant of reset_control_get_shared(). If the requested reset
230  * is not specified in the device tree, this function returns NULL instead of
231  * an error.
232  *
233  * See reset_control_get_shared() for more information.
234  */
235 static inline struct reset_control *reset_control_get_optional_shared(
236 					struct device *dev, const char *id)
237 {
238 	return __reset_control_get(dev, id, 0, true, true, false);
239 }
240 
241 /**
242  * of_reset_control_get_exclusive - Lookup and obtain an exclusive reference
243  *                                  to a reset controller.
244  * @node: device to be reset by the controller
245  * @id: reset line name
246  *
247  * Returns a struct reset_control or IS_ERR() condition containing errno.
248  *
249  * Use of id names is optional.
250  */
251 static inline struct reset_control *of_reset_control_get_exclusive(
252 				struct device_node *node, const char *id)
253 {
254 	return __of_reset_control_get(node, id, 0, false, false, true);
255 }
256 
257 /**
258  * of_reset_control_get_shared - Lookup and obtain a shared reference
259  *                               to a reset controller.
260  * @node: device to be reset by the controller
261  * @id: reset line name
262  *
263  * When a reset-control is shared, the behavior of reset_control_assert /
264  * deassert is changed, the reset-core will keep track of a deassert_count
265  * and only (re-)assert the reset after reset_control_assert has been called
266  * as many times as reset_control_deassert was called. Also see the remark
267  * about shared reset-controls in the reset_control_assert docs.
268  *
269  * Calling reset_control_assert without first calling reset_control_deassert
270  * is not allowed on a shared reset control. Calling reset_control_reset is
271  * also not allowed on a shared reset control.
272  * Returns a struct reset_control or IS_ERR() condition containing errno.
273  *
274  * Use of id names is optional.
275  */
276 static inline struct reset_control *of_reset_control_get_shared(
277 				struct device_node *node, const char *id)
278 {
279 	return __of_reset_control_get(node, id, 0, true, false, false);
280 }
281 
282 /**
283  * of_reset_control_get_exclusive_by_index - Lookup and obtain an exclusive
284  *                                           reference to a reset controller
285  *                                           by index.
286  * @node: device to be reset by the controller
287  * @index: index of the reset controller
288  *
289  * This is to be used to perform a list of resets for a device or power domain
290  * in whatever order. Returns a struct reset_control or IS_ERR() condition
291  * containing errno.
292  */
293 static inline struct reset_control *of_reset_control_get_exclusive_by_index(
294 					struct device_node *node, int index)
295 {
296 	return __of_reset_control_get(node, NULL, index, false, false, true);
297 }
298 
299 /**
300  * of_reset_control_get_shared_by_index - Lookup and obtain a shared
301  *                                        reference to a reset controller
302  *                                        by index.
303  * @node: device to be reset by the controller
304  * @index: index of the reset controller
305  *
306  * When a reset-control is shared, the behavior of reset_control_assert /
307  * deassert is changed, the reset-core will keep track of a deassert_count
308  * and only (re-)assert the reset after reset_control_assert has been called
309  * as many times as reset_control_deassert was called. Also see the remark
310  * about shared reset-controls in the reset_control_assert docs.
311  *
312  * Calling reset_control_assert without first calling reset_control_deassert
313  * is not allowed on a shared reset control. Calling reset_control_reset is
314  * also not allowed on a shared reset control.
315  * Returns a struct reset_control or IS_ERR() condition containing errno.
316  *
317  * This is to be used to perform a list of resets for a device or power domain
318  * in whatever order. Returns a struct reset_control or IS_ERR() condition
319  * containing errno.
320  */
321 static inline struct reset_control *of_reset_control_get_shared_by_index(
322 					struct device_node *node, int index)
323 {
324 	return __of_reset_control_get(node, NULL, index, true, false, false);
325 }
326 
327 /**
328  * devm_reset_control_get_exclusive - resource managed
329  *                                    reset_control_get_exclusive()
330  * @dev: device to be reset by the controller
331  * @id: reset line name
332  *
333  * Managed reset_control_get_exclusive(). For reset controllers returned
334  * from this function, reset_control_put() is called automatically on driver
335  * detach.
336  *
337  * See reset_control_get_exclusive() for more information.
338  */
339 static inline struct reset_control *
340 __must_check devm_reset_control_get_exclusive(struct device *dev,
341 					      const char *id)
342 {
343 	return __devm_reset_control_get(dev, id, 0, false, false, true);
344 }
345 
346 /**
347  * devm_reset_control_get_exclusive_released - resource managed
348  *                                             reset_control_get_exclusive_released()
349  * @dev: device to be reset by the controller
350  * @id: reset line name
351  *
352  * Managed reset_control_get_exclusive_released(). For reset controllers
353  * returned from this function, reset_control_put() is called automatically on
354  * driver detach.
355  *
356  * See reset_control_get_exclusive_released() for more information.
357  */
358 static inline struct reset_control *
359 __must_check devm_reset_control_get_exclusive_released(struct device *dev,
360 						       const char *id)
361 {
362 	return __devm_reset_control_get(dev, id, 0, false, false, false);
363 }
364 
365 /**
366  * devm_reset_control_get_optional_exclusive_released - resource managed
367  *                                                      reset_control_get_optional_exclusive_released()
368  * @dev: device to be reset by the controller
369  * @id: reset line name
370  *
371  * Managed-and-optional variant of reset_control_get_exclusive_released(). For
372  * reset controllers returned from this function, reset_control_put() is called
373  * automatically on driver detach.
374  *
375  * See reset_control_get_exclusive_released() for more information.
376  */
377 static inline struct reset_control *
378 __must_check devm_reset_control_get_optional_exclusive_released(struct device *dev,
379 								const char *id)
380 {
381 	return __devm_reset_control_get(dev, id, 0, false, true, false);
382 }
383 
384 /**
385  * devm_reset_control_get_shared - resource managed reset_control_get_shared()
386  * @dev: device to be reset by the controller
387  * @id: reset line name
388  *
389  * Managed reset_control_get_shared(). For reset controllers returned from
390  * this function, reset_control_put() is called automatically on driver detach.
391  * See reset_control_get_shared() for more information.
392  */
393 static inline struct reset_control *devm_reset_control_get_shared(
394 					struct device *dev, const char *id)
395 {
396 	return __devm_reset_control_get(dev, id, 0, true, false, false);
397 }
398 
399 /**
400  * devm_reset_control_get_optional_exclusive - resource managed
401  *                                             reset_control_get_optional_exclusive()
402  * @dev: device to be reset by the controller
403  * @id: reset line name
404  *
405  * Managed reset_control_get_optional_exclusive(). For reset controllers
406  * returned from this function, reset_control_put() is called automatically on
407  * driver detach.
408  *
409  * See reset_control_get_optional_exclusive() for more information.
410  */
411 static inline struct reset_control *devm_reset_control_get_optional_exclusive(
412 					struct device *dev, const char *id)
413 {
414 	return __devm_reset_control_get(dev, id, 0, false, true, true);
415 }
416 
417 /**
418  * devm_reset_control_get_optional_shared - resource managed
419  *                                          reset_control_get_optional_shared()
420  * @dev: device to be reset by the controller
421  * @id: reset line name
422  *
423  * Managed reset_control_get_optional_shared(). For reset controllers returned
424  * from this function, reset_control_put() is called automatically on driver
425  * detach.
426  *
427  * See reset_control_get_optional_shared() for more information.
428  */
429 static inline struct reset_control *devm_reset_control_get_optional_shared(
430 					struct device *dev, const char *id)
431 {
432 	return __devm_reset_control_get(dev, id, 0, true, true, false);
433 }
434 
435 /**
436  * devm_reset_control_get_exclusive_by_index - resource managed
437  *                                             reset_control_get_exclusive()
438  * @dev: device to be reset by the controller
439  * @index: index of the reset controller
440  *
441  * Managed reset_control_get_exclusive(). For reset controllers returned from
442  * this function, reset_control_put() is called automatically on driver
443  * detach.
444  *
445  * See reset_control_get_exclusive() for more information.
446  */
447 static inline struct reset_control *
448 devm_reset_control_get_exclusive_by_index(struct device *dev, int index)
449 {
450 	return __devm_reset_control_get(dev, NULL, index, false, false, true);
451 }
452 
453 /**
454  * devm_reset_control_get_shared_by_index - resource managed
455  *                                          reset_control_get_shared
456  * @dev: device to be reset by the controller
457  * @index: index of the reset controller
458  *
459  * Managed reset_control_get_shared(). For reset controllers returned from
460  * this function, reset_control_put() is called automatically on driver detach.
461  * See reset_control_get_shared() for more information.
462  */
463 static inline struct reset_control *
464 devm_reset_control_get_shared_by_index(struct device *dev, int index)
465 {
466 	return __devm_reset_control_get(dev, NULL, index, true, false, false);
467 }
468 
469 /*
470  * TEMPORARY calls to use during transition:
471  *
472  *   of_reset_control_get() => of_reset_control_get_exclusive()
473  *
474  * These inline function calls will be removed once all consumers
475  * have been moved over to the new explicit API.
476  */
477 static inline struct reset_control *of_reset_control_get(
478 				struct device_node *node, const char *id)
479 {
480 	return of_reset_control_get_exclusive(node, id);
481 }
482 
483 static inline struct reset_control *of_reset_control_get_by_index(
484 				struct device_node *node, int index)
485 {
486 	return of_reset_control_get_exclusive_by_index(node, index);
487 }
488 
489 static inline struct reset_control *devm_reset_control_get(
490 				struct device *dev, const char *id)
491 {
492 	return devm_reset_control_get_exclusive(dev, id);
493 }
494 
495 static inline struct reset_control *devm_reset_control_get_optional(
496 				struct device *dev, const char *id)
497 {
498 	return devm_reset_control_get_optional_exclusive(dev, id);
499 
500 }
501 
502 static inline struct reset_control *devm_reset_control_get_by_index(
503 				struct device *dev, int index)
504 {
505 	return devm_reset_control_get_exclusive_by_index(dev, index);
506 }
507 
508 /*
509  * APIs to manage a list of reset controllers
510  */
511 static inline struct reset_control *
512 devm_reset_control_array_get_exclusive(struct device *dev)
513 {
514 	return devm_reset_control_array_get(dev, false, false);
515 }
516 
517 static inline struct reset_control *
518 devm_reset_control_array_get_shared(struct device *dev)
519 {
520 	return devm_reset_control_array_get(dev, true, false);
521 }
522 
523 static inline struct reset_control *
524 devm_reset_control_array_get_optional_exclusive(struct device *dev)
525 {
526 	return devm_reset_control_array_get(dev, false, true);
527 }
528 
529 static inline struct reset_control *
530 devm_reset_control_array_get_optional_shared(struct device *dev)
531 {
532 	return devm_reset_control_array_get(dev, true, true);
533 }
534 
535 static inline struct reset_control *
536 of_reset_control_array_get_exclusive(struct device_node *node)
537 {
538 	return of_reset_control_array_get(node, false, false, true);
539 }
540 
541 static inline struct reset_control *
542 of_reset_control_array_get_exclusive_released(struct device_node *node)
543 {
544 	return of_reset_control_array_get(node, false, false, false);
545 }
546 
547 static inline struct reset_control *
548 of_reset_control_array_get_shared(struct device_node *node)
549 {
550 	return of_reset_control_array_get(node, true, false, true);
551 }
552 
553 static inline struct reset_control *
554 of_reset_control_array_get_optional_exclusive(struct device_node *node)
555 {
556 	return of_reset_control_array_get(node, false, true, true);
557 }
558 
559 static inline struct reset_control *
560 of_reset_control_array_get_optional_shared(struct device_node *node)
561 {
562 	return of_reset_control_array_get(node, true, true, true);
563 }
564 #endif
565