Merge drm-next into drm-intel-next-queued (this time for real)
[linux-2.6-microblaze.git] / include / linux / reset.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LINUX_RESET_H_
3 #define _LINUX_RESET_H_
4
5 #include <linux/types.h>
6
7 struct device;
8 struct device_node;
9 struct reset_control;
10
11 #ifdef CONFIG_RESET_CONTROLLER
12
13 int reset_control_reset(struct reset_control *rstc);
14 int reset_control_assert(struct reset_control *rstc);
15 int reset_control_deassert(struct reset_control *rstc);
16 int reset_control_status(struct reset_control *rstc);
17
18 struct reset_control *__of_reset_control_get(struct device_node *node,
19                                      const char *id, int index, bool shared,
20                                      bool optional);
21 struct reset_control *__reset_control_get(struct device *dev, const char *id,
22                                           int index, bool shared,
23                                           bool optional);
24 void reset_control_put(struct reset_control *rstc);
25 int __device_reset(struct device *dev, bool optional);
26 struct reset_control *__devm_reset_control_get(struct device *dev,
27                                      const char *id, int index, bool shared,
28                                      bool optional);
29
30 struct reset_control *devm_reset_control_array_get(struct device *dev,
31                                                    bool shared, bool optional);
32 struct reset_control *of_reset_control_array_get(struct device_node *np,
33                                                  bool shared, bool optional);
34
35 #else
36
37 static inline int reset_control_reset(struct reset_control *rstc)
38 {
39         return 0;
40 }
41
42 static inline int reset_control_assert(struct reset_control *rstc)
43 {
44         return 0;
45 }
46
47 static inline int reset_control_deassert(struct reset_control *rstc)
48 {
49         return 0;
50 }
51
52 static inline int reset_control_status(struct reset_control *rstc)
53 {
54         return 0;
55 }
56
57 static inline void reset_control_put(struct reset_control *rstc)
58 {
59 }
60
61 static inline int __device_reset(struct device *dev, bool optional)
62 {
63         return optional ? 0 : -ENOTSUPP;
64 }
65
66 static inline struct reset_control *__of_reset_control_get(
67                                         struct device_node *node,
68                                         const char *id, int index, bool shared,
69                                         bool optional)
70 {
71         return optional ? NULL : ERR_PTR(-ENOTSUPP);
72 }
73
74 static inline struct reset_control *__reset_control_get(
75                                         struct device *dev, const char *id,
76                                         int index, bool shared, bool optional)
77 {
78         return optional ? NULL : ERR_PTR(-ENOTSUPP);
79 }
80
81 static inline struct reset_control *__devm_reset_control_get(
82                                         struct device *dev, const char *id,
83                                         int index, bool shared, bool optional)
84 {
85         return optional ? NULL : ERR_PTR(-ENOTSUPP);
86 }
87
88 static inline struct reset_control *
89 devm_reset_control_array_get(struct device *dev, bool shared, bool optional)
90 {
91         return optional ? NULL : ERR_PTR(-ENOTSUPP);
92 }
93
94 static inline struct reset_control *
95 of_reset_control_array_get(struct device_node *np, bool shared, bool optional)
96 {
97         return optional ? NULL : ERR_PTR(-ENOTSUPP);
98 }
99
100 #endif /* CONFIG_RESET_CONTROLLER */
101
102 static inline int __must_check device_reset(struct device *dev)
103 {
104         return __device_reset(dev, false);
105 }
106
107 static inline int device_reset_optional(struct device *dev)
108 {
109         return __device_reset(dev, true);
110 }
111
112 /**
113  * reset_control_get_exclusive - Lookup and obtain an exclusive reference
114  *                               to a reset controller.
115  * @dev: device to be reset by the controller
116  * @id: reset line name
117  *
118  * Returns a struct reset_control or IS_ERR() condition containing errno.
119  * If this function is called more then once for the same reset_control it will
120  * return -EBUSY.
121  *
122  * See reset_control_get_shared for details on shared references to
123  * reset-controls.
124  *
125  * Use of id names is optional.
126  */
127 static inline struct reset_control *
128 __must_check reset_control_get_exclusive(struct device *dev, const char *id)
129 {
130         return __reset_control_get(dev, id, 0, false, false);
131 }
132
133 /**
134  * reset_control_get_shared - Lookup and obtain a shared reference to a
135  *                            reset controller.
136  * @dev: device to be reset by the controller
137  * @id: reset line name
138  *
139  * Returns a struct reset_control or IS_ERR() condition containing errno.
140  * This function is intended for use with reset-controls which are shared
141  * between hardware-blocks.
142  *
143  * When a reset-control is shared, the behavior of reset_control_assert /
144  * deassert is changed, the reset-core will keep track of a deassert_count
145  * and only (re-)assert the reset after reset_control_assert has been called
146  * as many times as reset_control_deassert was called. Also see the remark
147  * about shared reset-controls in the reset_control_assert docs.
148  *
149  * Calling reset_control_assert without first calling reset_control_deassert
150  * is not allowed on a shared reset control. Calling reset_control_reset is
151  * also not allowed on a shared reset control.
152  *
153  * Use of id names is optional.
154  */
155 static inline struct reset_control *reset_control_get_shared(
156                                         struct device *dev, const char *id)
157 {
158         return __reset_control_get(dev, id, 0, true, false);
159 }
160
161 static inline struct reset_control *reset_control_get_optional_exclusive(
162                                         struct device *dev, const char *id)
163 {
164         return __reset_control_get(dev, id, 0, false, true);
165 }
166
167 static inline struct reset_control *reset_control_get_optional_shared(
168                                         struct device *dev, const char *id)
169 {
170         return __reset_control_get(dev, id, 0, true, true);
171 }
172
173 /**
174  * of_reset_control_get_exclusive - Lookup and obtain an exclusive reference
175  *                                  to a reset controller.
176  * @node: device to be reset by the controller
177  * @id: reset line name
178  *
179  * Returns a struct reset_control or IS_ERR() condition containing errno.
180  *
181  * Use of id names is optional.
182  */
183 static inline struct reset_control *of_reset_control_get_exclusive(
184                                 struct device_node *node, const char *id)
185 {
186         return __of_reset_control_get(node, id, 0, false, false);
187 }
188
189 /**
190  * of_reset_control_get_shared - Lookup and obtain an shared reference
191  *                               to a reset controller.
192  * @node: device to be reset by the controller
193  * @id: reset line name
194  *
195  * When a reset-control is shared, the behavior of reset_control_assert /
196  * deassert is changed, the reset-core will keep track of a deassert_count
197  * and only (re-)assert the reset after reset_control_assert has been called
198  * as many times as reset_control_deassert was called. Also see the remark
199  * about shared reset-controls in the reset_control_assert docs.
200  *
201  * Calling reset_control_assert without first calling reset_control_deassert
202  * is not allowed on a shared reset control. Calling reset_control_reset is
203  * also not allowed on a shared reset control.
204  * Returns a struct reset_control or IS_ERR() condition containing errno.
205  *
206  * Use of id names is optional.
207  */
208 static inline struct reset_control *of_reset_control_get_shared(
209                                 struct device_node *node, const char *id)
210 {
211         return __of_reset_control_get(node, id, 0, true, false);
212 }
213
214 /**
215  * of_reset_control_get_exclusive_by_index - Lookup and obtain an exclusive
216  *                                           reference to a reset controller
217  *                                           by index.
218  * @node: device to be reset by the controller
219  * @index: index of the reset controller
220  *
221  * This is to be used to perform a list of resets for a device or power domain
222  * in whatever order. Returns a struct reset_control or IS_ERR() condition
223  * containing errno.
224  */
225 static inline struct reset_control *of_reset_control_get_exclusive_by_index(
226                                         struct device_node *node, int index)
227 {
228         return __of_reset_control_get(node, NULL, index, false, false);
229 }
230
231 /**
232  * of_reset_control_get_shared_by_index - Lookup and obtain an shared
233  *                                        reference to a reset controller
234  *                                        by index.
235  * @node: device to be reset by the controller
236  * @index: index of the reset controller
237  *
238  * When a reset-control is shared, the behavior of reset_control_assert /
239  * deassert is changed, the reset-core will keep track of a deassert_count
240  * and only (re-)assert the reset after reset_control_assert has been called
241  * as many times as reset_control_deassert was called. Also see the remark
242  * about shared reset-controls in the reset_control_assert docs.
243  *
244  * Calling reset_control_assert without first calling reset_control_deassert
245  * is not allowed on a shared reset control. Calling reset_control_reset is
246  * also not allowed on a shared reset control.
247  * Returns a struct reset_control or IS_ERR() condition containing errno.
248  *
249  * This is to be used to perform a list of resets for a device or power domain
250  * in whatever order. Returns a struct reset_control or IS_ERR() condition
251  * containing errno.
252  */
253 static inline struct reset_control *of_reset_control_get_shared_by_index(
254                                         struct device_node *node, int index)
255 {
256         return __of_reset_control_get(node, NULL, index, true, false);
257 }
258
259 /**
260  * devm_reset_control_get_exclusive - resource managed
261  *                                    reset_control_get_exclusive()
262  * @dev: device to be reset by the controller
263  * @id: reset line name
264  *
265  * Managed reset_control_get_exclusive(). For reset controllers returned
266  * from this function, reset_control_put() is called automatically on driver
267  * detach.
268  *
269  * See reset_control_get_exclusive() for more information.
270  */
271 static inline struct reset_control *
272 __must_check devm_reset_control_get_exclusive(struct device *dev,
273                                               const char *id)
274 {
275         return __devm_reset_control_get(dev, id, 0, false, false);
276 }
277
278 /**
279  * devm_reset_control_get_shared - resource managed reset_control_get_shared()
280  * @dev: device to be reset by the controller
281  * @id: reset line name
282  *
283  * Managed reset_control_get_shared(). For reset controllers returned from
284  * this function, reset_control_put() is called automatically on driver detach.
285  * See reset_control_get_shared() for more information.
286  */
287 static inline struct reset_control *devm_reset_control_get_shared(
288                                         struct device *dev, const char *id)
289 {
290         return __devm_reset_control_get(dev, id, 0, true, false);
291 }
292
293 static inline struct reset_control *devm_reset_control_get_optional_exclusive(
294                                         struct device *dev, const char *id)
295 {
296         return __devm_reset_control_get(dev, id, 0, false, true);
297 }
298
299 static inline struct reset_control *devm_reset_control_get_optional_shared(
300                                         struct device *dev, const char *id)
301 {
302         return __devm_reset_control_get(dev, id, 0, true, true);
303 }
304
305 /**
306  * devm_reset_control_get_exclusive_by_index - resource managed
307  *                                             reset_control_get_exclusive()
308  * @dev: device to be reset by the controller
309  * @index: index of the reset controller
310  *
311  * Managed reset_control_get_exclusive(). For reset controllers returned from
312  * this function, reset_control_put() is called automatically on driver
313  * detach.
314  *
315  * See reset_control_get_exclusive() for more information.
316  */
317 static inline struct reset_control *
318 devm_reset_control_get_exclusive_by_index(struct device *dev, int index)
319 {
320         return __devm_reset_control_get(dev, NULL, index, false, false);
321 }
322
323 /**
324  * devm_reset_control_get_shared_by_index - resource managed
325  * reset_control_get_shared
326  * @dev: device to be reset by the controller
327  * @index: index of the reset controller
328  *
329  * Managed reset_control_get_shared(). For reset controllers returned from
330  * this function, reset_control_put() is called automatically on driver detach.
331  * See reset_control_get_shared() for more information.
332  */
333 static inline struct reset_control *
334 devm_reset_control_get_shared_by_index(struct device *dev, int index)
335 {
336         return __devm_reset_control_get(dev, NULL, index, true, false);
337 }
338
339 /*
340  * TEMPORARY calls to use during transition:
341  *
342  *   of_reset_control_get() => of_reset_control_get_exclusive()
343  *
344  * These inline function calls will be removed once all consumers
345  * have been moved over to the new explicit API.
346  */
347 static inline struct reset_control *of_reset_control_get(
348                                 struct device_node *node, const char *id)
349 {
350         return of_reset_control_get_exclusive(node, id);
351 }
352
353 static inline struct reset_control *of_reset_control_get_by_index(
354                                 struct device_node *node, int index)
355 {
356         return of_reset_control_get_exclusive_by_index(node, index);
357 }
358
359 static inline struct reset_control *devm_reset_control_get(
360                                 struct device *dev, const char *id)
361 {
362         return devm_reset_control_get_exclusive(dev, id);
363 }
364
365 static inline struct reset_control *devm_reset_control_get_optional(
366                                 struct device *dev, const char *id)
367 {
368         return devm_reset_control_get_optional_exclusive(dev, id);
369
370 }
371
372 static inline struct reset_control *devm_reset_control_get_by_index(
373                                 struct device *dev, int index)
374 {
375         return devm_reset_control_get_exclusive_by_index(dev, index);
376 }
377
378 /*
379  * APIs to manage a list of reset controllers
380  */
381 static inline struct reset_control *
382 devm_reset_control_array_get_exclusive(struct device *dev)
383 {
384         return devm_reset_control_array_get(dev, false, false);
385 }
386
387 static inline struct reset_control *
388 devm_reset_control_array_get_shared(struct device *dev)
389 {
390         return devm_reset_control_array_get(dev, true, false);
391 }
392
393 static inline struct reset_control *
394 devm_reset_control_array_get_optional_exclusive(struct device *dev)
395 {
396         return devm_reset_control_array_get(dev, false, true);
397 }
398
399 static inline struct reset_control *
400 devm_reset_control_array_get_optional_shared(struct device *dev)
401 {
402         return devm_reset_control_array_get(dev, true, true);
403 }
404
405 static inline struct reset_control *
406 of_reset_control_array_get_exclusive(struct device_node *node)
407 {
408         return of_reset_control_array_get(node, false, false);
409 }
410
411 static inline struct reset_control *
412 of_reset_control_array_get_shared(struct device_node *node)
413 {
414         return of_reset_control_array_get(node, true, false);
415 }
416
417 static inline struct reset_control *
418 of_reset_control_array_get_optional_exclusive(struct device_node *node)
419 {
420         return of_reset_control_array_get(node, false, true);
421 }
422
423 static inline struct reset_control *
424 of_reset_control_array_get_optional_shared(struct device_node *node)
425 {
426         return of_reset_control_array_get(node, true, true);
427 }
428 #endif