blob: c1901b61ca30029f7a18c16db803da875405074d [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
Geert Uytterhoeveneaf91db2018-11-13 13:47:44 +010035int reset_control_get_count(struct device *dev);
36
Philipp Zabelb4240802014-03-07 15:18:47 +010037#else
38
39static inline int reset_control_reset(struct reset_control *rstc)
40{
Philipp Zabelb4240802014-03-07 15:18:47 +010041 return 0;
42}
43
44static inline int reset_control_assert(struct reset_control *rstc)
45{
Philipp Zabelb4240802014-03-07 15:18:47 +010046 return 0;
47}
48
49static inline int reset_control_deassert(struct reset_control *rstc)
50{
Philipp Zabelb4240802014-03-07 15:18:47 +010051 return 0;
52}
53
Dinh Nguyen729de412014-10-10 10:21:14 -050054static inline int reset_control_status(struct reset_control *rstc)
55{
Dinh Nguyen729de412014-10-10 10:21:14 -050056 return 0;
57}
58
Philipp Zabelb4240802014-03-07 15:18:47 +010059static inline void reset_control_put(struct reset_control *rstc)
60{
Philipp Zabelb4240802014-03-07 15:18:47 +010061}
62
Masahiro Yamada1554bbd2017-10-29 01:50:06 +090063static inline int __device_reset(struct device *dev, bool optional)
Daniel Lezcano41136522016-04-01 21:38:16 +020064{
Masahiro Yamada1554bbd2017-10-29 01:50:06 +090065 return optional ? 0 : -ENOTSUPP;
Philipp Zabelb4240802014-03-07 15:18:47 +010066}
67
Hans de Goede6c96f052016-02-23 18:46:24 +010068static inline struct reset_control *__of_reset_control_get(
69 struct device_node *node,
Ramiro Oliveirabb475232017-01-13 17:57:41 +000070 const char *id, int index, bool shared,
71 bool optional)
Axel Lin5bcd0b72015-09-01 07:56:38 +080072{
Philipp Zabel0ca10b62017-03-20 11:25:16 +010073 return optional ? NULL : ERR_PTR(-ENOTSUPP);
Axel Lin5bcd0b72015-09-01 07:56:38 +080074}
75
Philipp Zabel62e24c52016-02-05 13:41:39 +010076static inline struct reset_control *__reset_control_get(
77 struct device *dev, const char *id,
78 int index, bool shared, bool optional)
79{
80 return optional ? NULL : ERR_PTR(-ENOTSUPP);
81}
82
Hans de Goede6c96f052016-02-23 18:46:24 +010083static inline struct reset_control *__devm_reset_control_get(
Ramiro Oliveirabb475232017-01-13 17:57:41 +000084 struct device *dev, const char *id,
85 int index, bool shared, bool optional)
Hans de Goede6c96f052016-02-23 18:46:24 +010086{
Philipp Zabel0ca10b62017-03-20 11:25:16 +010087 return optional ? NULL : ERR_PTR(-ENOTSUPP);
Hans de Goede6c96f052016-02-23 18:46:24 +010088}
89
Vivek Gautam17c82e22017-05-22 16:53:25 +053090static inline struct reset_control *
91devm_reset_control_array_get(struct device *dev, bool shared, bool optional)
92{
93 return optional ? NULL : ERR_PTR(-ENOTSUPP);
94}
95
96static inline struct reset_control *
97of_reset_control_array_get(struct device_node *np, bool shared, bool optional)
98{
99 return optional ? NULL : ERR_PTR(-ENOTSUPP);
100}
101
Geert Uytterhoeveneaf91db2018-11-13 13:47:44 +0100102static inline int reset_control_get_count(struct device *dev)
103{
104 return -ENOENT;
105}
106
Hans de Goede6c96f052016-02-23 18:46:24 +0100107#endif /* CONFIG_RESET_CONTROLLER */
108
Masahiro Yamada1554bbd2017-10-29 01:50:06 +0900109static inline int __must_check device_reset(struct device *dev)
110{
111 return __device_reset(dev, false);
112}
113
114static inline int device_reset_optional(struct device *dev)
115{
116 return __device_reset(dev, true);
117}
118
Hans de Goede6c96f052016-02-23 18:46:24 +0100119/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100120 * reset_control_get_exclusive - Lookup and obtain an exclusive reference
121 * to a reset controller.
Hans de Goede6c96f052016-02-23 18:46:24 +0100122 * @dev: device to be reset by the controller
123 * @id: reset line name
124 *
125 * Returns a struct reset_control or IS_ERR() condition containing errno.
Geert Uytterhoeven34845c92018-09-26 15:20:03 +0200126 * If this function is called more than once for the same reset_control it will
Hans de Goede0b522972016-02-23 18:46:26 +0100127 * return -EBUSY.
128 *
129 * See reset_control_get_shared for details on shared references to
130 * reset-controls.
Hans de Goede6c96f052016-02-23 18:46:24 +0100131 *
132 * Use of id names is optional.
133 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100134static inline struct reset_control *
135__must_check reset_control_get_exclusive(struct device *dev, const char *id)
Axel Lin5bcd0b72015-09-01 07:56:38 +0800136{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100137 return __reset_control_get(dev, id, 0, false, false);
Axel Lin5bcd0b72015-09-01 07:56:38 +0800138}
139
Hans de Goede6c96f052016-02-23 18:46:24 +0100140/**
Hans de Goede0b522972016-02-23 18:46:26 +0100141 * reset_control_get_shared - Lookup and obtain a shared reference to a
142 * reset controller.
143 * @dev: device to be reset by the controller
144 * @id: reset line name
145 *
146 * Returns a struct reset_control or IS_ERR() condition containing errno.
147 * This function is intended for use with reset-controls which are shared
Geert Uytterhoeven12c62b92018-10-08 13:15:43 +0200148 * between hardware blocks.
Hans de Goede0b522972016-02-23 18:46:26 +0100149 *
150 * When a reset-control is shared, the behavior of reset_control_assert /
151 * deassert is changed, the reset-core will keep track of a deassert_count
152 * and only (re-)assert the reset after reset_control_assert has been called
153 * as many times as reset_control_deassert was called. Also see the remark
154 * about shared reset-controls in the reset_control_assert docs.
155 *
156 * Calling reset_control_assert without first calling reset_control_deassert
157 * is not allowed on a shared reset control. Calling reset_control_reset is
158 * also not allowed on a shared reset control.
159 *
160 * Use of id names is optional.
161 */
162static inline struct reset_control *reset_control_get_shared(
163 struct device *dev, const char *id)
164{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100165 return __reset_control_get(dev, id, 0, true, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100166}
167
Lee Jonesa53e35d2016-06-06 16:56:50 +0100168static inline struct reset_control *reset_control_get_optional_exclusive(
Lee Jones3c35f6e2016-06-06 16:56:49 +0100169 struct device *dev, const char *id)
170{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100171 return __reset_control_get(dev, id, 0, false, true);
Lee Jones3c35f6e2016-06-06 16:56:49 +0100172}
173
Lee Jonesc33d61a2016-06-06 16:56:52 +0100174static inline struct reset_control *reset_control_get_optional_shared(
175 struct device *dev, const char *id)
176{
Philipp Zabel62e24c52016-02-05 13:41:39 +0100177 return __reset_control_get(dev, id, 0, true, true);
Lee Jonesc33d61a2016-06-06 16:56:52 +0100178}
179
Hans de Goede0b522972016-02-23 18:46:26 +0100180/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100181 * of_reset_control_get_exclusive - Lookup and obtain an exclusive reference
182 * to a reset controller.
Hans de Goede6c96f052016-02-23 18:46:24 +0100183 * @node: device to be reset by the controller
184 * @id: reset line name
185 *
186 * Returns a struct reset_control or IS_ERR() condition containing errno.
187 *
188 * Use of id names is optional.
189 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100190static inline struct reset_control *of_reset_control_get_exclusive(
Hans de Goede6c96f052016-02-23 18:46:24 +0100191 struct device_node *node, const char *id)
192{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000193 return __of_reset_control_get(node, id, 0, false, false);
Hans de Goede6c96f052016-02-23 18:46:24 +0100194}
195
196/**
Geert Uytterhoeven12c62b92018-10-08 13:15:43 +0200197 * of_reset_control_get_shared - Lookup and obtain a shared reference
Lee Jones40faee8e2016-06-06 16:56:51 +0100198 * to a reset controller.
199 * @node: device to be reset by the controller
200 * @id: reset line name
201 *
202 * When a reset-control is shared, the behavior of reset_control_assert /
203 * deassert is changed, the reset-core will keep track of a deassert_count
204 * and only (re-)assert the reset after reset_control_assert has been called
205 * as many times as reset_control_deassert was called. Also see the remark
206 * about shared reset-controls in the reset_control_assert docs.
207 *
208 * Calling reset_control_assert without first calling reset_control_deassert
209 * is not allowed on a shared reset control. Calling reset_control_reset is
210 * also not allowed on a shared reset control.
211 * Returns a struct reset_control or IS_ERR() condition containing errno.
212 *
213 * Use of id names is optional.
214 */
215static inline struct reset_control *of_reset_control_get_shared(
216 struct device_node *node, const char *id)
217{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000218 return __of_reset_control_get(node, id, 0, true, false);
Lee Jones40faee8e2016-06-06 16:56:51 +0100219}
220
221/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100222 * of_reset_control_get_exclusive_by_index - Lookup and obtain an exclusive
223 * reference to a reset controller
224 * by index.
Hans de Goede6c96f052016-02-23 18:46:24 +0100225 * @node: device to be reset by the controller
226 * @index: index of the reset controller
227 *
228 * This is to be used to perform a list of resets for a device or power domain
229 * in whatever order. Returns a struct reset_control or IS_ERR() condition
230 * containing errno.
231 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100232static inline struct reset_control *of_reset_control_get_exclusive_by_index(
Hans de Goede6c96f052016-02-23 18:46:24 +0100233 struct device_node *node, int index)
234{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000235 return __of_reset_control_get(node, NULL, index, false, false);
Hans de Goede6c96f052016-02-23 18:46:24 +0100236}
237
238/**
Geert Uytterhoeven12c62b92018-10-08 13:15:43 +0200239 * of_reset_control_get_shared_by_index - Lookup and obtain a shared
Lee Jones40faee8e2016-06-06 16:56:51 +0100240 * reference to a reset controller
241 * by index.
242 * @node: device to be reset by the controller
243 * @index: index of the reset controller
244 *
245 * When a reset-control is shared, the behavior of reset_control_assert /
246 * deassert is changed, the reset-core will keep track of a deassert_count
247 * and only (re-)assert the reset after reset_control_assert has been called
248 * as many times as reset_control_deassert was called. Also see the remark
249 * about shared reset-controls in the reset_control_assert docs.
250 *
251 * Calling reset_control_assert without first calling reset_control_deassert
252 * is not allowed on a shared reset control. Calling reset_control_reset is
253 * also not allowed on a shared reset control.
254 * Returns a struct reset_control or IS_ERR() condition containing errno.
255 *
256 * This is to be used to perform a list of resets for a device or power domain
257 * in whatever order. Returns a struct reset_control or IS_ERR() condition
258 * containing errno.
259 */
260static inline struct reset_control *of_reset_control_get_shared_by_index(
261 struct device_node *node, int index)
262{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000263 return __of_reset_control_get(node, NULL, index, true, false);
Lee Jones40faee8e2016-06-06 16:56:51 +0100264}
265
266/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100267 * devm_reset_control_get_exclusive - resource managed
268 * reset_control_get_exclusive()
Hans de Goede6c96f052016-02-23 18:46:24 +0100269 * @dev: device to be reset by the controller
270 * @id: reset line name
271 *
Lee Jonesa53e35d2016-06-06 16:56:50 +0100272 * Managed reset_control_get_exclusive(). For reset controllers returned
273 * from this function, reset_control_put() is called automatically on driver
274 * detach.
275 *
276 * See reset_control_get_exclusive() for more information.
Hans de Goede6c96f052016-02-23 18:46:24 +0100277 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100278static inline struct reset_control *
279__must_check devm_reset_control_get_exclusive(struct device *dev,
280 const char *id)
Hans de Goede6c96f052016-02-23 18:46:24 +0100281{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000282 return __devm_reset_control_get(dev, id, 0, false, false);
Philipp Zabelb4240802014-03-07 15:18:47 +0100283}
284
Hans de Goede0b522972016-02-23 18:46:26 +0100285/**
286 * devm_reset_control_get_shared - resource managed reset_control_get_shared()
287 * @dev: device to be reset by the controller
288 * @id: reset line name
289 *
290 * Managed reset_control_get_shared(). For reset controllers returned from
291 * this function, reset_control_put() is called automatically on driver detach.
292 * See reset_control_get_shared() for more information.
293 */
294static inline struct reset_control *devm_reset_control_get_shared(
295 struct device *dev, const char *id)
296{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000297 return __devm_reset_control_get(dev, id, 0, true, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100298}
299
Lee Jonesa53e35d2016-06-06 16:56:50 +0100300static inline struct reset_control *devm_reset_control_get_optional_exclusive(
Philipp Zabelb4240802014-03-07 15:18:47 +0100301 struct device *dev, const char *id)
302{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000303 return __devm_reset_control_get(dev, id, 0, false, true);
Philipp Zabelb4240802014-03-07 15:18:47 +0100304}
305
Lee Jonesc33d61a2016-06-06 16:56:52 +0100306static inline struct reset_control *devm_reset_control_get_optional_shared(
307 struct device *dev, const char *id)
308{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000309 return __devm_reset_control_get(dev, id, 0, true, true);
Lee Jonesc33d61a2016-06-06 16:56:52 +0100310}
311
Hans de Goede6c96f052016-02-23 18:46:24 +0100312/**
Lee Jonesa53e35d2016-06-06 16:56:50 +0100313 * devm_reset_control_get_exclusive_by_index - resource managed
314 * reset_control_get_exclusive()
Hans de Goede6c96f052016-02-23 18:46:24 +0100315 * @dev: device to be reset by the controller
316 * @index: index of the reset controller
317 *
Lee Jonesa53e35d2016-06-06 16:56:50 +0100318 * Managed reset_control_get_exclusive(). For reset controllers returned from
319 * this function, reset_control_put() is called automatically on driver
320 * detach.
321 *
322 * See reset_control_get_exclusive() for more information.
Hans de Goede6c96f052016-02-23 18:46:24 +0100323 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100324static inline struct reset_control *
325devm_reset_control_get_exclusive_by_index(struct device *dev, int index)
Hans de Goedee3ec0a82014-04-13 14:09:15 +0200326{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000327 return __devm_reset_control_get(dev, NULL, index, false, false);
Hans de Goede0b522972016-02-23 18:46:26 +0100328}
329
Hans de Goede0b522972016-02-23 18:46:26 +0100330/**
331 * devm_reset_control_get_shared_by_index - resource managed
Geert Uytterhoeven12c62b92018-10-08 13:15:43 +0200332 * reset_control_get_shared
Hans de Goede0b522972016-02-23 18:46:26 +0100333 * @dev: device to be reset by the controller
334 * @index: index of the reset controller
335 *
336 * Managed reset_control_get_shared(). For reset controllers returned from
337 * this function, reset_control_put() is called automatically on driver detach.
338 * See reset_control_get_shared() for more information.
339 */
Lee Jones0bcc0ea2016-06-06 16:56:53 +0100340static inline struct reset_control *
341devm_reset_control_get_shared_by_index(struct device *dev, int index)
Hans de Goede0b522972016-02-23 18:46:26 +0100342{
Ramiro Oliveirabb475232017-01-13 17:57:41 +0000343 return __devm_reset_control_get(dev, NULL, index, true, false);
Hans de Goedee3ec0a82014-04-13 14:09:15 +0200344}
345
Lee Jonesa53e35d2016-06-06 16:56:50 +0100346/*
347 * TEMPORARY calls to use during transition:
348 *
349 * of_reset_control_get() => of_reset_control_get_exclusive()
350 *
351 * These inline function calls will be removed once all consumers
352 * have been moved over to the new explicit API.
353 */
Lee Jonesa53e35d2016-06-06 16:56:50 +0100354static inline struct reset_control *of_reset_control_get(
355 struct device_node *node, const char *id)
356{
357 return of_reset_control_get_exclusive(node, id);
358}
359
360static inline struct reset_control *of_reset_control_get_by_index(
361 struct device_node *node, int index)
362{
363 return of_reset_control_get_exclusive_by_index(node, index);
364}
365
366static inline struct reset_control *devm_reset_control_get(
367 struct device *dev, const char *id)
368{
369 return devm_reset_control_get_exclusive(dev, id);
370}
371
372static inline struct reset_control *devm_reset_control_get_optional(
373 struct device *dev, const char *id)
374{
375 return devm_reset_control_get_optional_exclusive(dev, id);
376
377}
378
379static inline struct reset_control *devm_reset_control_get_by_index(
380 struct device *dev, int index)
381{
382 return devm_reset_control_get_exclusive_by_index(dev, index);
383}
Vivek Gautam17c82e22017-05-22 16:53:25 +0530384
385/*
386 * APIs to manage a list of reset controllers
387 */
388static inline struct reset_control *
389devm_reset_control_array_get_exclusive(struct device *dev)
390{
391 return devm_reset_control_array_get(dev, false, false);
392}
393
394static inline struct reset_control *
395devm_reset_control_array_get_shared(struct device *dev)
396{
397 return devm_reset_control_array_get(dev, true, false);
398}
399
400static inline struct reset_control *
401devm_reset_control_array_get_optional_exclusive(struct device *dev)
402{
403 return devm_reset_control_array_get(dev, false, true);
404}
405
406static inline struct reset_control *
407devm_reset_control_array_get_optional_shared(struct device *dev)
408{
409 return devm_reset_control_array_get(dev, true, true);
410}
411
412static inline struct reset_control *
413of_reset_control_array_get_exclusive(struct device_node *node)
414{
415 return of_reset_control_array_get(node, false, false);
416}
417
418static inline struct reset_control *
419of_reset_control_array_get_shared(struct device_node *node)
420{
421 return of_reset_control_array_get(node, true, false);
422}
423
424static inline struct reset_control *
425of_reset_control_array_get_optional_exclusive(struct device_node *node)
426{
427 return of_reset_control_array_get(node, false, true);
428}
429
430static inline struct reset_control *
431of_reset_control_array_get_optional_shared(struct device_node *node)
432{
433 return of_reset_control_array_get(node, true, true);
434}
Philipp Zabel61fc4132012-11-19 17:23:13 +0100435#endif