diff options
Diffstat (limited to 'drivers/reset/core.c')
-rw-r--r-- | drivers/reset/core.c | 71 |
1 files changed, 32 insertions, 39 deletions
diff --git a/drivers/reset/core.c b/drivers/reset/core.c index d1b6089a0ef8..baeaf82d40d9 100644 --- a/drivers/reset/core.c +++ b/drivers/reset/core.c | |||
@@ -43,7 +43,7 @@ struct reset_control { | |||
43 | * This simple translation function should be used for reset controllers | 43 | * This simple translation function should be used for reset controllers |
44 | * with 1:1 mapping, where reset lines can be indexed by number without gaps. | 44 | * with 1:1 mapping, where reset lines can be indexed by number without gaps. |
45 | */ | 45 | */ |
46 | int of_reset_simple_xlate(struct reset_controller_dev *rcdev, | 46 | static int of_reset_simple_xlate(struct reset_controller_dev *rcdev, |
47 | const struct of_phandle_args *reset_spec) | 47 | const struct of_phandle_args *reset_spec) |
48 | { | 48 | { |
49 | if (WARN_ON(reset_spec->args_count != rcdev->of_reset_n_cells)) | 49 | if (WARN_ON(reset_spec->args_count != rcdev->of_reset_n_cells)) |
@@ -54,7 +54,6 @@ int of_reset_simple_xlate(struct reset_controller_dev *rcdev, | |||
54 | 54 | ||
55 | return reset_spec->args[0]; | 55 | return reset_spec->args[0]; |
56 | } | 56 | } |
57 | EXPORT_SYMBOL_GPL(of_reset_simple_xlate); | ||
58 | 57 | ||
59 | /** | 58 | /** |
60 | * reset_controller_register - register a reset controller device | 59 | * reset_controller_register - register a reset controller device |
@@ -127,15 +126,16 @@ int reset_control_deassert(struct reset_control *rstc) | |||
127 | EXPORT_SYMBOL_GPL(reset_control_deassert); | 126 | EXPORT_SYMBOL_GPL(reset_control_deassert); |
128 | 127 | ||
129 | /** | 128 | /** |
130 | * reset_control_get - Lookup and obtain a reference to a reset controller. | 129 | * of_reset_control_get - Lookup and obtain a reference to a reset controller. |
131 | * @dev: device to be reset by the controller | 130 | * @node: device to be reset by the controller |
132 | * @id: reset line name | 131 | * @id: reset line name |
133 | * | 132 | * |
134 | * Returns a struct reset_control or IS_ERR() condition containing errno. | 133 | * Returns a struct reset_control or IS_ERR() condition containing errno. |
135 | * | 134 | * |
136 | * Use of id names is optional. | 135 | * Use of id names is optional. |
137 | */ | 136 | */ |
138 | struct reset_control *reset_control_get(struct device *dev, const char *id) | 137 | struct reset_control *of_reset_control_get(struct device_node *node, |
138 | const char *id) | ||
139 | { | 139 | { |
140 | struct reset_control *rstc = ERR_PTR(-EPROBE_DEFER); | 140 | struct reset_control *rstc = ERR_PTR(-EPROBE_DEFER); |
141 | struct reset_controller_dev *r, *rcdev; | 141 | struct reset_controller_dev *r, *rcdev; |
@@ -144,13 +144,10 @@ struct reset_control *reset_control_get(struct device *dev, const char *id) | |||
144 | int rstc_id; | 144 | int rstc_id; |
145 | int ret; | 145 | int ret; |
146 | 146 | ||
147 | if (!dev) | ||
148 | return ERR_PTR(-EINVAL); | ||
149 | |||
150 | if (id) | 147 | if (id) |
151 | index = of_property_match_string(dev->of_node, | 148 | index = of_property_match_string(node, |
152 | "reset-names", id); | 149 | "reset-names", id); |
153 | ret = of_parse_phandle_with_args(dev->of_node, "resets", "#reset-cells", | 150 | ret = of_parse_phandle_with_args(node, "resets", "#reset-cells", |
154 | index, &args); | 151 | index, &args); |
155 | if (ret) | 152 | if (ret) |
156 | return ERR_PTR(ret); | 153 | return ERR_PTR(ret); |
@@ -167,7 +164,7 @@ struct reset_control *reset_control_get(struct device *dev, const char *id) | |||
167 | 164 | ||
168 | if (!rcdev) { | 165 | if (!rcdev) { |
169 | mutex_unlock(&reset_controller_list_mutex); | 166 | mutex_unlock(&reset_controller_list_mutex); |
170 | return ERR_PTR(-ENODEV); | 167 | return ERR_PTR(-EPROBE_DEFER); |
171 | } | 168 | } |
172 | 169 | ||
173 | rstc_id = rcdev->of_xlate(rcdev, &args); | 170 | rstc_id = rcdev->of_xlate(rcdev, &args); |
@@ -185,12 +182,35 @@ struct reset_control *reset_control_get(struct device *dev, const char *id) | |||
185 | return ERR_PTR(-ENOMEM); | 182 | return ERR_PTR(-ENOMEM); |
186 | } | 183 | } |
187 | 184 | ||
188 | rstc->dev = dev; | ||
189 | rstc->rcdev = rcdev; | 185 | rstc->rcdev = rcdev; |
190 | rstc->id = rstc_id; | 186 | rstc->id = rstc_id; |
191 | 187 | ||
192 | return rstc; | 188 | return rstc; |
193 | } | 189 | } |
190 | EXPORT_SYMBOL_GPL(of_reset_control_get); | ||
191 | |||
192 | /** | ||
193 | * reset_control_get - Lookup and obtain a reference to a reset controller. | ||
194 | * @dev: device to be reset by the controller | ||
195 | * @id: reset line name | ||
196 | * | ||
197 | * Returns a struct reset_control or IS_ERR() condition containing errno. | ||
198 | * | ||
199 | * Use of id names is optional. | ||
200 | */ | ||
201 | struct reset_control *reset_control_get(struct device *dev, const char *id) | ||
202 | { | ||
203 | struct reset_control *rstc; | ||
204 | |||
205 | if (!dev) | ||
206 | return ERR_PTR(-EINVAL); | ||
207 | |||
208 | rstc = of_reset_control_get(dev->of_node, id); | ||
209 | if (!IS_ERR(rstc)) | ||
210 | rstc->dev = dev; | ||
211 | |||
212 | return rstc; | ||
213 | } | ||
194 | EXPORT_SYMBOL_GPL(reset_control_get); | 214 | EXPORT_SYMBOL_GPL(reset_control_get); |
195 | 215 | ||
196 | /** | 216 | /** |
@@ -243,33 +263,6 @@ struct reset_control *devm_reset_control_get(struct device *dev, const char *id) | |||
243 | } | 263 | } |
244 | EXPORT_SYMBOL_GPL(devm_reset_control_get); | 264 | EXPORT_SYMBOL_GPL(devm_reset_control_get); |
245 | 265 | ||
246 | static int devm_reset_control_match(struct device *dev, void *res, void *data) | ||
247 | { | ||
248 | struct reset_control **rstc = res; | ||
249 | if (WARN_ON(!rstc || !*rstc)) | ||
250 | return 0; | ||
251 | return *rstc == data; | ||
252 | } | ||
253 | |||
254 | /** | ||
255 | * devm_reset_control_put - resource managed reset_control_put() | ||
256 | * @rstc: reset controller to free | ||
257 | * | ||
258 | * Deallocate a reset control allocated withd devm_reset_control_get(). | ||
259 | * This function will not need to be called normally, as devres will take | ||
260 | * care of freeing the resource. | ||
261 | */ | ||
262 | void devm_reset_control_put(struct reset_control *rstc) | ||
263 | { | ||
264 | int ret; | ||
265 | |||
266 | ret = devres_release(rstc->dev, devm_reset_control_release, | ||
267 | devm_reset_control_match, rstc); | ||
268 | if (ret) | ||
269 | WARN_ON(ret); | ||
270 | } | ||
271 | EXPORT_SYMBOL_GPL(devm_reset_control_put); | ||
272 | |||
273 | /** | 266 | /** |
274 | * device_reset - find reset controller associated with the device | 267 | * device_reset - find reset controller associated with the device |
275 | * and perform reset | 268 | * and perform reset |