Merge remote-tracking branches 'asoc/topic/tegra', 'asoc/topic/tlv320aic23', 'asoc...
[sfrench/cifs-2.6.git] / include / linux / reset.h
1 #ifndef _LINUX_RESET_H_
2 #define _LINUX_RESET_H_
3
4 #include <linux/device.h>
5
6 struct reset_control;
7
8 #ifdef CONFIG_RESET_CONTROLLER
9
10 int reset_control_reset(struct reset_control *rstc);
11 int reset_control_assert(struct reset_control *rstc);
12 int reset_control_deassert(struct reset_control *rstc);
13 int reset_control_status(struct reset_control *rstc);
14
15 struct reset_control *__of_reset_control_get(struct device_node *node,
16                                      const char *id, int index, bool shared,
17                                      bool optional);
18 struct reset_control *__reset_control_get(struct device *dev, const char *id,
19                                           int index, bool shared,
20                                           bool optional);
21 void reset_control_put(struct reset_control *rstc);
22 struct reset_control *__devm_reset_control_get(struct device *dev,
23                                      const char *id, int index, bool shared,
24                                      bool optional);
25
26 int __must_check device_reset(struct device *dev);
27
28 static inline int device_reset_optional(struct device *dev)
29 {
30         return device_reset(dev);
31 }
32
33 #else
34
35 static inline int reset_control_reset(struct reset_control *rstc)
36 {
37         return 0;
38 }
39
40 static inline int reset_control_assert(struct reset_control *rstc)
41 {
42         return 0;
43 }
44
45 static inline int reset_control_deassert(struct reset_control *rstc)
46 {
47         return 0;
48 }
49
50 static inline int reset_control_status(struct reset_control *rstc)
51 {
52         return 0;
53 }
54
55 static inline void reset_control_put(struct reset_control *rstc)
56 {
57 }
58
59 static inline int __must_check device_reset(struct device *dev)
60 {
61         WARN_ON(1);
62         return -ENOTSUPP;
63 }
64
65 static inline int device_reset_optional(struct device *dev)
66 {
67         return -ENOTSUPP;
68 }
69
70 static inline struct reset_control *__of_reset_control_get(
71                                         struct device_node *node,
72                                         const char *id, int index, bool shared,
73                                         bool optional)
74 {
75         return optional ? NULL : ERR_PTR(-ENOTSUPP);
76 }
77
78 static inline struct reset_control *__reset_control_get(
79                                         struct device *dev, const char *id,
80                                         int index, bool shared, bool optional)
81 {
82         return optional ? NULL : ERR_PTR(-ENOTSUPP);
83 }
84
85 static inline struct reset_control *__devm_reset_control_get(
86                                         struct device *dev, const char *id,
87                                         int index, bool shared, bool optional)
88 {
89         return optional ? NULL : ERR_PTR(-ENOTSUPP);
90 }
91
92 #endif /* CONFIG_RESET_CONTROLLER */
93
94 /**
95  * reset_control_get_exclusive - Lookup and obtain an exclusive reference
96  *                               to a reset controller.
97  * @dev: device to be reset by the controller
98  * @id: reset line name
99  *
100  * Returns a struct reset_control or IS_ERR() condition containing errno.
101  * If this function is called more then once for the same reset_control it will
102  * return -EBUSY.
103  *
104  * See reset_control_get_shared for details on shared references to
105  * reset-controls.
106  *
107  * Use of id names is optional.
108  */
109 static inline struct reset_control *
110 __must_check reset_control_get_exclusive(struct device *dev, const char *id)
111 {
112 #ifndef CONFIG_RESET_CONTROLLER
113         WARN_ON(1);
114 #endif
115         return __reset_control_get(dev, id, 0, false, false);
116 }
117
118 /**
119  * reset_control_get_shared - Lookup and obtain a shared reference to a
120  *                            reset controller.
121  * @dev: device to be reset by the controller
122  * @id: reset line name
123  *
124  * Returns a struct reset_control or IS_ERR() condition containing errno.
125  * This function is intended for use with reset-controls which are shared
126  * between hardware-blocks.
127  *
128  * When a reset-control is shared, the behavior of reset_control_assert /
129  * deassert is changed, the reset-core will keep track of a deassert_count
130  * and only (re-)assert the reset after reset_control_assert has been called
131  * as many times as reset_control_deassert was called. Also see the remark
132  * about shared reset-controls in the reset_control_assert docs.
133  *
134  * Calling reset_control_assert without first calling reset_control_deassert
135  * is not allowed on a shared reset control. Calling reset_control_reset is
136  * also not allowed on a shared reset control.
137  *
138  * Use of id names is optional.
139  */
140 static inline struct reset_control *reset_control_get_shared(
141                                         struct device *dev, const char *id)
142 {
143         return __reset_control_get(dev, id, 0, true, false);
144 }
145
146 static inline struct reset_control *reset_control_get_optional_exclusive(
147                                         struct device *dev, const char *id)
148 {
149         return __reset_control_get(dev, id, 0, false, true);
150 }
151
152 static inline struct reset_control *reset_control_get_optional_shared(
153                                         struct device *dev, const char *id)
154 {
155         return __reset_control_get(dev, id, 0, true, true);
156 }
157
158 /**
159  * of_reset_control_get_exclusive - Lookup and obtain an exclusive reference
160  *                                  to a reset controller.
161  * @node: 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  *
166  * Use of id names is optional.
167  */
168 static inline struct reset_control *of_reset_control_get_exclusive(
169                                 struct device_node *node, const char *id)
170 {
171         return __of_reset_control_get(node, id, 0, false, false);
172 }
173
174 /**
175  * of_reset_control_get_shared - Lookup and obtain an shared reference
176  *                               to a reset controller.
177  * @node: device to be reset by the controller
178  * @id: reset line name
179  *
180  * When a reset-control is shared, the behavior of reset_control_assert /
181  * deassert is changed, the reset-core will keep track of a deassert_count
182  * and only (re-)assert the reset after reset_control_assert has been called
183  * as many times as reset_control_deassert was called. Also see the remark
184  * about shared reset-controls in the reset_control_assert docs.
185  *
186  * Calling reset_control_assert without first calling reset_control_deassert
187  * is not allowed on a shared reset control. Calling reset_control_reset is
188  * also not allowed on a shared reset control.
189  * Returns a struct reset_control or IS_ERR() condition containing errno.
190  *
191  * Use of id names is optional.
192  */
193 static inline struct reset_control *of_reset_control_get_shared(
194                                 struct device_node *node, const char *id)
195 {
196         return __of_reset_control_get(node, id, 0, true, false);
197 }
198
199 /**
200  * of_reset_control_get_exclusive_by_index - Lookup and obtain an exclusive
201  *                                           reference to a reset controller
202  *                                           by index.
203  * @node: device to be reset by the controller
204  * @index: index of the reset controller
205  *
206  * This is to be used to perform a list of resets for a device or power domain
207  * in whatever order. Returns a struct reset_control or IS_ERR() condition
208  * containing errno.
209  */
210 static inline struct reset_control *of_reset_control_get_exclusive_by_index(
211                                         struct device_node *node, int index)
212 {
213         return __of_reset_control_get(node, NULL, index, false, false);
214 }
215
216 /**
217  * of_reset_control_get_shared_by_index - Lookup and obtain an shared
218  *                                        reference to a reset controller
219  *                                        by index.
220  * @node: device to be reset by the controller
221  * @index: index of the reset controller
222  *
223  * When a reset-control is shared, the behavior of reset_control_assert /
224  * deassert is changed, the reset-core will keep track of a deassert_count
225  * and only (re-)assert the reset after reset_control_assert has been called
226  * as many times as reset_control_deassert was called. Also see the remark
227  * about shared reset-controls in the reset_control_assert docs.
228  *
229  * Calling reset_control_assert without first calling reset_control_deassert
230  * is not allowed on a shared reset control. Calling reset_control_reset is
231  * also not allowed on a shared reset control.
232  * Returns a struct reset_control or IS_ERR() condition containing errno.
233  *
234  * This is to be used to perform a list of resets for a device or power domain
235  * in whatever order. Returns a struct reset_control or IS_ERR() condition
236  * containing errno.
237  */
238 static inline struct reset_control *of_reset_control_get_shared_by_index(
239                                         struct device_node *node, int index)
240 {
241         return __of_reset_control_get(node, NULL, index, true, false);
242 }
243
244 /**
245  * devm_reset_control_get_exclusive - resource managed
246  *                                    reset_control_get_exclusive()
247  * @dev: device to be reset by the controller
248  * @id: reset line name
249  *
250  * Managed reset_control_get_exclusive(). For reset controllers returned
251  * from this function, reset_control_put() is called automatically on driver
252  * detach.
253  *
254  * See reset_control_get_exclusive() for more information.
255  */
256 static inline struct reset_control *
257 __must_check devm_reset_control_get_exclusive(struct device *dev,
258                                               const char *id)
259 {
260 #ifndef CONFIG_RESET_CONTROLLER
261         WARN_ON(1);
262 #endif
263         return __devm_reset_control_get(dev, id, 0, false, false);
264 }
265
266 /**
267  * devm_reset_control_get_shared - resource managed reset_control_get_shared()
268  * @dev: device to be reset by the controller
269  * @id: reset line name
270  *
271  * Managed reset_control_get_shared(). For reset controllers returned from
272  * this function, reset_control_put() is called automatically on driver detach.
273  * See reset_control_get_shared() for more information.
274  */
275 static inline struct reset_control *devm_reset_control_get_shared(
276                                         struct device *dev, const char *id)
277 {
278         return __devm_reset_control_get(dev, id, 0, true, false);
279 }
280
281 static inline struct reset_control *devm_reset_control_get_optional_exclusive(
282                                         struct device *dev, const char *id)
283 {
284         return __devm_reset_control_get(dev, id, 0, false, true);
285 }
286
287 static inline struct reset_control *devm_reset_control_get_optional_shared(
288                                         struct device *dev, const char *id)
289 {
290         return __devm_reset_control_get(dev, id, 0, true, true);
291 }
292
293 /**
294  * devm_reset_control_get_exclusive_by_index - resource managed
295  *                                             reset_control_get_exclusive()
296  * @dev: device to be reset by the controller
297  * @index: index of the reset controller
298  *
299  * Managed reset_control_get_exclusive(). For reset controllers returned from
300  * this function, reset_control_put() is called automatically on driver
301  * detach.
302  *
303  * See reset_control_get_exclusive() for more information.
304  */
305 static inline struct reset_control *
306 devm_reset_control_get_exclusive_by_index(struct device *dev, int index)
307 {
308         return __devm_reset_control_get(dev, NULL, index, false, false);
309 }
310
311 /**
312  * devm_reset_control_get_shared_by_index - resource managed
313  * reset_control_get_shared
314  * @dev: device to be reset by the controller
315  * @index: index of the reset controller
316  *
317  * Managed reset_control_get_shared(). For reset controllers returned from
318  * this function, reset_control_put() is called automatically on driver detach.
319  * See reset_control_get_shared() for more information.
320  */
321 static inline struct reset_control *
322 devm_reset_control_get_shared_by_index(struct device *dev, int index)
323 {
324         return __devm_reset_control_get(dev, NULL, index, true, false);
325 }
326
327 /*
328  * TEMPORARY calls to use during transition:
329  *
330  *   of_reset_control_get() => of_reset_control_get_exclusive()
331  *
332  * These inline function calls will be removed once all consumers
333  * have been moved over to the new explicit API.
334  */
335 static inline struct reset_control *reset_control_get(
336                                 struct device *dev, const char *id)
337 {
338         return reset_control_get_exclusive(dev, id);
339 }
340
341 static inline struct reset_control *reset_control_get_optional(
342                                         struct device *dev, const char *id)
343 {
344         return reset_control_get_optional_exclusive(dev, id);
345 }
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 #endif