blob: 61a0dda3f9818ff3d3d7fc60a075413520a04d17 [file] [log] [blame]
Philipp Zabel61fc4132012-11-19 17:23:13 +01001#ifndef _LINUX_RESET_H_
2#define _LINUX_RESET_H_
3
Hans de Goede6c96f052016-02-23 18:46:24 +01004#include <linux/device.h>
5
Philipp Zabel61fc4132012-11-19 17:23:13 +01006struct reset_control;
7
Philipp Zabelb4240802014-03-07 15:18:47 +01008#ifdef CONFIG_RESET_CONTROLLER
9
Philipp Zabel61fc4132012-11-19 17:23:13 +010010int reset_control_reset(struct reset_control *rstc);
11int reset_control_assert(struct reset_control *rstc);
12int reset_control_deassert(struct reset_control *rstc);
Dinh Nguyen729de412014-10-10 10:21:14 -050013int reset_control_status(struct reset_control *rstc);
Philipp Zabel61fc4132012-11-19 17:23:13 +010014
Hans de Goede6c96f052016-02-23 18:46:24 +010015struct reset_control *__of_reset_control_get(struct device_node *node,
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +000016 const char *id, int index, bool shared,
17 bool optional);
Philipp Zabelee6e7fb2016-02-05 13:41:39 +010018struct reset_control *__reset_control_get(struct device *dev, const char *id,
19 int index, bool shared,
20 bool optional);
Philipp Zabel61fc4132012-11-19 17:23:13 +010021void reset_control_put(struct reset_control *rstc);
Masahiro Yamadaf109deb2017-10-29 01:50:06 +090022int __device_reset(struct device *dev, bool optional);
Hans de Goede6c96f052016-02-23 18:46:24 +010023struct reset_control *__devm_reset_control_get(struct device *dev,
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +000024 const char *id, int index, bool shared,
25 bool optional);
Philipp Zabel61fc4132012-11-19 17:23:13 +010026
Philipp Zabelb4240802014-03-07 15:18:47 +010027#else
28
29static inline int reset_control_reset(struct reset_control *rstc)
30{
Philipp Zabelb4240802014-03-07 15:18:47 +010031 return 0;
32}
33
34static inline int reset_control_assert(struct reset_control *rstc)
35{
Philipp Zabelb4240802014-03-07 15:18:47 +010036 return 0;
37}
38
39static inline int reset_control_deassert(struct reset_control *rstc)
40{
Philipp Zabelb4240802014-03-07 15:18:47 +010041 return 0;
42}
43
Dinh Nguyen729de412014-10-10 10:21:14 -050044static inline int reset_control_status(struct reset_control *rstc)
45{
Dinh Nguyen729de412014-10-10 10:21:14 -050046 return 0;
47}
48
Philipp Zabelb4240802014-03-07 15:18:47 +010049static inline void reset_control_put(struct reset_control *rstc)
50{
Philipp Zabelb4240802014-03-07 15:18:47 +010051}
52
Masahiro Yamadaf109deb2017-10-29 01:50:06 +090053static inline int __device_reset(struct device *dev, bool optional)
Daniel Lezcano41136522016-04-01 21:38:16 +020054{
Masahiro Yamadaf109deb2017-10-29 01:50:06 +090055 return optional ? 0 : -ENOTSUPP;
Philipp Zabelb4240802014-03-07 15:18:47 +010056}
57
Hans de Goede6c96f052016-02-23 18:46:24 +010058static inline struct reset_control *__of_reset_control_get(
59 struct device_node *node,
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +000060 const char *id, int index, bool shared,
61 bool optional)
Axel Lin5bcd0b72015-09-01 07:56:38 +080062{
Philipp Zabel7be26002017-03-20 11:25:16 +010063 return optional ? NULL : ERR_PTR(-ENOTSUPP);
Axel Lin5bcd0b72015-09-01 07:56:38 +080064}
65
Philipp Zabelee6e7fb2016-02-05 13:41:39 +010066static inline struct reset_control *__reset_control_get(
67 struct device *dev, const char *id,
68 int index, bool shared, bool optional)
69{
70 return optional ? NULL : ERR_PTR(-ENOTSUPP);
71}
72
Hans de Goede6c96f052016-02-23 18:46:24 +010073static inline struct reset_control *__devm_reset_control_get(
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +000074 struct device *dev, const char *id,
75 int index, bool shared, bool optional)
Hans de Goede6c96f052016-02-23 18:46:24 +010076{
Philipp Zabel7be26002017-03-20 11:25:16 +010077 return optional ? NULL : ERR_PTR(-ENOTSUPP);
Hans de Goede6c96f052016-02-23 18:46:24 +010078}
79
80#endif /* CONFIG_RESET_CONTROLLER */
81
Masahiro Yamadaf109deb2017-10-29 01:50:06 +090082static inline int __must_check device_reset(struct device *dev)
83{
84 return __device_reset(dev, false);
85}
86
87static inline int device_reset_optional(struct device *dev)
88{
89 return __device_reset(dev, true);
90}
91
Hans de Goede6c96f052016-02-23 18:46:24 +010092/**
Lee Jonesa53e35d2016-06-06 16:56:50 +010093 * reset_control_get_exclusive - Lookup and obtain an exclusive reference
94 * to a reset controller.
Hans de Goede6c96f052016-02-23 18:46:24 +010095 * @dev: device to be reset by the controller
96 * @id: reset line name
97 *
98 * Returns a struct reset_control or IS_ERR() condition containing errno.
Hans de Goede0b522972016-02-23 18:46:26 +010099 * If this function is called more then once for the same reset_control it will
100 * return -EBUSY.
101 *
102 * See reset_control_get_shared for details on shared references to
103 * reset-controls.
Hans de Goede6c96f052016-02-23 18:46:24 +0100104 *
105 * Use of id names is optional.
106 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100107static inline struct reset_control *
108__must_check reset_control_get_exclusive(struct device *dev, const char *id)
Axel Lin5bcd0b72015-09-01 07:56:38 +0800109{
Hans de Goede6c96f052016-02-23 18:46:24 +0100110#ifndef CONFIG_RESET_CONTROLLER
Axel Lin5bcd0b72015-09-01 07:56:38 +0800111 WARN_ON(1);
Hans de Goede6c96f052016-02-23 18:46:24 +0100112#endif
Philipp Zabelee6e7fb2016-02-05 13:41:39 +0100113 return __reset_control_get(dev, id, 0, false, false);
Axel Lin5bcd0b72015-09-01 07:56:38 +0800114}
115
Hans de Goede6c96f052016-02-23 18:46:24 +0100116/**
Hans de Goede0b522972016-02-23 18:46:26 +0100117 * reset_control_get_shared - Lookup and obtain a shared reference to a
118 * reset controller.
119 * @dev: device to be reset by the controller
120 * @id: reset line name
121 *
122 * Returns a struct reset_control or IS_ERR() condition containing errno.
123 * This function is intended for use with reset-controls which are shared
124 * between hardware-blocks.
125 *
126 * When a reset-control is shared, the behavior of reset_control_assert /
127 * deassert is changed, the reset-core will keep track of a deassert_count
128 * and only (re-)assert the reset after reset_control_assert has been called
129 * as many times as reset_control_deassert was called. Also see the remark
130 * about shared reset-controls in the reset_control_assert docs.
131 *
132 * Calling reset_control_assert without first calling reset_control_deassert
133 * is not allowed on a shared reset control. Calling reset_control_reset is
134 * also not allowed on a shared reset control.
135 *
136 * Use of id names is optional.
137 */
138static inline struct reset_control *reset_control_get_shared(
139 struct device *dev, const char *id)
140{
Philipp Zabelee6e7fb2016-02-05 13:41:39 +0100141 return __reset_control_get(dev, id, 0, true, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100142}
143
Lee Jonesa53e35d2016-06-06 16:56:50 +0100144static inline struct reset_control *reset_control_get_optional_exclusive(
Lee Jones3c35f6e2016-06-06 16:56:49 +0100145 struct device *dev, const char *id)
146{
Philipp Zabelee6e7fb2016-02-05 13:41:39 +0100147 return __reset_control_get(dev, id, 0, false, true);
Lee Jones3c35f6e2016-06-06 16:56:49 +0100148}
149
Lee Jonesc33d61a2016-06-06 16:56:52 +0100150static inline struct reset_control *reset_control_get_optional_shared(
151 struct device *dev, const char *id)
152{
Philipp Zabelee6e7fb2016-02-05 13:41:39 +0100153 return __reset_control_get(dev, id, 0, true, true);
Lee Jonesc33d61a2016-06-06 16:56:52 +0100154}
155
Hans de Goede0b522972016-02-23 18:46:26 +0100156/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100157 * of_reset_control_get_exclusive - Lookup and obtain an exclusive reference
158 * to a reset controller.
Hans de Goede6c96f052016-02-23 18:46:24 +0100159 * @node: device to be reset by the controller
160 * @id: reset line name
161 *
162 * Returns a struct reset_control or IS_ERR() condition containing errno.
163 *
164 * Use of id names is optional.
165 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100166static inline struct reset_control *of_reset_control_get_exclusive(
Hans de Goede6c96f052016-02-23 18:46:24 +0100167 struct device_node *node, const char *id)
168{
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +0000169 return __of_reset_control_get(node, id, 0, false, false);
Hans de Goede6c96f052016-02-23 18:46:24 +0100170}
171
172/**
Lee Jones40faee82016-06-06 16:56:51 +0100173 * of_reset_control_get_shared - Lookup and obtain an shared reference
174 * to a reset controller.
175 * @node: device to be reset by the controller
176 * @id: reset line name
177 *
178 * When a reset-control is shared, the behavior of reset_control_assert /
179 * deassert is changed, the reset-core will keep track of a deassert_count
180 * and only (re-)assert the reset after reset_control_assert has been called
181 * as many times as reset_control_deassert was called. Also see the remark
182 * about shared reset-controls in the reset_control_assert docs.
183 *
184 * Calling reset_control_assert without first calling reset_control_deassert
185 * is not allowed on a shared reset control. Calling reset_control_reset is
186 * also not allowed on a shared reset control.
187 * Returns a struct reset_control or IS_ERR() condition containing errno.
188 *
189 * Use of id names is optional.
190 */
191static inline struct reset_control *of_reset_control_get_shared(
192 struct device_node *node, const char *id)
193{
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +0000194 return __of_reset_control_get(node, id, 0, true, false);
Lee Jones40faee82016-06-06 16:56:51 +0100195}
196
197/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100198 * of_reset_control_get_exclusive_by_index - Lookup and obtain an exclusive
199 * reference to a reset controller
200 * by index.
Hans de Goede6c96f052016-02-23 18:46:24 +0100201 * @node: device to be reset by the controller
202 * @index: index of the reset controller
203 *
204 * This is to be used to perform a list of resets for a device or power domain
205 * in whatever order. Returns a struct reset_control or IS_ERR() condition
206 * containing errno.
207 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100208static inline struct reset_control *of_reset_control_get_exclusive_by_index(
Hans de Goede6c96f052016-02-23 18:46:24 +0100209 struct device_node *node, int index)
210{
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +0000211 return __of_reset_control_get(node, NULL, index, false, false);
Hans de Goede6c96f052016-02-23 18:46:24 +0100212}
213
214/**
Lee Jones40faee82016-06-06 16:56:51 +0100215 * of_reset_control_get_shared_by_index - Lookup and obtain an shared
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 * When a reset-control is shared, the behavior of reset_control_assert /
222 * deassert is changed, the reset-core will keep track of a deassert_count
223 * and only (re-)assert the reset after reset_control_assert has been called
224 * as many times as reset_control_deassert was called. Also see the remark
225 * about shared reset-controls in the reset_control_assert docs.
226 *
227 * Calling reset_control_assert without first calling reset_control_deassert
228 * is not allowed on a shared reset control. Calling reset_control_reset is
229 * also not allowed on a shared reset control.
230 * Returns a struct reset_control or IS_ERR() condition containing errno.
231 *
232 * This is to be used to perform a list of resets for a device or power domain
233 * in whatever order. Returns a struct reset_control or IS_ERR() condition
234 * containing errno.
235 */
236static inline struct reset_control *of_reset_control_get_shared_by_index(
237 struct device_node *node, int index)
238{
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +0000239 return __of_reset_control_get(node, NULL, index, true, false);
Lee Jones40faee82016-06-06 16:56:51 +0100240}
241
242/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100243 * devm_reset_control_get_exclusive - resource managed
244 * reset_control_get_exclusive()
Hans de Goede6c96f052016-02-23 18:46:24 +0100245 * @dev: device to be reset by the controller
246 * @id: reset line name
247 *
Lee Jonesa53e35d2016-06-06 16:56:50 +0100248 * Managed reset_control_get_exclusive(). For reset controllers returned
249 * from this function, reset_control_put() is called automatically on driver
250 * detach.
251 *
252 * See reset_control_get_exclusive() for more information.
Hans de Goede6c96f052016-02-23 18:46:24 +0100253 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100254static inline struct reset_control *
255__must_check devm_reset_control_get_exclusive(struct device *dev,
256 const char *id)
Hans de Goede6c96f052016-02-23 18:46:24 +0100257{
258#ifndef CONFIG_RESET_CONTROLLER
259 WARN_ON(1);
260#endif
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +0000261 return __devm_reset_control_get(dev, id, 0, false, false);
Philipp Zabelb4240802014-03-07 15:18:47 +0100262}
263
Hans de Goede0b522972016-02-23 18:46:26 +0100264/**
265 * devm_reset_control_get_shared - resource managed reset_control_get_shared()
266 * @dev: device to be reset by the controller
267 * @id: reset line name
268 *
269 * Managed reset_control_get_shared(). For reset controllers returned from
270 * this function, reset_control_put() is called automatically on driver detach.
271 * See reset_control_get_shared() for more information.
272 */
273static inline struct reset_control *devm_reset_control_get_shared(
274 struct device *dev, const char *id)
275{
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +0000276 return __devm_reset_control_get(dev, id, 0, true, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100277}
278
Lee Jonesa53e35d2016-06-06 16:56:50 +0100279static inline struct reset_control *devm_reset_control_get_optional_exclusive(
Philipp Zabelb4240802014-03-07 15:18:47 +0100280 struct device *dev, const char *id)
281{
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +0000282 return __devm_reset_control_get(dev, id, 0, false, true);
Philipp Zabelb4240802014-03-07 15:18:47 +0100283}
284
Lee Jonesc33d61a2016-06-06 16:56:52 +0100285static inline struct reset_control *devm_reset_control_get_optional_shared(
286 struct device *dev, const char *id)
287{
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +0000288 return __devm_reset_control_get(dev, id, 0, true, true);
Lee Jonesc33d61a2016-06-06 16:56:52 +0100289}
290
Hans de Goede6c96f052016-02-23 18:46:24 +0100291/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100292 * devm_reset_control_get_exclusive_by_index - resource managed
293 * reset_control_get_exclusive()
Hans de Goede6c96f052016-02-23 18:46:24 +0100294 * @dev: device to be reset by the controller
295 * @index: index of the reset controller
296 *
Lee Jonesa53e35d2016-06-06 16:56:50 +0100297 * Managed reset_control_get_exclusive(). For reset controllers returned from
298 * this function, reset_control_put() is called automatically on driver
299 * detach.
300 *
301 * See reset_control_get_exclusive() for more information.
Hans de Goede6c96f052016-02-23 18:46:24 +0100302 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100303static inline struct reset_control *
304devm_reset_control_get_exclusive_by_index(struct device *dev, int index)
Hans de Goedee3ec0a82014-04-13 14:09:15 +0200305{
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +0000306 return __devm_reset_control_get(dev, NULL, index, false, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100307}
308
Hans de Goede0b522972016-02-23 18:46:26 +0100309/**
310 * devm_reset_control_get_shared_by_index - resource managed
311 * reset_control_get_shared
312 * @dev: device to be reset by the controller
313 * @index: index of the reset controller
314 *
315 * Managed reset_control_get_shared(). For reset controllers returned from
316 * this function, reset_control_put() is called automatically on driver detach.
317 * See reset_control_get_shared() for more information.
318 */
Lee Jones0bcc0ea2016-06-06 16:56:53 +0100319static inline struct reset_control *
320devm_reset_control_get_shared_by_index(struct device *dev, int index)
Hans de Goede0b522972016-02-23 18:46:26 +0100321{
Ramiro Oliveiraca58e3b2017-01-13 17:57:41 +0000322 return __devm_reset_control_get(dev, NULL, index, true, false);
Hans de Goedee3ec0a82014-04-13 14:09:15 +0200323}
324
Lee Jonesa53e35d2016-06-06 16:56:50 +0100325/*
326 * TEMPORARY calls to use during transition:
327 *
328 * of_reset_control_get() => of_reset_control_get_exclusive()
329 *
330 * These inline function calls will be removed once all consumers
331 * have been moved over to the new explicit API.
332 */
333static inline struct reset_control *reset_control_get(
334 struct device *dev, const char *id)
335{
336 return reset_control_get_exclusive(dev, id);
337}
338
339static inline struct reset_control *reset_control_get_optional(
340 struct device *dev, const char *id)
341{
342 return reset_control_get_optional_exclusive(dev, id);
343}
344
345static inline struct reset_control *of_reset_control_get(
346 struct device_node *node, const char *id)
347{
348 return of_reset_control_get_exclusive(node, id);
349}
350
351static inline struct reset_control *of_reset_control_get_by_index(
352 struct device_node *node, int index)
353{
354 return of_reset_control_get_exclusive_by_index(node, index);
355}
356
357static inline struct reset_control *devm_reset_control_get(
358 struct device *dev, const char *id)
359{
360 return devm_reset_control_get_exclusive(dev, id);
361}
362
363static inline struct reset_control *devm_reset_control_get_optional(
364 struct device *dev, const char *id)
365{
366 return devm_reset_control_get_optional_exclusive(dev, id);
367
368}
369
370static inline struct reset_control *devm_reset_control_get_by_index(
371 struct device *dev, int index)
372{
373 return devm_reset_control_get_exclusive_by_index(dev, index);
374}
Philipp Zabel61fc4132012-11-19 17:23:13 +0100375#endif