diff options
author | Paul Walmsley <paul@pwsan.com> | 2013-01-26 02:58:17 -0500 |
---|---|---|
committer | Paul Walmsley <paul@pwsan.com> | 2013-01-29 16:59:57 -0500 |
commit | 65958fb6ca7b7e504caf852e492fe554224de1ba (patch) | |
tree | 134415a1b1a1a42aab24db27d233a307fa22e511 | |
parent | cc3af91b504ab1810311c78cce1bc2b7f52240ee (diff) |
ARM: OMAP2+: clockdomain: work on wkdep/sleepdep functions
Split the clkdm_(add|del)_(wk|sleep)dep() functions into lockless and
locking versions -- this will be needed in a subsequent patch. Also,
while here, remove the leading underscore, since these are not
currently static functions. And for functions that have
kerneldoc-style comment blocks, but which are missing the initial
'/**' tag, fix the tag to indicate that they are kerneldoc.
Signed-off-by: Paul Walmsley <paul@pwsan.com>
-rw-r--r-- | arch/arm/mach-omap2/clockdomain.c | 394 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clockdomain.h | 5 | ||||
-rw-r--r-- | arch/arm/mach-omap2/cm3xxx.c | 8 |
3 files changed, 240 insertions, 167 deletions
diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c index 275bdfbb6fc5..ab194753eb7a 100644 --- a/arch/arm/mach-omap2/clockdomain.c +++ b/arch/arm/mach-omap2/clockdomain.c | |||
@@ -120,7 +120,7 @@ static struct clkdm_dep *_clkdm_deps_lookup(struct clockdomain *clkdm, | |||
120 | return cd; | 120 | return cd; |
121 | } | 121 | } |
122 | 122 | ||
123 | /* | 123 | /** |
124 | * _autodep_lookup - resolve autodep clkdm names to clkdm pointers; store | 124 | * _autodep_lookup - resolve autodep clkdm names to clkdm pointers; store |
125 | * @autodep: struct clkdm_autodep * to resolve | 125 | * @autodep: struct clkdm_autodep * to resolve |
126 | * | 126 | * |
@@ -152,88 +152,202 @@ static void _autodep_lookup(struct clkdm_autodep *autodep) | |||
152 | autodep->clkdm.ptr = clkdm; | 152 | autodep->clkdm.ptr = clkdm; |
153 | } | 153 | } |
154 | 154 | ||
155 | /* | 155 | /** |
156 | * _clkdm_add_autodeps - add auto sleepdeps/wkdeps to clkdm upon clock enable | 156 | * _resolve_clkdm_deps() - resolve clkdm_names in @clkdm_deps to clkdms |
157 | * @clkdm: struct clockdomain * | 157 | * @clkdm: clockdomain that we are resolving dependencies for |
158 | * @clkdm_deps: ptr to array of struct clkdm_deps to resolve | ||
158 | * | 159 | * |
159 | * Add the "autodep" sleep & wakeup dependencies to clockdomain 'clkdm' | 160 | * Iterates through @clkdm_deps, looking up the struct clockdomain named by |
160 | * in hardware-supervised mode. Meant to be called from clock framework | 161 | * clkdm_name and storing the clockdomain pointer in the struct clkdm_dep. |
161 | * when a clock inside clockdomain 'clkdm' is enabled. No return value. | 162 | * No return value. |
163 | */ | ||
164 | static void _resolve_clkdm_deps(struct clockdomain *clkdm, | ||
165 | struct clkdm_dep *clkdm_deps) | ||
166 | { | ||
167 | struct clkdm_dep *cd; | ||
168 | |||
169 | for (cd = clkdm_deps; cd && cd->clkdm_name; cd++) { | ||
170 | if (cd->clkdm) | ||
171 | continue; | ||
172 | cd->clkdm = _clkdm_lookup(cd->clkdm_name); | ||
173 | |||
174 | WARN(!cd->clkdm, "clockdomain: %s: could not find clkdm %s while resolving dependencies - should never happen", | ||
175 | clkdm->name, cd->clkdm_name); | ||
176 | } | ||
177 | } | ||
178 | |||
179 | /** | ||
180 | * _clkdm_add_wkdep - add a wakeup dependency from clkdm2 to clkdm1 (lockless) | ||
181 | * @clkdm1: wake this struct clockdomain * up (dependent) | ||
182 | * @clkdm2: when this struct clockdomain * wakes up (source) | ||
162 | * | 183 | * |
163 | * XXX autodeps are deprecated and should be removed at the earliest | 184 | * When the clockdomain represented by @clkdm2 wakes up, wake up |
164 | * opportunity | 185 | * @clkdm1. Implemented in hardware on the OMAP, this feature is |
186 | * designed to reduce wakeup latency of the dependent clockdomain @clkdm1. | ||
187 | * Returns -EINVAL if presented with invalid clockdomain pointers, | ||
188 | * -ENOENT if @clkdm2 cannot wake up clkdm1 in hardware, or 0 upon | ||
189 | * success. | ||
165 | */ | 190 | */ |
166 | void _clkdm_add_autodeps(struct clockdomain *clkdm) | 191 | static int _clkdm_add_wkdep(struct clockdomain *clkdm1, |
192 | struct clockdomain *clkdm2) | ||
167 | { | 193 | { |
168 | struct clkdm_autodep *autodep; | 194 | struct clkdm_dep *cd; |
195 | int ret = 0; | ||
169 | 196 | ||
170 | if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) | 197 | if (!clkdm1 || !clkdm2) |
171 | return; | 198 | return -EINVAL; |
172 | 199 | ||
173 | for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { | 200 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); |
174 | if (IS_ERR(autodep->clkdm.ptr)) | 201 | if (IS_ERR(cd)) |
175 | continue; | 202 | ret = PTR_ERR(cd); |
176 | 203 | ||
177 | pr_debug("clockdomain: %s: adding %s sleepdep/wkdep\n", | 204 | if (!arch_clkdm || !arch_clkdm->clkdm_add_wkdep) |
178 | clkdm->name, autodep->clkdm.ptr->name); | 205 | ret = -EINVAL; |
179 | 206 | ||
180 | clkdm_add_sleepdep(clkdm, autodep->clkdm.ptr); | 207 | if (ret) { |
181 | clkdm_add_wkdep(clkdm, autodep->clkdm.ptr); | 208 | pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n", |
209 | clkdm1->name, clkdm2->name); | ||
210 | return ret; | ||
211 | } | ||
212 | |||
213 | if (atomic_inc_return(&cd->wkdep_usecount) == 1) { | ||
214 | pr_debug("clockdomain: hardware will wake up %s when %s wakes up\n", | ||
215 | clkdm1->name, clkdm2->name); | ||
216 | |||
217 | ret = arch_clkdm->clkdm_add_wkdep(clkdm1, clkdm2); | ||
182 | } | 218 | } |
219 | |||
220 | return ret; | ||
183 | } | 221 | } |
184 | 222 | ||
185 | /* | 223 | /** |
186 | * _clkdm_add_autodeps - remove auto sleepdeps/wkdeps from clkdm | 224 | * _clkdm_del_wkdep - remove a wakeup dep from clkdm2 to clkdm1 (lockless) |
187 | * @clkdm: struct clockdomain * | 225 | * @clkdm1: wake this struct clockdomain * up (dependent) |
226 | * @clkdm2: when this struct clockdomain * wakes up (source) | ||
188 | * | 227 | * |
189 | * Remove the "autodep" sleep & wakeup dependencies from clockdomain 'clkdm' | 228 | * Remove a wakeup dependency causing @clkdm1 to wake up when @clkdm2 |
190 | * in hardware-supervised mode. Meant to be called from clock framework | 229 | * wakes up. Returns -EINVAL if presented with invalid clockdomain |
191 | * when a clock inside clockdomain 'clkdm' is disabled. No return value. | 230 | * pointers, -ENOENT if @clkdm2 cannot wake up clkdm1 in hardware, or |
231 | * 0 upon success. | ||
232 | */ | ||
233 | static int _clkdm_del_wkdep(struct clockdomain *clkdm1, | ||
234 | struct clockdomain *clkdm2) | ||
235 | { | ||
236 | struct clkdm_dep *cd; | ||
237 | int ret = 0; | ||
238 | |||
239 | if (!clkdm1 || !clkdm2) | ||
240 | return -EINVAL; | ||
241 | |||
242 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); | ||
243 | if (IS_ERR(cd)) | ||
244 | ret = PTR_ERR(cd); | ||
245 | |||
246 | if (!arch_clkdm || !arch_clkdm->clkdm_del_wkdep) | ||
247 | ret = -EINVAL; | ||
248 | |||
249 | if (ret) { | ||
250 | pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n", | ||
251 | clkdm1->name, clkdm2->name); | ||
252 | return ret; | ||
253 | } | ||
254 | |||
255 | if (atomic_dec_return(&cd->wkdep_usecount) == 0) { | ||
256 | pr_debug("clockdomain: hardware will no longer wake up %s after %s wakes up\n", | ||
257 | clkdm1->name, clkdm2->name); | ||
258 | |||
259 | ret = arch_clkdm->clkdm_del_wkdep(clkdm1, clkdm2); | ||
260 | } | ||
261 | |||
262 | return ret; | ||
263 | } | ||
264 | |||
265 | /** | ||
266 | * _clkdm_add_sleepdep - add a sleep dependency from clkdm2 to clkdm1 (lockless) | ||
267 | * @clkdm1: prevent this struct clockdomain * from sleeping (dependent) | ||
268 | * @clkdm2: when this struct clockdomain * is active (source) | ||
192 | * | 269 | * |
193 | * XXX autodeps are deprecated and should be removed at the earliest | 270 | * Prevent @clkdm1 from automatically going inactive (and then to |
194 | * opportunity | 271 | * retention or off) if @clkdm2 is active. Returns -EINVAL if |
272 | * presented with invalid clockdomain pointers or called on a machine | ||
273 | * that does not support software-configurable hardware sleep | ||
274 | * dependencies, -ENOENT if the specified dependency cannot be set in | ||
275 | * hardware, or 0 upon success. | ||
195 | */ | 276 | */ |
196 | void _clkdm_del_autodeps(struct clockdomain *clkdm) | 277 | static int _clkdm_add_sleepdep(struct clockdomain *clkdm1, |
278 | struct clockdomain *clkdm2) | ||
197 | { | 279 | { |
198 | struct clkdm_autodep *autodep; | 280 | struct clkdm_dep *cd; |
281 | int ret = 0; | ||
199 | 282 | ||
200 | if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) | 283 | if (!clkdm1 || !clkdm2) |
201 | return; | 284 | return -EINVAL; |
202 | 285 | ||
203 | for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { | 286 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); |
204 | if (IS_ERR(autodep->clkdm.ptr)) | 287 | if (IS_ERR(cd)) |
205 | continue; | 288 | ret = PTR_ERR(cd); |
206 | 289 | ||
207 | pr_debug("clockdomain: %s: removing %s sleepdep/wkdep\n", | 290 | if (!arch_clkdm || !arch_clkdm->clkdm_add_sleepdep) |
208 | clkdm->name, autodep->clkdm.ptr->name); | 291 | ret = -EINVAL; |
209 | 292 | ||
210 | clkdm_del_sleepdep(clkdm, autodep->clkdm.ptr); | 293 | if (ret) { |
211 | clkdm_del_wkdep(clkdm, autodep->clkdm.ptr); | 294 | pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n", |
295 | clkdm1->name, clkdm2->name); | ||
296 | return ret; | ||
212 | } | 297 | } |
298 | |||
299 | if (atomic_inc_return(&cd->sleepdep_usecount) == 1) { | ||
300 | pr_debug("clockdomain: will prevent %s from sleeping if %s is active\n", | ||
301 | clkdm1->name, clkdm2->name); | ||
302 | |||
303 | ret = arch_clkdm->clkdm_add_sleepdep(clkdm1, clkdm2); | ||
304 | } | ||
305 | |||
306 | return ret; | ||
213 | } | 307 | } |
214 | 308 | ||
215 | /** | 309 | /** |
216 | * _resolve_clkdm_deps() - resolve clkdm_names in @clkdm_deps to clkdms | 310 | * _clkdm_del_sleepdep - remove a sleep dep from clkdm2 to clkdm1 (lockless) |
217 | * @clkdm: clockdomain that we are resolving dependencies for | 311 | * @clkdm1: prevent this struct clockdomain * from sleeping (dependent) |
218 | * @clkdm_deps: ptr to array of struct clkdm_deps to resolve | 312 | * @clkdm2: when this struct clockdomain * is active (source) |
219 | * | 313 | * |
220 | * Iterates through @clkdm_deps, looking up the struct clockdomain named by | 314 | * Allow @clkdm1 to automatically go inactive (and then to retention or |
221 | * clkdm_name and storing the clockdomain pointer in the struct clkdm_dep. | 315 | * off), independent of the activity state of @clkdm2. Returns -EINVAL |
222 | * No return value. | 316 | * if presented with invalid clockdomain pointers or called on a machine |
317 | * that does not support software-configurable hardware sleep dependencies, | ||
318 | * -ENOENT if the specified dependency cannot be cleared in hardware, or | ||
319 | * 0 upon success. | ||
223 | */ | 320 | */ |
224 | static void _resolve_clkdm_deps(struct clockdomain *clkdm, | 321 | static int _clkdm_del_sleepdep(struct clockdomain *clkdm1, |
225 | struct clkdm_dep *clkdm_deps) | 322 | struct clockdomain *clkdm2) |
226 | { | 323 | { |
227 | struct clkdm_dep *cd; | 324 | struct clkdm_dep *cd; |
325 | int ret = 0; | ||
228 | 326 | ||
229 | for (cd = clkdm_deps; cd && cd->clkdm_name; cd++) { | 327 | if (!clkdm1 || !clkdm2) |
230 | if (cd->clkdm) | 328 | return -EINVAL; |
231 | continue; | ||
232 | cd->clkdm = _clkdm_lookup(cd->clkdm_name); | ||
233 | 329 | ||
234 | WARN(!cd->clkdm, "clockdomain: %s: could not find clkdm %s while resolving dependencies - should never happen", | 330 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); |
235 | clkdm->name, cd->clkdm_name); | 331 | if (IS_ERR(cd)) |
332 | ret = PTR_ERR(cd); | ||
333 | |||
334 | if (!arch_clkdm || !arch_clkdm->clkdm_del_sleepdep) | ||
335 | ret = -EINVAL; | ||
336 | |||
337 | if (ret) { | ||
338 | pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n", | ||
339 | clkdm1->name, clkdm2->name); | ||
340 | return ret; | ||
236 | } | 341 | } |
342 | |||
343 | if (atomic_dec_return(&cd->sleepdep_usecount) == 0) { | ||
344 | pr_debug("clockdomain: will no longer prevent %s from sleeping if %s is active\n", | ||
345 | clkdm1->name, clkdm2->name); | ||
346 | |||
347 | ret = arch_clkdm->clkdm_del_sleepdep(clkdm1, clkdm2); | ||
348 | } | ||
349 | |||
350 | return ret; | ||
237 | } | 351 | } |
238 | 352 | ||
239 | /* Public functions */ | 353 | /* Public functions */ |
@@ -453,33 +567,7 @@ struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm) | |||
453 | */ | 567 | */ |
454 | int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 568 | int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
455 | { | 569 | { |
456 | struct clkdm_dep *cd; | 570 | return _clkdm_add_wkdep(clkdm1, clkdm2); |
457 | int ret = 0; | ||
458 | |||
459 | if (!clkdm1 || !clkdm2) | ||
460 | return -EINVAL; | ||
461 | |||
462 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); | ||
463 | if (IS_ERR(cd)) | ||
464 | ret = PTR_ERR(cd); | ||
465 | |||
466 | if (!arch_clkdm || !arch_clkdm->clkdm_add_wkdep) | ||
467 | ret = -EINVAL; | ||
468 | |||
469 | if (ret) { | ||
470 | pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n", | ||
471 | clkdm1->name, clkdm2->name); | ||
472 | return ret; | ||
473 | } | ||
474 | |||
475 | if (atomic_inc_return(&cd->wkdep_usecount) == 1) { | ||
476 | pr_debug("clockdomain: hardware will wake up %s when %s wakes up\n", | ||
477 | clkdm1->name, clkdm2->name); | ||
478 | |||
479 | ret = arch_clkdm->clkdm_add_wkdep(clkdm1, clkdm2); | ||
480 | } | ||
481 | |||
482 | return ret; | ||
483 | } | 571 | } |
484 | 572 | ||
485 | /** | 573 | /** |
@@ -494,33 +582,7 @@ int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
494 | */ | 582 | */ |
495 | int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 583 | int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
496 | { | 584 | { |
497 | struct clkdm_dep *cd; | 585 | return _clkdm_del_wkdep(clkdm1, clkdm2); |
498 | int ret = 0; | ||
499 | |||
500 | if (!clkdm1 || !clkdm2) | ||
501 | return -EINVAL; | ||
502 | |||
503 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); | ||
504 | if (IS_ERR(cd)) | ||
505 | ret = PTR_ERR(cd); | ||
506 | |||
507 | if (!arch_clkdm || !arch_clkdm->clkdm_del_wkdep) | ||
508 | ret = -EINVAL; | ||
509 | |||
510 | if (ret) { | ||
511 | pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n", | ||
512 | clkdm1->name, clkdm2->name); | ||
513 | return ret; | ||
514 | } | ||
515 | |||
516 | if (atomic_dec_return(&cd->wkdep_usecount) == 0) { | ||
517 | pr_debug("clockdomain: hardware will no longer wake up %s after %s wakes up\n", | ||
518 | clkdm1->name, clkdm2->name); | ||
519 | |||
520 | ret = arch_clkdm->clkdm_del_wkdep(clkdm1, clkdm2); | ||
521 | } | ||
522 | |||
523 | return ret; | ||
524 | } | 586 | } |
525 | 587 | ||
526 | /** | 588 | /** |
@@ -597,33 +659,7 @@ int clkdm_clear_all_wkdeps(struct clockdomain *clkdm) | |||
597 | */ | 659 | */ |
598 | int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 660 | int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
599 | { | 661 | { |
600 | struct clkdm_dep *cd; | 662 | return _clkdm_add_sleepdep(clkdm1, clkdm2); |
601 | int ret = 0; | ||
602 | |||
603 | if (!clkdm1 || !clkdm2) | ||
604 | return -EINVAL; | ||
605 | |||
606 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); | ||
607 | if (IS_ERR(cd)) | ||
608 | ret = PTR_ERR(cd); | ||
609 | |||
610 | if (!arch_clkdm || !arch_clkdm->clkdm_add_sleepdep) | ||
611 | ret = -EINVAL; | ||
612 | |||
613 | if (ret) { | ||
614 | pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n", | ||
615 | clkdm1->name, clkdm2->name); | ||
616 | return ret; | ||
617 | } | ||
618 | |||
619 | if (atomic_inc_return(&cd->sleepdep_usecount) == 1) { | ||
620 | pr_debug("clockdomain: will prevent %s from sleeping if %s is active\n", | ||
621 | clkdm1->name, clkdm2->name); | ||
622 | |||
623 | ret = arch_clkdm->clkdm_add_sleepdep(clkdm1, clkdm2); | ||
624 | } | ||
625 | |||
626 | return ret; | ||
627 | } | 663 | } |
628 | 664 | ||
629 | /** | 665 | /** |
@@ -640,33 +676,7 @@ int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
640 | */ | 676 | */ |
641 | int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 677 | int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
642 | { | 678 | { |
643 | struct clkdm_dep *cd; | 679 | return _clkdm_del_sleepdep(clkdm1, clkdm2); |
644 | int ret = 0; | ||
645 | |||
646 | if (!clkdm1 || !clkdm2) | ||
647 | return -EINVAL; | ||
648 | |||
649 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); | ||
650 | if (IS_ERR(cd)) | ||
651 | ret = PTR_ERR(cd); | ||
652 | |||
653 | if (!arch_clkdm || !arch_clkdm->clkdm_del_sleepdep) | ||
654 | ret = -EINVAL; | ||
655 | |||
656 | if (ret) { | ||
657 | pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n", | ||
658 | clkdm1->name, clkdm2->name); | ||
659 | return ret; | ||
660 | } | ||
661 | |||
662 | if (atomic_dec_return(&cd->sleepdep_usecount) == 0) { | ||
663 | pr_debug("clockdomain: will no longer prevent %s from sleeping if %s is active\n", | ||
664 | clkdm1->name, clkdm2->name); | ||
665 | |||
666 | ret = arch_clkdm->clkdm_del_sleepdep(clkdm1, clkdm2); | ||
667 | } | ||
668 | |||
669 | return ret; | ||
670 | } | 680 | } |
671 | 681 | ||
672 | /** | 682 | /** |
@@ -977,6 +987,68 @@ bool clkdm_missing_idle_reporting(struct clockdomain *clkdm) | |||
977 | return (clkdm->flags & CLKDM_MISSING_IDLE_REPORTING) ? true : false; | 987 | return (clkdm->flags & CLKDM_MISSING_IDLE_REPORTING) ? true : false; |
978 | } | 988 | } |
979 | 989 | ||
990 | /* Public autodep handling functions (deprecated) */ | ||
991 | |||
992 | /** | ||
993 | * clkdm_add_autodeps - add auto sleepdeps/wkdeps to clkdm upon clock enable | ||
994 | * @clkdm: struct clockdomain * | ||
995 | * | ||
996 | * Add the "autodep" sleep & wakeup dependencies to clockdomain 'clkdm' | ||
997 | * in hardware-supervised mode. Meant to be called from clock framework | ||
998 | * when a clock inside clockdomain 'clkdm' is enabled. No return value. | ||
999 | * | ||
1000 | * XXX autodeps are deprecated and should be removed at the earliest | ||
1001 | * opportunity | ||
1002 | */ | ||
1003 | void clkdm_add_autodeps(struct clockdomain *clkdm) | ||
1004 | { | ||
1005 | struct clkdm_autodep *autodep; | ||
1006 | |||
1007 | if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) | ||
1008 | return; | ||
1009 | |||
1010 | for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { | ||
1011 | if (IS_ERR(autodep->clkdm.ptr)) | ||
1012 | continue; | ||
1013 | |||
1014 | pr_debug("clockdomain: %s: adding %s sleepdep/wkdep\n", | ||
1015 | clkdm->name, autodep->clkdm.ptr->name); | ||
1016 | |||
1017 | _clkdm_add_sleepdep(clkdm, autodep->clkdm.ptr); | ||
1018 | _clkdm_add_wkdep(clkdm, autodep->clkdm.ptr); | ||
1019 | } | ||
1020 | } | ||
1021 | |||
1022 | /** | ||
1023 | * clkdm_del_autodeps - remove auto sleepdeps/wkdeps from clkdm | ||
1024 | * @clkdm: struct clockdomain * | ||
1025 | * | ||
1026 | * Remove the "autodep" sleep & wakeup dependencies from clockdomain 'clkdm' | ||
1027 | * in hardware-supervised mode. Meant to be called from clock framework | ||
1028 | * when a clock inside clockdomain 'clkdm' is disabled. No return value. | ||
1029 | * | ||
1030 | * XXX autodeps are deprecated and should be removed at the earliest | ||
1031 | * opportunity | ||
1032 | */ | ||
1033 | void clkdm_del_autodeps(struct clockdomain *clkdm) | ||
1034 | { | ||
1035 | struct clkdm_autodep *autodep; | ||
1036 | |||
1037 | if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) | ||
1038 | return; | ||
1039 | |||
1040 | for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { | ||
1041 | if (IS_ERR(autodep->clkdm.ptr)) | ||
1042 | continue; | ||
1043 | |||
1044 | pr_debug("clockdomain: %s: removing %s sleepdep/wkdep\n", | ||
1045 | clkdm->name, autodep->clkdm.ptr->name); | ||
1046 | |||
1047 | _clkdm_del_sleepdep(clkdm, autodep->clkdm.ptr); | ||
1048 | _clkdm_del_wkdep(clkdm, autodep->clkdm.ptr); | ||
1049 | } | ||
1050 | } | ||
1051 | |||
980 | /* Clockdomain-to-clock/hwmod framework interface code */ | 1052 | /* Clockdomain-to-clock/hwmod framework interface code */ |
981 | 1053 | ||
982 | static int _clkdm_clk_hwmod_enable(struct clockdomain *clkdm) | 1054 | static int _clkdm_clk_hwmod_enable(struct clockdomain *clkdm) |
diff --git a/arch/arm/mach-omap2/clockdomain.h b/arch/arm/mach-omap2/clockdomain.h index e7f1b4ba2d5b..50c3cd8bd706 100644 --- a/arch/arm/mach-omap2/clockdomain.h +++ b/arch/arm/mach-omap2/clockdomain.h | |||
@@ -216,8 +216,9 @@ extern void __init omap243x_clockdomains_init(void); | |||
216 | extern void __init omap3xxx_clockdomains_init(void); | 216 | extern void __init omap3xxx_clockdomains_init(void); |
217 | extern void __init am33xx_clockdomains_init(void); | 217 | extern void __init am33xx_clockdomains_init(void); |
218 | extern void __init omap44xx_clockdomains_init(void); | 218 | extern void __init omap44xx_clockdomains_init(void); |
219 | extern void _clkdm_add_autodeps(struct clockdomain *clkdm); | 219 | |
220 | extern void _clkdm_del_autodeps(struct clockdomain *clkdm); | 220 | extern void clkdm_add_autodeps(struct clockdomain *clkdm); |
221 | extern void clkdm_del_autodeps(struct clockdomain *clkdm); | ||
221 | 222 | ||
222 | extern struct clkdm_ops omap2_clkdm_operations; | 223 | extern struct clkdm_ops omap2_clkdm_operations; |
223 | extern struct clkdm_ops omap3_clkdm_operations; | 224 | extern struct clkdm_ops omap3_clkdm_operations; |
diff --git a/arch/arm/mach-omap2/cm3xxx.c b/arch/arm/mach-omap2/cm3xxx.c index c2086f2e86b6..b94af4cb9dd9 100644 --- a/arch/arm/mach-omap2/cm3xxx.c +++ b/arch/arm/mach-omap2/cm3xxx.c | |||
@@ -210,7 +210,7 @@ static int omap3xxx_clkdm_wakeup(struct clockdomain *clkdm) | |||
210 | static void omap3xxx_clkdm_allow_idle(struct clockdomain *clkdm) | 210 | static void omap3xxx_clkdm_allow_idle(struct clockdomain *clkdm) |
211 | { | 211 | { |
212 | if (atomic_read(&clkdm->usecount) > 0) | 212 | if (atomic_read(&clkdm->usecount) > 0) |
213 | _clkdm_add_autodeps(clkdm); | 213 | clkdm_add_autodeps(clkdm); |
214 | 214 | ||
215 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 215 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
216 | clkdm->clktrctrl_mask); | 216 | clkdm->clktrctrl_mask); |
@@ -222,7 +222,7 @@ static void omap3xxx_clkdm_deny_idle(struct clockdomain *clkdm) | |||
222 | clkdm->clktrctrl_mask); | 222 | clkdm->clktrctrl_mask); |
223 | 223 | ||
224 | if (atomic_read(&clkdm->usecount) > 0) | 224 | if (atomic_read(&clkdm->usecount) > 0) |
225 | _clkdm_del_autodeps(clkdm); | 225 | clkdm_del_autodeps(clkdm); |
226 | } | 226 | } |
227 | 227 | ||
228 | static int omap3xxx_clkdm_clk_enable(struct clockdomain *clkdm) | 228 | static int omap3xxx_clkdm_clk_enable(struct clockdomain *clkdm) |
@@ -250,7 +250,7 @@ static int omap3xxx_clkdm_clk_enable(struct clockdomain *clkdm) | |||
250 | /* Disable HW transitions when we are changing deps */ | 250 | /* Disable HW transitions when we are changing deps */ |
251 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 251 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
252 | clkdm->clktrctrl_mask); | 252 | clkdm->clktrctrl_mask); |
253 | _clkdm_add_autodeps(clkdm); | 253 | clkdm_add_autodeps(clkdm); |
254 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 254 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
255 | clkdm->clktrctrl_mask); | 255 | clkdm->clktrctrl_mask); |
256 | } else { | 256 | } else { |
@@ -287,7 +287,7 @@ static int omap3xxx_clkdm_clk_disable(struct clockdomain *clkdm) | |||
287 | /* Disable HW transitions when we are changing deps */ | 287 | /* Disable HW transitions when we are changing deps */ |
288 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 288 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
289 | clkdm->clktrctrl_mask); | 289 | clkdm->clktrctrl_mask); |
290 | _clkdm_del_autodeps(clkdm); | 290 | clkdm_del_autodeps(clkdm); |
291 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 291 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
292 | clkdm->clktrctrl_mask); | 292 | clkdm->clktrctrl_mask); |
293 | } else { | 293 | } else { |