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