aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/reset.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/reset.h')
-rw-r--r--include/linux/reset.h194
1 files changed, 160 insertions, 34 deletions
diff --git a/include/linux/reset.h b/include/linux/reset.h
index c4c097de0ba9..ec0306ce7b92 100644
--- a/include/linux/reset.h
+++ b/include/linux/reset.h
@@ -1,8 +1,8 @@
1#ifndef _LINUX_RESET_H_ 1#ifndef _LINUX_RESET_H_
2#define _LINUX_RESET_H_ 2#define _LINUX_RESET_H_
3 3
4struct device; 4#include <linux/device.h>
5struct device_node; 5
6struct reset_control; 6struct reset_control;
7 7
8#ifdef CONFIG_RESET_CONTROLLER 8#ifdef CONFIG_RESET_CONTROLLER
@@ -12,9 +12,11 @@ int reset_control_assert(struct reset_control *rstc);
12int reset_control_deassert(struct reset_control *rstc); 12int reset_control_deassert(struct reset_control *rstc);
13int reset_control_status(struct reset_control *rstc); 13int reset_control_status(struct reset_control *rstc);
14 14
15struct reset_control *reset_control_get(struct device *dev, const char *id); 15struct reset_control *__of_reset_control_get(struct device_node *node,
16 const char *id, int index, int shared);
16void reset_control_put(struct reset_control *rstc); 17void reset_control_put(struct reset_control *rstc);
17struct reset_control *devm_reset_control_get(struct device *dev, const char *id); 18struct reset_control *__devm_reset_control_get(struct device *dev,
19 const char *id, int index, int shared);
18 20
19int __must_check device_reset(struct device *dev); 21int __must_check device_reset(struct device *dev);
20 22
@@ -23,24 +25,6 @@ static inline int device_reset_optional(struct device *dev)
23 return device_reset(dev); 25 return device_reset(dev);
24} 26}
25 27
26static inline struct reset_control *reset_control_get_optional(
27 struct device *dev, const char *id)
28{
29 return reset_control_get(dev, id);
30}
31
32static inline struct reset_control *devm_reset_control_get_optional(
33 struct device *dev, const char *id)
34{
35 return devm_reset_control_get(dev, id);
36}
37
38struct reset_control *of_reset_control_get(struct device_node *node,
39 const char *id);
40
41struct reset_control *of_reset_control_get_by_index(
42 struct device_node *node, int index);
43
44#else 28#else
45 29
46static inline int reset_control_reset(struct reset_control *rstc) 30static inline int reset_control_reset(struct reset_control *rstc)
@@ -72,49 +56,191 @@ static inline void reset_control_put(struct reset_control *rstc)
72 WARN_ON(1); 56 WARN_ON(1);
73} 57}
74 58
59static inline int __must_check device_reset(struct device *dev)
60{
61 WARN_ON(1);
62 return -ENOTSUPP;
63}
64
75static inline int device_reset_optional(struct device *dev) 65static inline int device_reset_optional(struct device *dev)
76{ 66{
77 return -ENOTSUPP; 67 return -ENOTSUPP;
78} 68}
79 69
80static inline struct reset_control *__must_check reset_control_get( 70static inline struct reset_control *__of_reset_control_get(
81 struct device *dev, const char *id) 71 struct device_node *node,
72 const char *id, int index, int shared)
82{ 73{
83 WARN_ON(1);
84 return ERR_PTR(-EINVAL); 74 return ERR_PTR(-EINVAL);
85} 75}
86 76
87static inline struct reset_control *__must_check devm_reset_control_get( 77static inline struct reset_control *__devm_reset_control_get(
78 struct device *dev,
79 const char *id, int index, int shared)
80{
81 return ERR_PTR(-EINVAL);
82}
83
84#endif /* CONFIG_RESET_CONTROLLER */
85
86/**
87 * reset_control_get - Lookup and obtain an exclusive reference to a
88 * reset controller.
89 * @dev: device to be reset by the controller
90 * @id: reset line name
91 *
92 * Returns a struct reset_control or IS_ERR() condition containing errno.
93 * If this function is called more then once for the same reset_control it will
94 * return -EBUSY.
95 *
96 * See reset_control_get_shared for details on shared references to
97 * reset-controls.
98 *
99 * Use of id names is optional.
100 */
101static inline struct reset_control *__must_check reset_control_get(
88 struct device *dev, const char *id) 102 struct device *dev, const char *id)
89{ 103{
104#ifndef CONFIG_RESET_CONTROLLER
90 WARN_ON(1); 105 WARN_ON(1);
91 return ERR_PTR(-EINVAL); 106#endif
107 return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, 0);
92} 108}
93 109
94static inline struct reset_control *reset_control_get_optional( 110static inline struct reset_control *reset_control_get_optional(
95 struct device *dev, const char *id) 111 struct device *dev, const char *id)
96{ 112{
97 return ERR_PTR(-ENOTSUPP); 113 return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, 0);
98} 114}
99 115
100static inline struct reset_control *devm_reset_control_get_optional( 116/**
117 * 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(
101 struct device *dev, const char *id) 139 struct device *dev, const char *id)
102{ 140{
103 return ERR_PTR(-ENOTSUPP); 141 return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, 1);
104} 142}
105 143
144/**
145 * of_reset_control_get - Lookup and obtain an exclusive reference to a
146 * reset controller.
147 * @node: device to be reset by the controller
148 * @id: reset line name
149 *
150 * Returns a struct reset_control or IS_ERR() condition containing errno.
151 *
152 * Use of id names is optional.
153 */
106static inline struct reset_control *of_reset_control_get( 154static inline struct reset_control *of_reset_control_get(
107 struct device_node *node, const char *id) 155 struct device_node *node, const char *id)
108{ 156{
109 return ERR_PTR(-ENOTSUPP); 157 return __of_reset_control_get(node, id, 0, 0);
110} 158}
111 159
160/**
161 * of_reset_control_get_by_index - Lookup and obtain an exclusive reference to
162 * a reset controller by index.
163 * @node: device to be reset by the controller
164 * @index: index of the reset controller
165 *
166 * This is to be used to perform a list of resets for a device or power domain
167 * in whatever order. Returns a struct reset_control or IS_ERR() condition
168 * containing errno.
169 */
112static inline struct reset_control *of_reset_control_get_by_index( 170static inline struct reset_control *of_reset_control_get_by_index(
113 struct device_node *node, int index) 171 struct device_node *node, int index)
114{ 172{
115 return ERR_PTR(-ENOTSUPP); 173 return __of_reset_control_get(node, NULL, index, 0);
116} 174}
117 175
118#endif /* CONFIG_RESET_CONTROLLER */ 176/**
177 * devm_reset_control_get - resource managed reset_control_get()
178 * @dev: device to be reset by the controller
179 * @id: reset line name
180 *
181 * Managed reset_control_get(). For reset controllers returned from this
182 * function, reset_control_put() is called automatically on driver detach.
183 * See reset_control_get() for more information.
184 */
185static inline struct reset_control *__must_check devm_reset_control_get(
186 struct device *dev, const char *id)
187{
188#ifndef CONFIG_RESET_CONTROLLER
189 WARN_ON(1);
190#endif
191 return __devm_reset_control_get(dev, id, 0, 0);
192}
193
194static inline struct reset_control *devm_reset_control_get_optional(
195 struct device *dev, const char *id)
196{
197 return __devm_reset_control_get(dev, id, 0, 0);
198}
199
200/**
201 * devm_reset_control_get_by_index - resource managed reset_control_get
202 * @dev: device to be reset by the controller
203 * @index: index of the reset controller
204 *
205 * Managed reset_control_get(). For reset controllers returned from this
206 * function, reset_control_put() is called automatically on driver detach.
207 * See reset_control_get() for more information.
208 */
209static inline struct reset_control *devm_reset_control_get_by_index(
210 struct device *dev, int index)
211{
212 return __devm_reset_control_get(dev, NULL, index, 0);
213}
214
215/**
216 * devm_reset_control_get_shared - resource managed reset_control_get_shared()
217 * @dev: device to be reset by the controller
218 * @id: reset line name
219 *
220 * Managed reset_control_get_shared(). For reset controllers returned from
221 * this function, reset_control_put() is called automatically on driver detach.
222 * See reset_control_get_shared() for more information.
223 */
224static inline struct reset_control *devm_reset_control_get_shared(
225 struct device *dev, const char *id)
226{
227 return __devm_reset_control_get(dev, id, 0, 1);
228}
229
230/**
231 * devm_reset_control_get_shared_by_index - resource managed
232 * reset_control_get_shared
233 * @dev: device to be reset by the controller
234 * @index: index of the reset controller
235 *
236 * Managed reset_control_get_shared(). For reset controllers returned from
237 * this function, reset_control_put() is called automatically on driver detach.
238 * See reset_control_get_shared() for more information.
239 */
240static inline struct reset_control *devm_reset_control_get_shared_by_index(
241 struct device *dev, int index)
242{
243 return __devm_reset_control_get(dev, NULL, index, 1);
244}
119 245
120#endif 246#endif