blob: 29af6d6b2f4b8103b1afe509612b825d7a7994d9 [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
Masahiro Yamadadfc1d9b2017-10-29 01:50:08 +09005#include <linux/types.h>
Hans de Goede6c96f052016-02-23 18:46:24 +01006
Masahiro Yamadadfc1d9b2017-10-29 01:50:08 +09007struct device;
8struct device_node;
Philipp Zabel61fc4132012-11-19 17:23:13 +01009struct reset_control;
10
Philipp Zabelb4240802014-03-07 15:18:47 +010011#ifdef CONFIG_RESET_CONTROLLER
12
Philipp Zabel61fc4132012-11-19 17:23:13 +010013int reset_control_reset(struct reset_control *rstc);
14int reset_control_assert(struct reset_control *rstc);
15int reset_control_deassert(struct reset_control *rstc);
Dinh Nguyen729de412014-10-10 10:21:14 -050016int reset_control_status(struct reset_control *rstc);
Philipp Zabel61fc4132012-11-19 17:23:13 +010017
Hans de Goede6c96f052016-02-23 18:46:24 +010018struct reset_control *__of_reset_control_get(struct device_node *node,
Ramiro Oliveirabb475232017-01-13 17:57:41 +000019 const char *id, int index, bool shared,
20 bool optional);
Philipp Zabel62e24c52016-02-05 13:41:39 +010021struct reset_control *__reset_control_get(struct device *dev, const char *id,
22 int index, bool shared,
23 bool optional);
Philipp Zabel61fc4132012-11-19 17:23:13 +010024void reset_control_put(struct reset_control *rstc);
Masahiro Yamada1554bbd2017-10-29 01:50:06 +090025int __device_reset(struct device *dev, bool optional);
Hans de Goede6c96f052016-02-23 18:46:24 +010026struct reset_control *__devm_reset_control_get(struct device *dev,
Ramiro Oliveirabb475232017-01-13 17:57:41 +000027 const char *id, int index, bool shared,
28 bool optional);
Philipp Zabel61fc4132012-11-19 17:23:13 +010029
Vivek Gautam17c82e22017-05-22 16:53:25 +053030struct reset_control *devm_reset_control_array_get(struct device *dev,
31 bool shared, bool optional);
32struct reset_control *of_reset_control_array_get(struct device_node *np,
33 bool shared, bool optional);
34
Philipp Zabelb4240802014-03-07 15:18:47 +010035#else
36
37static inline int reset_control_reset(struct reset_control *rstc)
38{
Philipp Zabelb4240802014-03-07 15:18:47 +010039 return 0;
40}
41
42static inline int reset_control_assert(struct reset_control *rstc)
43{
Philipp Zabelb4240802014-03-07 15:18:47 +010044 return 0;
45}
46
47static inline int reset_control_deassert(struct reset_control *rstc)
48{
Philipp Zabelb4240802014-03-07 15:18:47 +010049 return 0;
50}
51
Dinh Nguyen729de412014-10-10 10:21:14 -050052static inline int reset_control_status(struct reset_control *rstc)
53{
Dinh Nguyen729de412014-10-10 10:21:14 -050054 return 0;
55}
56
Philipp Zabelb4240802014-03-07 15:18:47 +010057static inline void reset_control_put(struct reset_control *rstc)
58{
Philipp Zabelb4240802014-03-07 15:18:47 +010059}
60
Masahiro Yamada1554bbd2017-10-29 01:50:06 +090061static inline int __device_reset(struct device *dev, bool optional)
Daniel Lezcano41136522016-04-01 21:38:16 +020062{
Masahiro Yamada1554bbd2017-10-29 01:50:06 +090063 return optional ? 0 : -ENOTSUPP;
Philipp Zabelb4240802014-03-07 15:18:47 +010064}
65
Hans de Goede6c96f052016-02-23 18:46:24 +010066static inline struct reset_control *__of_reset_control_get(
67 struct device_node *node,
Ramiro Oliveirabb475232017-01-13 17:57:41 +000068 const char *id, int index, bool shared,
69 bool optional)
Axel Lin5bcd0b72015-09-01 07:56:38 +080070{
Philipp Zabel0ca10b62017-03-20 11:25:16 +010071 return optional ? NULL : ERR_PTR(-ENOTSUPP);
Axel Lin5bcd0b72015-09-01 07:56:38 +080072}
73
Philipp Zabel62e24c52016-02-05 13:41:39 +010074static 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
Hans de Goede6c96f052016-02-23 18:46:24 +010081static inline struct reset_control *__devm_reset_control_get(
Ramiro Oliveirabb475232017-01-13 17:57:41 +000082 struct device *dev, const char *id,
83 int index, bool shared, bool optional)
Hans de Goede6c96f052016-02-23 18:46:24 +010084{
Philipp Zabel0ca10b62017-03-20 11:25:16 +010085 return optional ? NULL : ERR_PTR(-ENOTSUPP);
Hans de Goede6c96f052016-02-23 18:46:24 +010086}
87
Vivek Gautam17c82e22017-05-22 16:53:25 +053088static inline struct reset_control *
89devm_reset_control_array_get(struct device *dev, bool shared, bool optional)
90{
91 return optional ? NULL : ERR_PTR(-ENOTSUPP);
92}
93
94static inline struct reset_control *
95of_reset_control_array_get(struct device_node *np, bool shared, bool optional)
96{
97 return optional ? NULL : ERR_PTR(-ENOTSUPP);
98}
99
Hans de Goede6c96f052016-02-23 18:46:24 +0100100#endif /* CONFIG_RESET_CONTROLLER */
101
Masahiro Yamada1554bbd2017-10-29 01:50:06 +0900102static inline int __must_check device_reset(struct device *dev)
103{
104 return __device_reset(dev, false);
105}
106
107static inline int device_reset_optional(struct device *dev)
108{
109 return __device_reset(dev, true);
110}
111
Hans de Goede6c96f052016-02-23 18:46:24 +0100112/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100113 * reset_control_get_exclusive - Lookup and obtain an exclusive reference
114 * to a reset controller.
Hans de Goede6c96f052016-02-23 18:46:24 +0100115 * @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.
Geert Uytterhoeven34845c92018-09-26 15:20:03 +0200119 * If this function is called more than once for the same reset_control it will
Hans de Goede0b522972016-02-23 18:46:26 +0100120 * return -EBUSY.
121 *
122 * See reset_control_get_shared for details on shared references to
123 * reset-controls.
Hans de Goede6c96f052016-02-23 18:46:24 +0100124 *
125 * Use of id names is optional.
126 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100127static inline struct reset_control *
128__must_check reset_control_get_exclusive(struct device *dev, const char *id)
Axel Lin5bcd0b72015-09-01 07:56:38 +0800129{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100130 return __reset_control_get(dev, id, 0, false, false);
Axel Lin5bcd0b72015-09-01 07:56:38 +0800131}
132
Hans de Goede6c96f052016-02-23 18:46:24 +0100133/**
Hans de Goede0b522972016-02-23 18:46:26 +0100134 * 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 */
155static inline struct reset_control *reset_control_get_shared(
156 struct device *dev, const char *id)
157{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100158 return __reset_control_get(dev, id, 0, true, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100159}
160
Lee Jonesa53e35d2016-06-06 16:56:50 +0100161static inline struct reset_control *reset_control_get_optional_exclusive(
Lee Jones3c35f6e2016-06-06 16:56:49 +0100162 struct device *dev, const char *id)
163{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100164 return __reset_control_get(dev, id, 0, false, true);
Lee Jones3c35f6e2016-06-06 16:56:49 +0100165}
166
Lee Jonesc33d61a2016-06-06 16:56:52 +0100167static inline struct reset_control *reset_control_get_optional_shared(
168 struct device *dev, const char *id)
169{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100170 return __reset_control_get(dev, id, 0, true, true);
Lee Jonesc33d61a2016-06-06 16:56:52 +0100171}
172
Hans de Goede0b522972016-02-23 18:46:26 +0100173/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100174 * of_reset_control_get_exclusive - Lookup and obtain an exclusive reference
175 * to a reset controller.
Hans de Goede6c96f052016-02-23 18:46:24 +0100176 * @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 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100183static inline struct reset_control *of_reset_control_get_exclusive(
Hans de Goede6c96f052016-02-23 18:46:24 +0100184 struct device_node *node, const char *id)
185{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000186 return __of_reset_control_get(node, id, 0, false, false);
Hans de Goede6c96f052016-02-23 18:46:24 +0100187}
188
189/**
Lee Jones40faee8e2016-06-06 16:56:51 +0100190 * 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 */
208static inline struct reset_control *of_reset_control_get_shared(
209 struct device_node *node, const char *id)
210{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000211 return __of_reset_control_get(node, id, 0, true, false);
Lee Jones40faee8e2016-06-06 16:56:51 +0100212}
213
214/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100215 * of_reset_control_get_exclusive_by_index - Lookup and obtain an exclusive
216 * reference to a reset controller
217 * by index.
Hans de Goede6c96f052016-02-23 18:46:24 +0100218 * @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 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100225static inline struct reset_control *of_reset_control_get_exclusive_by_index(
Hans de Goede6c96f052016-02-23 18:46:24 +0100226 struct device_node *node, int index)
227{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000228 return __of_reset_control_get(node, NULL, index, false, false);
Hans de Goede6c96f052016-02-23 18:46:24 +0100229}
230
231/**
Lee Jones40faee8e2016-06-06 16:56:51 +0100232 * 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 */
253static inline struct reset_control *of_reset_control_get_shared_by_index(
254 struct device_node *node, int index)
255{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000256 return __of_reset_control_get(node, NULL, index, true, false);
Lee Jones40faee8e2016-06-06 16:56:51 +0100257}
258
259/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100260 * devm_reset_control_get_exclusive - resource managed
261 * reset_control_get_exclusive()
Hans de Goede6c96f052016-02-23 18:46:24 +0100262 * @dev: device to be reset by the controller
263 * @id: reset line name
264 *
Lee Jonesa53e35d2016-06-06 16:56:50 +0100265 * 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.
Hans de Goede6c96f052016-02-23 18:46:24 +0100270 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100271static inline struct reset_control *
272__must_check devm_reset_control_get_exclusive(struct device *dev,
273 const char *id)
Hans de Goede6c96f052016-02-23 18:46:24 +0100274{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000275 return __devm_reset_control_get(dev, id, 0, false, false);
Philipp Zabelb4240802014-03-07 15:18:47 +0100276}
277
Hans de Goede0b522972016-02-23 18:46:26 +0100278/**
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 */
287static inline struct reset_control *devm_reset_control_get_shared(
288 struct device *dev, const char *id)
289{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000290 return __devm_reset_control_get(dev, id, 0, true, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100291}
292
Lee Jonesa53e35d2016-06-06 16:56:50 +0100293static inline struct reset_control *devm_reset_control_get_optional_exclusive(
Philipp Zabelb4240802014-03-07 15:18:47 +0100294 struct device *dev, const char *id)
295{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000296 return __devm_reset_control_get(dev, id, 0, false, true);
Philipp Zabelb4240802014-03-07 15:18:47 +0100297}
298
Lee Jonesc33d61a2016-06-06 16:56:52 +0100299static inline struct reset_control *devm_reset_control_get_optional_shared(
300 struct device *dev, const char *id)
301{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000302 return __devm_reset_control_get(dev, id, 0, true, true);
Lee Jonesc33d61a2016-06-06 16:56:52 +0100303}
304
Hans de Goede6c96f052016-02-23 18:46:24 +0100305/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100306 * devm_reset_control_get_exclusive_by_index - resource managed
307 * reset_control_get_exclusive()
Hans de Goede6c96f052016-02-23 18:46:24 +0100308 * @dev: device to be reset by the controller
309 * @index: index of the reset controller
310 *
Lee Jonesa53e35d2016-06-06 16:56:50 +0100311 * 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.
Hans de Goede6c96f052016-02-23 18:46:24 +0100316 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100317static inline struct reset_control *
318devm_reset_control_get_exclusive_by_index(struct device *dev, int index)
Hans de Goedee3ec0a82014-04-13 14:09:15 +0200319{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000320 return __devm_reset_control_get(dev, NULL, index, false, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100321}
322
Hans de Goede0b522972016-02-23 18:46:26 +0100323/**
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 */
Lee Jones0bcc0ea2016-06-06 16:56:53 +0100333static inline struct reset_control *
334devm_reset_control_get_shared_by_index(struct device *dev, int index)
Hans de Goede0b522972016-02-23 18:46:26 +0100335{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000336 return __devm_reset_control_get(dev, NULL, index, true, false);
Hans de Goedee3ec0a82014-04-13 14:09:15 +0200337}
338
Lee Jonesa53e35d2016-06-06 16:56:50 +0100339/*
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 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100347static 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
353static 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
359static 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
365static 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
372static 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}
Vivek Gautam17c82e22017-05-22 16:53:25 +0530377
378/*
379 * APIs to manage a list of reset controllers
380 */
381static inline struct reset_control *
382devm_reset_control_array_get_exclusive(struct device *dev)
383{
384 return devm_reset_control_array_get(dev, false, false);
385}
386
387static inline struct reset_control *
388devm_reset_control_array_get_shared(struct device *dev)
389{
390 return devm_reset_control_array_get(dev, true, false);
391}
392
393static inline struct reset_control *
394devm_reset_control_array_get_optional_exclusive(struct device *dev)
395{
396 return devm_reset_control_array_get(dev, false, true);
397}
398
399static inline struct reset_control *
400devm_reset_control_array_get_optional_shared(struct device *dev)
401{
402 return devm_reset_control_array_get(dev, true, true);
403}
404
405static inline struct reset_control *
406of_reset_control_array_get_exclusive(struct device_node *node)
407{
408 return of_reset_control_array_get(node, false, false);
409}
410
411static inline struct reset_control *
412of_reset_control_array_get_shared(struct device_node *node)
413{
414 return of_reset_control_array_get(node, true, false);
415}
416
417static inline struct reset_control *
418of_reset_control_array_get_optional_exclusive(struct device_node *node)
419{
420 return of_reset_control_array_get(node, false, true);
421}
422
423static inline struct reset_control *
424of_reset_control_array_get_optional_shared(struct device_node *node)
425{
426 return of_reset_control_array_get(node, true, true);
427}
Philipp Zabel61fc4132012-11-19 17:23:13 +0100428#endif