blob: 4c7871ddf3c65365bb0609ab42a71a18edcf65a7 [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);
Hans de Goede6c96f052016-02-23 18:46:24 +010023struct reset_control *__devm_reset_control_get(struct device *dev,
Ramiro Oliveirabb475232017-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 +010027int __must_check device_reset(struct device *dev);
28
Vivek Gautam17c82e22017-05-22 16:53:25 +053029struct reset_control *devm_reset_control_array_get(struct device *dev,
30 bool shared, bool optional);
31struct reset_control *of_reset_control_array_get(struct device_node *np,
32 bool shared, bool optional);
33
Philipp Zabelb4240802014-03-07 15:18:47 +010034static inline int device_reset_optional(struct device *dev)
35{
36 return device_reset(dev);
37}
38
Philipp Zabelb4240802014-03-07 15:18:47 +010039#else
40
41static inline int reset_control_reset(struct reset_control *rstc)
42{
Philipp Zabelb4240802014-03-07 15:18:47 +010043 return 0;
44}
45
46static inline int reset_control_assert(struct reset_control *rstc)
47{
Philipp Zabelb4240802014-03-07 15:18:47 +010048 return 0;
49}
50
51static inline int reset_control_deassert(struct reset_control *rstc)
52{
Philipp Zabelb4240802014-03-07 15:18:47 +010053 return 0;
54}
55
Dinh Nguyen729de412014-10-10 10:21:14 -050056static inline int reset_control_status(struct reset_control *rstc)
57{
Dinh Nguyen729de412014-10-10 10:21:14 -050058 return 0;
59}
60
Philipp Zabelb4240802014-03-07 15:18:47 +010061static inline void reset_control_put(struct reset_control *rstc)
62{
Philipp Zabelb4240802014-03-07 15:18:47 +010063}
64
Daniel Lezcano41136522016-04-01 21:38:16 +020065static inline int __must_check device_reset(struct device *dev)
66{
67 WARN_ON(1);
68 return -ENOTSUPP;
69}
70
Philipp Zabelb4240802014-03-07 15:18:47 +010071static inline int device_reset_optional(struct device *dev)
72{
Philipp Zabel39b4da72015-10-29 09:55:00 +010073 return -ENOTSUPP;
Philipp Zabelb4240802014-03-07 15:18:47 +010074}
75
Hans de Goede6c96f052016-02-23 18:46:24 +010076static inline struct reset_control *__of_reset_control_get(
77 struct device_node *node,
Ramiro Oliveirabb475232017-01-13 17:57:41 +000078 const char *id, int index, bool shared,
79 bool optional)
Axel Lin5bcd0b72015-09-01 07:56:38 +080080{
Philipp Zabel0ca10b62017-03-20 11:25:16 +010081 return optional ? NULL : ERR_PTR(-ENOTSUPP);
Axel Lin5bcd0b72015-09-01 07:56:38 +080082}
83
Philipp Zabel62e24c52016-02-05 13:41:39 +010084static inline struct reset_control *__reset_control_get(
85 struct device *dev, const char *id,
86 int index, bool shared, bool optional)
87{
88 return optional ? NULL : ERR_PTR(-ENOTSUPP);
89}
90
Hans de Goede6c96f052016-02-23 18:46:24 +010091static inline struct reset_control *__devm_reset_control_get(
Ramiro Oliveirabb475232017-01-13 17:57:41 +000092 struct device *dev, const char *id,
93 int index, bool shared, bool optional)
Hans de Goede6c96f052016-02-23 18:46:24 +010094{
Philipp Zabel0ca10b62017-03-20 11:25:16 +010095 return optional ? NULL : ERR_PTR(-ENOTSUPP);
Hans de Goede6c96f052016-02-23 18:46:24 +010096}
97
Vivek Gautam17c82e22017-05-22 16:53:25 +053098static inline struct reset_control *
99devm_reset_control_array_get(struct device *dev, bool shared, bool optional)
100{
101 return optional ? NULL : ERR_PTR(-ENOTSUPP);
102}
103
104static inline struct reset_control *
105of_reset_control_array_get(struct device_node *np, bool shared, bool optional)
106{
107 return optional ? NULL : ERR_PTR(-ENOTSUPP);
108}
109
Hans de Goede6c96f052016-02-23 18:46:24 +0100110#endif /* CONFIG_RESET_CONTROLLER */
111
112/**
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.
Hans de Goede0b522972016-02-23 18:46:26 +0100119 * 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.
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{
Hans de Goede6c96f052016-02-23 18:46:24 +0100130#ifndef CONFIG_RESET_CONTROLLER
Axel Lin5bcd0b72015-09-01 07:56:38 +0800131 WARN_ON(1);
Hans de Goede6c96f052016-02-23 18:46:24 +0100132#endif
Philipp Zabel62e24c52016-02-05 13:41:39 +0100133 return __reset_control_get(dev, id, 0, false, false);
Axel Lin5bcd0b72015-09-01 07:56:38 +0800134}
135
Hans de Goede6c96f052016-02-23 18:46:24 +0100136/**
Hans de Goede0b522972016-02-23 18:46:26 +0100137 * reset_control_get_shared - Lookup and obtain a shared reference to a
138 * reset controller.
139 * @dev: device to be reset by the controller
140 * @id: reset line name
141 *
142 * Returns a struct reset_control or IS_ERR() condition containing errno.
143 * This function is intended for use with reset-controls which are shared
144 * between hardware-blocks.
145 *
146 * When a reset-control is shared, the behavior of reset_control_assert /
147 * deassert is changed, the reset-core will keep track of a deassert_count
148 * and only (re-)assert the reset after reset_control_assert has been called
149 * as many times as reset_control_deassert was called. Also see the remark
150 * about shared reset-controls in the reset_control_assert docs.
151 *
152 * Calling reset_control_assert without first calling reset_control_deassert
153 * is not allowed on a shared reset control. Calling reset_control_reset is
154 * also not allowed on a shared reset control.
155 *
156 * Use of id names is optional.
157 */
158static inline struct reset_control *reset_control_get_shared(
159 struct device *dev, const char *id)
160{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100161 return __reset_control_get(dev, id, 0, true, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100162}
163
Lee Jonesa53e35d2016-06-06 16:56:50 +0100164static inline struct reset_control *reset_control_get_optional_exclusive(
Lee Jones3c35f6e2016-06-06 16:56:49 +0100165 struct device *dev, const char *id)
166{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100167 return __reset_control_get(dev, id, 0, false, true);
Lee Jones3c35f6e2016-06-06 16:56:49 +0100168}
169
Lee Jonesc33d61a2016-06-06 16:56:52 +0100170static inline struct reset_control *reset_control_get_optional_shared(
171 struct device *dev, const char *id)
172{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100173 return __reset_control_get(dev, id, 0, true, true);
Lee Jonesc33d61a2016-06-06 16:56:52 +0100174}
175
Hans de Goede0b522972016-02-23 18:46:26 +0100176/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100177 * of_reset_control_get_exclusive - Lookup and obtain an exclusive reference
178 * to a reset controller.
Hans de Goede6c96f052016-02-23 18:46:24 +0100179 * @node: device to be reset by the controller
180 * @id: reset line name
181 *
182 * Returns a struct reset_control or IS_ERR() condition containing errno.
183 *
184 * Use of id names is optional.
185 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100186static inline struct reset_control *of_reset_control_get_exclusive(
Hans de Goede6c96f052016-02-23 18:46:24 +0100187 struct device_node *node, const char *id)
188{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000189 return __of_reset_control_get(node, id, 0, false, false);
Hans de Goede6c96f052016-02-23 18:46:24 +0100190}
191
192/**
Lee Jones40faee8e2016-06-06 16:56:51 +0100193 * of_reset_control_get_shared - Lookup and obtain an shared reference
194 * to a reset controller.
195 * @node: device to be reset by the controller
196 * @id: reset line name
197 *
198 * When a reset-control is shared, the behavior of reset_control_assert /
199 * deassert is changed, the reset-core will keep track of a deassert_count
200 * and only (re-)assert the reset after reset_control_assert has been called
201 * as many times as reset_control_deassert was called. Also see the remark
202 * about shared reset-controls in the reset_control_assert docs.
203 *
204 * Calling reset_control_assert without first calling reset_control_deassert
205 * is not allowed on a shared reset control. Calling reset_control_reset is
206 * also not allowed on a shared reset control.
207 * Returns a struct reset_control or IS_ERR() condition containing errno.
208 *
209 * Use of id names is optional.
210 */
211static inline struct reset_control *of_reset_control_get_shared(
212 struct device_node *node, const char *id)
213{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000214 return __of_reset_control_get(node, id, 0, true, false);
Lee Jones40faee8e2016-06-06 16:56:51 +0100215}
216
217/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100218 * of_reset_control_get_exclusive_by_index - Lookup and obtain an exclusive
219 * reference to a reset controller
220 * by index.
Hans de Goede6c96f052016-02-23 18:46:24 +0100221 * @node: device to be reset by the controller
222 * @index: index of the reset controller
223 *
224 * This is to be used to perform a list of resets for a device or power domain
225 * in whatever order. Returns a struct reset_control or IS_ERR() condition
226 * containing errno.
227 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100228static inline struct reset_control *of_reset_control_get_exclusive_by_index(
Hans de Goede6c96f052016-02-23 18:46:24 +0100229 struct device_node *node, int index)
230{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000231 return __of_reset_control_get(node, NULL, index, false, false);
Hans de Goede6c96f052016-02-23 18:46:24 +0100232}
233
234/**
Lee Jones40faee8e2016-06-06 16:56:51 +0100235 * of_reset_control_get_shared_by_index - Lookup and obtain an shared
236 * reference to a reset controller
237 * by index.
238 * @node: device to be reset by the controller
239 * @index: index of the reset controller
240 *
241 * When a reset-control is shared, the behavior of reset_control_assert /
242 * deassert is changed, the reset-core will keep track of a deassert_count
243 * and only (re-)assert the reset after reset_control_assert has been called
244 * as many times as reset_control_deassert was called. Also see the remark
245 * about shared reset-controls in the reset_control_assert docs.
246 *
247 * Calling reset_control_assert without first calling reset_control_deassert
248 * is not allowed on a shared reset control. Calling reset_control_reset is
249 * also not allowed on a shared reset control.
250 * Returns a struct reset_control or IS_ERR() condition containing errno.
251 *
252 * This is to be used to perform a list of resets for a device or power domain
253 * in whatever order. Returns a struct reset_control or IS_ERR() condition
254 * containing errno.
255 */
256static inline struct reset_control *of_reset_control_get_shared_by_index(
257 struct device_node *node, int index)
258{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000259 return __of_reset_control_get(node, NULL, index, true, false);
Lee Jones40faee8e2016-06-06 16:56:51 +0100260}
261
262/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100263 * devm_reset_control_get_exclusive - resource managed
264 * reset_control_get_exclusive()
Hans de Goede6c96f052016-02-23 18:46:24 +0100265 * @dev: device to be reset by the controller
266 * @id: reset line name
267 *
Lee Jonesa53e35d2016-06-06 16:56:50 +0100268 * Managed reset_control_get_exclusive(). For reset controllers returned
269 * from this function, reset_control_put() is called automatically on driver
270 * detach.
271 *
272 * See reset_control_get_exclusive() for more information.
Hans de Goede6c96f052016-02-23 18:46:24 +0100273 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100274static inline struct reset_control *
275__must_check devm_reset_control_get_exclusive(struct device *dev,
276 const char *id)
Hans de Goede6c96f052016-02-23 18:46:24 +0100277{
278#ifndef CONFIG_RESET_CONTROLLER
279 WARN_ON(1);
280#endif
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000281 return __devm_reset_control_get(dev, id, 0, false, false);
Philipp Zabelb4240802014-03-07 15:18:47 +0100282}
283
Hans de Goede0b522972016-02-23 18:46:26 +0100284/**
285 * devm_reset_control_get_shared - resource managed reset_control_get_shared()
286 * @dev: device to be reset by the controller
287 * @id: reset line name
288 *
289 * Managed reset_control_get_shared(). For reset controllers returned from
290 * this function, reset_control_put() is called automatically on driver detach.
291 * See reset_control_get_shared() for more information.
292 */
293static inline struct reset_control *devm_reset_control_get_shared(
294 struct device *dev, const char *id)
295{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000296 return __devm_reset_control_get(dev, id, 0, true, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100297}
298
Lee Jonesa53e35d2016-06-06 16:56:50 +0100299static inline struct reset_control *devm_reset_control_get_optional_exclusive(
Philipp Zabelb4240802014-03-07 15:18:47 +0100300 struct device *dev, const char *id)
301{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000302 return __devm_reset_control_get(dev, id, 0, false, true);
Philipp Zabelb4240802014-03-07 15:18:47 +0100303}
304
Lee Jonesc33d61a2016-06-06 16:56:52 +0100305static inline struct reset_control *devm_reset_control_get_optional_shared(
306 struct device *dev, const char *id)
307{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000308 return __devm_reset_control_get(dev, id, 0, true, true);
Lee Jonesc33d61a2016-06-06 16:56:52 +0100309}
310
Hans de Goede6c96f052016-02-23 18:46:24 +0100311/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100312 * devm_reset_control_get_exclusive_by_index - resource managed
313 * reset_control_get_exclusive()
Hans de Goede6c96f052016-02-23 18:46:24 +0100314 * @dev: device to be reset by the controller
315 * @index: index of the reset controller
316 *
Lee Jonesa53e35d2016-06-06 16:56:50 +0100317 * Managed reset_control_get_exclusive(). For reset controllers returned from
318 * this function, reset_control_put() is called automatically on driver
319 * detach.
320 *
321 * See reset_control_get_exclusive() for more information.
Hans de Goede6c96f052016-02-23 18:46:24 +0100322 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100323static inline struct reset_control *
324devm_reset_control_get_exclusive_by_index(struct device *dev, int index)
Hans de Goedee3ec0a82014-04-13 14:09:15 +0200325{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000326 return __devm_reset_control_get(dev, NULL, index, false, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100327}
328
Hans de Goede0b522972016-02-23 18:46:26 +0100329/**
330 * devm_reset_control_get_shared_by_index - resource managed
331 * reset_control_get_shared
332 * @dev: device to be reset by the controller
333 * @index: index of the reset controller
334 *
335 * Managed reset_control_get_shared(). For reset controllers returned from
336 * this function, reset_control_put() is called automatically on driver detach.
337 * See reset_control_get_shared() for more information.
338 */
Lee Jones0bcc0ea2016-06-06 16:56:53 +0100339static inline struct reset_control *
340devm_reset_control_get_shared_by_index(struct device *dev, int index)
Hans de Goede0b522972016-02-23 18:46:26 +0100341{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000342 return __devm_reset_control_get(dev, NULL, index, true, false);
Hans de Goedee3ec0a82014-04-13 14:09:15 +0200343}
344
Lee Jonesa53e35d2016-06-06 16:56:50 +0100345/*
346 * TEMPORARY calls to use during transition:
347 *
348 * of_reset_control_get() => of_reset_control_get_exclusive()
349 *
350 * These inline function calls will be removed once all consumers
351 * have been moved over to the new explicit API.
352 */
353static inline struct reset_control *reset_control_get(
354 struct device *dev, const char *id)
355{
356 return reset_control_get_exclusive(dev, id);
357}
358
359static inline struct reset_control *reset_control_get_optional(
360 struct device *dev, const char *id)
361{
362 return reset_control_get_optional_exclusive(dev, id);
363}
364
365static inline struct reset_control *of_reset_control_get(
366 struct device_node *node, const char *id)
367{
368 return of_reset_control_get_exclusive(node, id);
369}
370
371static inline struct reset_control *of_reset_control_get_by_index(
372 struct device_node *node, int index)
373{
374 return of_reset_control_get_exclusive_by_index(node, index);
375}
376
377static inline struct reset_control *devm_reset_control_get(
378 struct device *dev, const char *id)
379{
380 return devm_reset_control_get_exclusive(dev, id);
381}
382
383static inline struct reset_control *devm_reset_control_get_optional(
384 struct device *dev, const char *id)
385{
386 return devm_reset_control_get_optional_exclusive(dev, id);
387
388}
389
390static inline struct reset_control *devm_reset_control_get_by_index(
391 struct device *dev, int index)
392{
393 return devm_reset_control_get_exclusive_by_index(dev, index);
394}
Vivek Gautam17c82e22017-05-22 16:53:25 +0530395
396/*
397 * APIs to manage a list of reset controllers
398 */
399static inline struct reset_control *
400devm_reset_control_array_get_exclusive(struct device *dev)
401{
402 return devm_reset_control_array_get(dev, false, false);
403}
404
405static inline struct reset_control *
406devm_reset_control_array_get_shared(struct device *dev)
407{
408 return devm_reset_control_array_get(dev, true, false);
409}
410
411static inline struct reset_control *
412devm_reset_control_array_get_optional_exclusive(struct device *dev)
413{
414 return devm_reset_control_array_get(dev, false, true);
415}
416
417static inline struct reset_control *
418devm_reset_control_array_get_optional_shared(struct device *dev)
419{
420 return devm_reset_control_array_get(dev, true, true);
421}
422
423static inline struct reset_control *
424of_reset_control_array_get_exclusive(struct device_node *node)
425{
426 return of_reset_control_array_get(node, false, false);
427}
428
429static inline struct reset_control *
430of_reset_control_array_get_shared(struct device_node *node)
431{
432 return of_reset_control_array_get(node, true, false);
433}
434
435static inline struct reset_control *
436of_reset_control_array_get_optional_exclusive(struct device_node *node)
437{
438 return of_reset_control_array_get(node, false, true);
439}
440
441static inline struct reset_control *
442of_reset_control_array_get_optional_shared(struct device_node *node)
443{
444 return of_reset_control_array_get(node, true, true);
445}
Philipp Zabel61fc4132012-11-19 17:23:13 +0100446#endif