blob: b681019fc04cd5fe19cc51e465bd1d2af3c21d80 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Philipp Zabel61fc4132012-11-19 17:23:13 +01002#ifndef _LINUX_RESET_H_
3#define _LINUX_RESET_H_
4
Hans de Goede6c96f052016-02-23 18:46:24 +01005#include <linux/device.h>
6
Philipp Zabel61fc4132012-11-19 17:23:13 +01007struct reset_control;
8
Philipp Zabelb4240802014-03-07 15:18:47 +01009#ifdef CONFIG_RESET_CONTROLLER
10
Philipp Zabel61fc4132012-11-19 17:23:13 +010011int reset_control_reset(struct reset_control *rstc);
12int reset_control_assert(struct reset_control *rstc);
13int reset_control_deassert(struct reset_control *rstc);
Dinh Nguyen729de412014-10-10 10:21:14 -050014int reset_control_status(struct reset_control *rstc);
Philipp Zabel61fc4132012-11-19 17:23:13 +010015
Hans de Goede6c96f052016-02-23 18:46:24 +010016struct reset_control *__of_reset_control_get(struct device_node *node,
Ramiro Oliveirabb475232017-01-13 17:57:41 +000017 const char *id, int index, bool shared,
18 bool optional);
Philipp Zabel62e24c52016-02-05 13:41:39 +010019struct reset_control *__reset_control_get(struct device *dev, const char *id,
20 int index, bool shared,
21 bool optional);
Philipp Zabel61fc4132012-11-19 17:23:13 +010022void reset_control_put(struct reset_control *rstc);
Masahiro Yamada1554bbd2017-10-29 01:50:06 +090023int __device_reset(struct device *dev, bool optional);
Hans de Goede6c96f052016-02-23 18:46:24 +010024struct reset_control *__devm_reset_control_get(struct device *dev,
Ramiro Oliveirabb475232017-01-13 17:57:41 +000025 const char *id, int index, bool shared,
26 bool optional);
Philipp Zabel61fc4132012-11-19 17:23:13 +010027
Vivek Gautam17c82e22017-05-22 16:53:25 +053028struct reset_control *devm_reset_control_array_get(struct device *dev,
29 bool shared, bool optional);
30struct reset_control *of_reset_control_array_get(struct device_node *np,
31 bool shared, bool optional);
32
Philipp Zabelb4240802014-03-07 15:18:47 +010033#else
34
35static inline int reset_control_reset(struct reset_control *rstc)
36{
Philipp Zabelb4240802014-03-07 15:18:47 +010037 return 0;
38}
39
40static inline int reset_control_assert(struct reset_control *rstc)
41{
Philipp Zabelb4240802014-03-07 15:18:47 +010042 return 0;
43}
44
45static inline int reset_control_deassert(struct reset_control *rstc)
46{
Philipp Zabelb4240802014-03-07 15:18:47 +010047 return 0;
48}
49
Dinh Nguyen729de412014-10-10 10:21:14 -050050static inline int reset_control_status(struct reset_control *rstc)
51{
Dinh Nguyen729de412014-10-10 10:21:14 -050052 return 0;
53}
54
Philipp Zabelb4240802014-03-07 15:18:47 +010055static inline void reset_control_put(struct reset_control *rstc)
56{
Philipp Zabelb4240802014-03-07 15:18:47 +010057}
58
Masahiro Yamada1554bbd2017-10-29 01:50:06 +090059static inline int __device_reset(struct device *dev, bool optional)
Daniel Lezcano41136522016-04-01 21:38:16 +020060{
Masahiro Yamada1554bbd2017-10-29 01:50:06 +090061 return optional ? 0 : -ENOTSUPP;
Philipp Zabelb4240802014-03-07 15:18:47 +010062}
63
Hans de Goede6c96f052016-02-23 18:46:24 +010064static inline struct reset_control *__of_reset_control_get(
65 struct device_node *node,
Ramiro Oliveirabb475232017-01-13 17:57:41 +000066 const char *id, int index, bool shared,
67 bool optional)
Axel Lin5bcd0b72015-09-01 07:56:38 +080068{
Philipp Zabel0ca10b62017-03-20 11:25:16 +010069 return optional ? NULL : ERR_PTR(-ENOTSUPP);
Axel Lin5bcd0b72015-09-01 07:56:38 +080070}
71
Philipp Zabel62e24c52016-02-05 13:41:39 +010072static inline struct reset_control *__reset_control_get(
73 struct device *dev, const char *id,
74 int index, bool shared, bool optional)
75{
76 return optional ? NULL : ERR_PTR(-ENOTSUPP);
77}
78
Hans de Goede6c96f052016-02-23 18:46:24 +010079static inline struct reset_control *__devm_reset_control_get(
Ramiro Oliveirabb475232017-01-13 17:57:41 +000080 struct device *dev, const char *id,
81 int index, bool shared, bool optional)
Hans de Goede6c96f052016-02-23 18:46:24 +010082{
Philipp Zabel0ca10b62017-03-20 11:25:16 +010083 return optional ? NULL : ERR_PTR(-ENOTSUPP);
Hans de Goede6c96f052016-02-23 18:46:24 +010084}
85
Vivek Gautam17c82e22017-05-22 16:53:25 +053086static inline struct reset_control *
87devm_reset_control_array_get(struct device *dev, bool shared, bool optional)
88{
89 return optional ? NULL : ERR_PTR(-ENOTSUPP);
90}
91
92static inline struct reset_control *
93of_reset_control_array_get(struct device_node *np, bool shared, bool optional)
94{
95 return optional ? NULL : ERR_PTR(-ENOTSUPP);
96}
97
Hans de Goede6c96f052016-02-23 18:46:24 +010098#endif /* CONFIG_RESET_CONTROLLER */
99
Masahiro Yamada1554bbd2017-10-29 01:50:06 +0900100static inline int __must_check device_reset(struct device *dev)
101{
102 return __device_reset(dev, false);
103}
104
105static inline int device_reset_optional(struct device *dev)
106{
107 return __device_reset(dev, true);
108}
109
Hans de Goede6c96f052016-02-23 18:46:24 +0100110/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100111 * reset_control_get_exclusive - Lookup and obtain an exclusive reference
112 * to a reset controller.
Hans de Goede6c96f052016-02-23 18:46:24 +0100113 * @dev: device to be reset by the controller
114 * @id: reset line name
115 *
116 * Returns a struct reset_control or IS_ERR() condition containing errno.
Hans de Goede0b522972016-02-23 18:46:26 +0100117 * If this function is called more then once for the same reset_control it will
118 * return -EBUSY.
119 *
120 * See reset_control_get_shared for details on shared references to
121 * reset-controls.
Hans de Goede6c96f052016-02-23 18:46:24 +0100122 *
123 * Use of id names is optional.
124 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100125static inline struct reset_control *
126__must_check reset_control_get_exclusive(struct device *dev, const char *id)
Axel Lin5bcd0b72015-09-01 07:56:38 +0800127{
Hans de Goede6c96f052016-02-23 18:46:24 +0100128#ifndef CONFIG_RESET_CONTROLLER
Axel Lin5bcd0b72015-09-01 07:56:38 +0800129 WARN_ON(1);
Hans de Goede6c96f052016-02-23 18:46:24 +0100130#endif
Philipp Zabel62e24c52016-02-05 13:41:39 +0100131 return __reset_control_get(dev, id, 0, false, false);
Axel Lin5bcd0b72015-09-01 07:56:38 +0800132}
133
Hans de Goede6c96f052016-02-23 18:46:24 +0100134/**
Hans de Goede0b522972016-02-23 18:46:26 +0100135 * reset_control_get_shared - Lookup and obtain a shared reference to a
136 * reset controller.
137 * @dev: device to be reset by the controller
138 * @id: reset line name
139 *
140 * Returns a struct reset_control or IS_ERR() condition containing errno.
141 * This function is intended for use with reset-controls which are shared
142 * between hardware-blocks.
143 *
144 * When a reset-control is shared, the behavior of reset_control_assert /
145 * deassert is changed, the reset-core will keep track of a deassert_count
146 * and only (re-)assert the reset after reset_control_assert has been called
147 * as many times as reset_control_deassert was called. Also see the remark
148 * about shared reset-controls in the reset_control_assert docs.
149 *
150 * Calling reset_control_assert without first calling reset_control_deassert
151 * is not allowed on a shared reset control. Calling reset_control_reset is
152 * also not allowed on a shared reset control.
153 *
154 * Use of id names is optional.
155 */
156static inline struct reset_control *reset_control_get_shared(
157 struct device *dev, const char *id)
158{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100159 return __reset_control_get(dev, id, 0, true, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100160}
161
Lee Jonesa53e35d2016-06-06 16:56:50 +0100162static inline struct reset_control *reset_control_get_optional_exclusive(
Lee Jones3c35f6e2016-06-06 16:56:49 +0100163 struct device *dev, const char *id)
164{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100165 return __reset_control_get(dev, id, 0, false, true);
Lee Jones3c35f6e2016-06-06 16:56:49 +0100166}
167
Lee Jonesc33d61a2016-06-06 16:56:52 +0100168static inline struct reset_control *reset_control_get_optional_shared(
169 struct device *dev, const char *id)
170{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100171 return __reset_control_get(dev, id, 0, true, true);
Lee Jonesc33d61a2016-06-06 16:56:52 +0100172}
173
Hans de Goede0b522972016-02-23 18:46:26 +0100174/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100175 * of_reset_control_get_exclusive - Lookup and obtain an exclusive reference
176 * to a reset controller.
Hans de Goede6c96f052016-02-23 18:46:24 +0100177 * @node: device to be reset by the controller
178 * @id: reset line name
179 *
180 * Returns a struct reset_control or IS_ERR() condition containing errno.
181 *
182 * Use of id names is optional.
183 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100184static inline struct reset_control *of_reset_control_get_exclusive(
Hans de Goede6c96f052016-02-23 18:46:24 +0100185 struct device_node *node, const char *id)
186{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000187 return __of_reset_control_get(node, id, 0, false, false);
Hans de Goede6c96f052016-02-23 18:46:24 +0100188}
189
190/**
Lee Jones40faee8e2016-06-06 16:56:51 +0100191 * of_reset_control_get_shared - Lookup and obtain an shared reference
192 * to a reset controller.
193 * @node: device to be reset by the controller
194 * @id: reset line name
195 *
196 * When a reset-control is shared, the behavior of reset_control_assert /
197 * deassert is changed, the reset-core will keep track of a deassert_count
198 * and only (re-)assert the reset after reset_control_assert has been called
199 * as many times as reset_control_deassert was called. Also see the remark
200 * about shared reset-controls in the reset_control_assert docs.
201 *
202 * Calling reset_control_assert without first calling reset_control_deassert
203 * is not allowed on a shared reset control. Calling reset_control_reset is
204 * also not allowed on a shared reset control.
205 * Returns a struct reset_control or IS_ERR() condition containing errno.
206 *
207 * Use of id names is optional.
208 */
209static inline struct reset_control *of_reset_control_get_shared(
210 struct device_node *node, const char *id)
211{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000212 return __of_reset_control_get(node, id, 0, true, false);
Lee Jones40faee8e2016-06-06 16:56:51 +0100213}
214
215/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100216 * of_reset_control_get_exclusive_by_index - Lookup and obtain an exclusive
217 * reference to a reset controller
218 * by index.
Hans de Goede6c96f052016-02-23 18:46:24 +0100219 * @node: device to be reset by the controller
220 * @index: index of the reset controller
221 *
222 * This is to be used to perform a list of resets for a device or power domain
223 * in whatever order. Returns a struct reset_control or IS_ERR() condition
224 * containing errno.
225 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100226static inline struct reset_control *of_reset_control_get_exclusive_by_index(
Hans de Goede6c96f052016-02-23 18:46:24 +0100227 struct device_node *node, int index)
228{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000229 return __of_reset_control_get(node, NULL, index, false, false);
Hans de Goede6c96f052016-02-23 18:46:24 +0100230}
231
232/**
Lee Jones40faee8e2016-06-06 16:56:51 +0100233 * of_reset_control_get_shared_by_index - Lookup and obtain an shared
234 * reference to a reset controller
235 * by index.
236 * @node: device to be reset by the controller
237 * @index: index of the reset controller
238 *
239 * When a reset-control is shared, the behavior of reset_control_assert /
240 * deassert is changed, the reset-core will keep track of a deassert_count
241 * and only (re-)assert the reset after reset_control_assert has been called
242 * as many times as reset_control_deassert was called. Also see the remark
243 * about shared reset-controls in the reset_control_assert docs.
244 *
245 * Calling reset_control_assert without first calling reset_control_deassert
246 * is not allowed on a shared reset control. Calling reset_control_reset is
247 * also not allowed on a shared reset control.
248 * Returns a struct reset_control or IS_ERR() condition containing errno.
249 *
250 * This is to be used to perform a list of resets for a device or power domain
251 * in whatever order. Returns a struct reset_control or IS_ERR() condition
252 * containing errno.
253 */
254static inline struct reset_control *of_reset_control_get_shared_by_index(
255 struct device_node *node, int index)
256{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000257 return __of_reset_control_get(node, NULL, index, true, false);
Lee Jones40faee8e2016-06-06 16:56:51 +0100258}
259
260/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100261 * devm_reset_control_get_exclusive - resource managed
262 * reset_control_get_exclusive()
Hans de Goede6c96f052016-02-23 18:46:24 +0100263 * @dev: device to be reset by the controller
264 * @id: reset line name
265 *
Lee Jonesa53e35d2016-06-06 16:56:50 +0100266 * Managed reset_control_get_exclusive(). For reset controllers returned
267 * from this function, reset_control_put() is called automatically on driver
268 * detach.
269 *
270 * See reset_control_get_exclusive() for more information.
Hans de Goede6c96f052016-02-23 18:46:24 +0100271 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100272static inline struct reset_control *
273__must_check devm_reset_control_get_exclusive(struct device *dev,
274 const char *id)
Hans de Goede6c96f052016-02-23 18:46:24 +0100275{
276#ifndef CONFIG_RESET_CONTROLLER
277 WARN_ON(1);
278#endif
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000279 return __devm_reset_control_get(dev, id, 0, false, false);
Philipp Zabelb4240802014-03-07 15:18:47 +0100280}
281
Hans de Goede0b522972016-02-23 18:46:26 +0100282/**
283 * devm_reset_control_get_shared - resource managed reset_control_get_shared()
284 * @dev: device to be reset by the controller
285 * @id: reset line name
286 *
287 * Managed reset_control_get_shared(). For reset controllers returned from
288 * this function, reset_control_put() is called automatically on driver detach.
289 * See reset_control_get_shared() for more information.
290 */
291static inline struct reset_control *devm_reset_control_get_shared(
292 struct device *dev, const char *id)
293{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000294 return __devm_reset_control_get(dev, id, 0, true, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100295}
296
Lee Jonesa53e35d2016-06-06 16:56:50 +0100297static inline struct reset_control *devm_reset_control_get_optional_exclusive(
Philipp Zabelb4240802014-03-07 15:18:47 +0100298 struct device *dev, const char *id)
299{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000300 return __devm_reset_control_get(dev, id, 0, false, true);
Philipp Zabelb4240802014-03-07 15:18:47 +0100301}
302
Lee Jonesc33d61a2016-06-06 16:56:52 +0100303static inline struct reset_control *devm_reset_control_get_optional_shared(
304 struct device *dev, const char *id)
305{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000306 return __devm_reset_control_get(dev, id, 0, true, true);
Lee Jonesc33d61a2016-06-06 16:56:52 +0100307}
308
Hans de Goede6c96f052016-02-23 18:46:24 +0100309/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100310 * devm_reset_control_get_exclusive_by_index - resource managed
311 * reset_control_get_exclusive()
Hans de Goede6c96f052016-02-23 18:46:24 +0100312 * @dev: device to be reset by the controller
313 * @index: index of the reset controller
314 *
Lee Jonesa53e35d2016-06-06 16:56:50 +0100315 * Managed reset_control_get_exclusive(). For reset controllers returned from
316 * this function, reset_control_put() is called automatically on driver
317 * detach.
318 *
319 * See reset_control_get_exclusive() for more information.
Hans de Goede6c96f052016-02-23 18:46:24 +0100320 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100321static inline struct reset_control *
322devm_reset_control_get_exclusive_by_index(struct device *dev, int index)
Hans de Goedee3ec0a82014-04-13 14:09:15 +0200323{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000324 return __devm_reset_control_get(dev, NULL, index, false, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100325}
326
Hans de Goede0b522972016-02-23 18:46:26 +0100327/**
328 * devm_reset_control_get_shared_by_index - resource managed
329 * reset_control_get_shared
330 * @dev: device to be reset by the controller
331 * @index: index of the reset controller
332 *
333 * Managed reset_control_get_shared(). For reset controllers returned from
334 * this function, reset_control_put() is called automatically on driver detach.
335 * See reset_control_get_shared() for more information.
336 */
Lee Jones0bcc0ea2016-06-06 16:56:53 +0100337static inline struct reset_control *
338devm_reset_control_get_shared_by_index(struct device *dev, int index)
Hans de Goede0b522972016-02-23 18:46:26 +0100339{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000340 return __devm_reset_control_get(dev, NULL, index, true, false);
Hans de Goedee3ec0a82014-04-13 14:09:15 +0200341}
342
Lee Jonesa53e35d2016-06-06 16:56:50 +0100343/*
344 * TEMPORARY calls to use during transition:
345 *
346 * of_reset_control_get() => of_reset_control_get_exclusive()
347 *
348 * These inline function calls will be removed once all consumers
349 * have been moved over to the new explicit API.
350 */
351static inline struct reset_control *reset_control_get(
352 struct device *dev, const char *id)
353{
354 return reset_control_get_exclusive(dev, id);
355}
356
357static inline struct reset_control *reset_control_get_optional(
358 struct device *dev, const char *id)
359{
360 return reset_control_get_optional_exclusive(dev, id);
361}
362
363static inline struct reset_control *of_reset_control_get(
364 struct device_node *node, const char *id)
365{
366 return of_reset_control_get_exclusive(node, id);
367}
368
369static inline struct reset_control *of_reset_control_get_by_index(
370 struct device_node *node, int index)
371{
372 return of_reset_control_get_exclusive_by_index(node, index);
373}
374
375static inline struct reset_control *devm_reset_control_get(
376 struct device *dev, const char *id)
377{
378 return devm_reset_control_get_exclusive(dev, id);
379}
380
381static inline struct reset_control *devm_reset_control_get_optional(
382 struct device *dev, const char *id)
383{
384 return devm_reset_control_get_optional_exclusive(dev, id);
385
386}
387
388static inline struct reset_control *devm_reset_control_get_by_index(
389 struct device *dev, int index)
390{
391 return devm_reset_control_get_exclusive_by_index(dev, index);
392}
Vivek Gautam17c82e22017-05-22 16:53:25 +0530393
394/*
395 * APIs to manage a list of reset controllers
396 */
397static inline struct reset_control *
398devm_reset_control_array_get_exclusive(struct device *dev)
399{
400 return devm_reset_control_array_get(dev, false, false);
401}
402
403static inline struct reset_control *
404devm_reset_control_array_get_shared(struct device *dev)
405{
406 return devm_reset_control_array_get(dev, true, false);
407}
408
409static inline struct reset_control *
410devm_reset_control_array_get_optional_exclusive(struct device *dev)
411{
412 return devm_reset_control_array_get(dev, false, true);
413}
414
415static inline struct reset_control *
416devm_reset_control_array_get_optional_shared(struct device *dev)
417{
418 return devm_reset_control_array_get(dev, true, true);
419}
420
421static inline struct reset_control *
422of_reset_control_array_get_exclusive(struct device_node *node)
423{
424 return of_reset_control_array_get(node, false, false);
425}
426
427static inline struct reset_control *
428of_reset_control_array_get_shared(struct device_node *node)
429{
430 return of_reset_control_array_get(node, true, false);
431}
432
433static inline struct reset_control *
434of_reset_control_array_get_optional_exclusive(struct device_node *node)
435{
436 return of_reset_control_array_get(node, false, true);
437}
438
439static inline struct reset_control *
440of_reset_control_array_get_optional_shared(struct device_node *node)
441{
442 return of_reset_control_array_get(node, true, true);
443}
Philipp Zabel61fc4132012-11-19 17:23:13 +0100444#endif