Lines Matching +full:de +full:- +full:asserts

1 // SPDX-License-Identifier: GPL-2.0-or-later
22 #include <linux/reset-controller.h>
37 * struct reset_control - a reset control
65 * struct reset_control_array - an array of reset controls
77 * struct reset_gpio_lookup - lookup key for ad-hoc created reset-gpio devices
88 if (rcdev->dev) in rcdev_name()
89 return dev_name(rcdev->dev); in rcdev_name()
91 if (rcdev->of_node) in rcdev_name()
92 return rcdev->of_node->full_name; in rcdev_name()
94 if (rcdev->of_args) in rcdev_name()
95 return rcdev->of_args->np->full_name; in rcdev_name()
101 * of_reset_simple_xlate - translate reset_spec to the reset line number
113 if (reset_spec->args[0] >= rcdev->nr_resets) in of_reset_simple_xlate()
114 return -EINVAL; in of_reset_simple_xlate()
116 return reset_spec->args[0]; in of_reset_simple_xlate()
120 * reset_controller_register - register a reset controller device
125 if (rcdev->of_node && rcdev->of_args) in reset_controller_register()
126 return -EINVAL; in reset_controller_register()
128 if (!rcdev->of_xlate) { in reset_controller_register()
129 rcdev->of_reset_n_cells = 1; in reset_controller_register()
130 rcdev->of_xlate = of_reset_simple_xlate; in reset_controller_register()
133 INIT_LIST_HEAD(&rcdev->reset_control_head); in reset_controller_register()
136 list_add(&rcdev->list, &reset_controller_list); in reset_controller_register()
144 * reset_controller_unregister - unregister a reset controller device
150 list_del(&rcdev->list); in reset_controller_unregister()
161 * devm_reset_controller_register - resource managed reset_controller_register()
178 return -ENOMEM; in devm_reset_controller_register()
194 * reset_controller_add_lookup - register a set of lookup entries
208 if (!entry->dev_id || !entry->provider) { in reset_controller_add_lookup()
214 list_add_tail(&entry->list, &reset_lookup_list); in reset_controller_add_lookup()
229 for (i = 0; i < resets->num_rstcs; i++) { in reset_control_array_reset()
230 ret = reset_control_reset(resets->rstc[i]); in reset_control_array_reset()
243 for (i = 0; i < resets->num_rstcs; i++) { in reset_control_array_rearm()
244 rstc = resets->rstc[i]; in reset_control_array_rearm()
250 return -EINVAL; in reset_control_array_rearm()
252 if (rstc->shared) { in reset_control_array_rearm()
253 if (WARN_ON(atomic_read(&rstc->deassert_count) != 0)) in reset_control_array_rearm()
254 return -EINVAL; in reset_control_array_rearm()
256 if (!rstc->acquired) in reset_control_array_rearm()
257 return -EPERM; in reset_control_array_rearm()
261 for (i = 0; i < resets->num_rstcs; i++) { in reset_control_array_rearm()
262 rstc = resets->rstc[i]; in reset_control_array_rearm()
264 if (rstc && rstc->shared) in reset_control_array_rearm()
265 WARN_ON(atomic_dec_return(&rstc->triggered_count) < 0); in reset_control_array_rearm()
275 for (i = 0; i < resets->num_rstcs; i++) { in reset_control_array_assert()
276 ret = reset_control_assert(resets->rstc[i]); in reset_control_array_assert()
284 while (i--) in reset_control_array_assert()
285 reset_control_deassert(resets->rstc[i]); in reset_control_array_assert()
293 for (i = 0; i < resets->num_rstcs; i++) { in reset_control_array_deassert()
294 ret = reset_control_deassert(resets->rstc[i]); in reset_control_array_deassert()
302 while (i--) in reset_control_array_deassert()
303 reset_control_assert(resets->rstc[i]); in reset_control_array_deassert()
312 for (i = 0; i < resets->num_rstcs; i++) { in reset_control_array_acquire()
313 err = reset_control_acquire(resets->rstc[i]); in reset_control_array_acquire()
321 while (i--) in reset_control_array_acquire()
322 reset_control_release(resets->rstc[i]); in reset_control_array_acquire()
331 for (i = 0; i < resets->num_rstcs; i++) in reset_control_array_release()
332 reset_control_release(resets->rstc[i]); in reset_control_array_release()
337 return rstc->array; in reset_control_is_array()
341 * reset_control_reset - reset the controlled device
346 * a no-op.
347 * Consumers must not use reset_control_(de)assert on shared reset lines when
361 return -EINVAL; in reset_control_reset()
366 if (!rstc->rcdev->ops->reset) in reset_control_reset()
367 return -ENOTSUPP; in reset_control_reset()
369 if (rstc->shared) { in reset_control_reset()
370 if (WARN_ON(atomic_read(&rstc->deassert_count) != 0)) in reset_control_reset()
371 return -EINVAL; in reset_control_reset()
373 if (atomic_inc_return(&rstc->triggered_count) != 1) in reset_control_reset()
376 if (!rstc->acquired) in reset_control_reset()
377 return -EPERM; in reset_control_reset()
380 ret = rstc->rcdev->ops->reset(rstc->rcdev, rstc->id); in reset_control_reset()
381 if (rstc->shared && ret) in reset_control_reset()
382 atomic_dec(&rstc->triggered_count); in reset_control_reset()
389 * reset_control_bulk_reset - reset the controlled devices in order
413 * reset_control_rearm - allow shared reset line to be re-triggered"
422 * Consumers must not use reset_control_(de)assert on shared reset lines when
433 return -EINVAL; in reset_control_rearm()
438 if (rstc->shared) { in reset_control_rearm()
439 if (WARN_ON(atomic_read(&rstc->deassert_count) != 0)) in reset_control_rearm()
440 return -EINVAL; in reset_control_rearm()
442 WARN_ON(atomic_dec_return(&rstc->triggered_count) < 0); in reset_control_rearm()
444 if (!rstc->acquired) in reset_control_rearm()
445 return -EPERM; in reset_control_rearm()
453 * reset_control_assert - asserts the reset line
463 * reset_control_(de)assert has been used.
474 return -EINVAL; in reset_control_assert()
479 if (rstc->shared) { in reset_control_assert()
480 if (WARN_ON(atomic_read(&rstc->triggered_count) != 0)) in reset_control_assert()
481 return -EINVAL; in reset_control_assert()
483 if (WARN_ON(atomic_read(&rstc->deassert_count) == 0)) in reset_control_assert()
484 return -EINVAL; in reset_control_assert()
486 if (atomic_dec_return(&rstc->deassert_count) != 0) in reset_control_assert()
493 if (!rstc->rcdev->ops->assert) in reset_control_assert()
501 if (!rstc->rcdev->ops->assert) in reset_control_assert()
502 return -ENOTSUPP; in reset_control_assert()
504 if (!rstc->acquired) { in reset_control_assert()
506 rcdev_name(rstc->rcdev), rstc->id); in reset_control_assert()
507 return -EPERM; in reset_control_assert()
511 return rstc->rcdev->ops->assert(rstc->rcdev, rstc->id); in reset_control_assert()
516 * reset_control_bulk_assert - asserts the reset lines in order
539 while (i--) in reset_control_bulk_assert()
546 * reset_control_deassert - deasserts the reset line
551 * reset_control_(de)assert has been used.
562 return -EINVAL; in reset_control_deassert()
567 if (rstc->shared) { in reset_control_deassert()
568 if (WARN_ON(atomic_read(&rstc->triggered_count) != 0)) in reset_control_deassert()
569 return -EINVAL; in reset_control_deassert()
571 if (atomic_inc_return(&rstc->deassert_count) != 1) in reset_control_deassert()
574 if (!rstc->acquired) { in reset_control_deassert()
576 rcdev_name(rstc->rcdev), rstc->id); in reset_control_deassert()
577 return -EPERM; in reset_control_deassert()
583 * that it handles self-deasserting reset lines via .reset(). In that in reset_control_deassert()
586 * return -ENOTSUPP. in reset_control_deassert()
588 if (!rstc->rcdev->ops->deassert) in reset_control_deassert()
591 return rstc->rcdev->ops->deassert(rstc->rcdev, rstc->id); in reset_control_deassert()
596 * reset_control_bulk_deassert - deasserts the reset lines in reverse order
610 for (i = num_rstcs - 1; i >= 0; i--) { in reset_control_bulk_deassert()
626 * reset_control_status - returns a negative errno if not supported, a
637 return -EINVAL; in reset_control_status()
639 if (rstc->rcdev->ops->status) in reset_control_status()
640 return rstc->rcdev->ops->status(rstc->rcdev, rstc->id); in reset_control_status()
642 return -ENOTSUPP; in reset_control_status()
647 * reset_control_acquire() - acquires a reset control for exclusive use
674 return -EINVAL; in reset_control_acquire()
681 if (rstc->acquired) { in reset_control_acquire()
686 list_for_each_entry(rc, &rstc->rcdev->reset_control_head, list) { in reset_control_acquire()
687 if (rstc != rc && rstc->id == rc->id) { in reset_control_acquire()
688 if (rc->acquired) { in reset_control_acquire()
690 return -EBUSY; in reset_control_acquire()
695 rstc->acquired = true; in reset_control_acquire()
703 * reset_control_bulk_acquire - acquires reset controls for exclusive use
726 while (i--) in reset_control_bulk_acquire()
733 * reset_control_release() - releases exclusive access to a reset control
750 rstc->acquired = false; in reset_control_release()
755 * reset_control_bulk_release() - releases exclusive access to reset controls
787 return ERR_PTR(-EINVAL); in __reset_control_get_internal()
789 list_for_each_entry(rstc, &rcdev->reset_control_head, list) { in __reset_control_get_internal()
790 if (rstc->id == index) { in __reset_control_get_internal()
796 if (!rstc->shared && !shared && !acquired) in __reset_control_get_internal()
799 if (WARN_ON(!rstc->shared || !shared)) in __reset_control_get_internal()
800 return ERR_PTR(-EBUSY); in __reset_control_get_internal()
802 kref_get(&rstc->refcnt); in __reset_control_get_internal()
809 return ERR_PTR(-ENOMEM); in __reset_control_get_internal()
811 if (!try_module_get(rcdev->owner)) { in __reset_control_get_internal()
813 return ERR_PTR(-ENODEV); in __reset_control_get_internal()
816 rstc->rcdev = rcdev; in __reset_control_get_internal()
817 list_add(&rstc->list, &rcdev->reset_control_head); in __reset_control_get_internal()
818 rstc->id = index; in __reset_control_get_internal()
819 kref_init(&rstc->refcnt); in __reset_control_get_internal()
820 rstc->acquired = acquired; in __reset_control_get_internal()
821 rstc->shared = shared; in __reset_control_get_internal()
822 get_device(rcdev->dev); in __reset_control_get_internal()
834 module_put(rstc->rcdev->owner); in __reset_control_release()
836 list_del(&rstc->list); in __reset_control_release()
837 put_device(rstc->rcdev->dev); in __reset_control_release()
848 kref_put(&rstc->refcnt, __reset_control_release); in __reset_control_put_internal()
861 * constants from include/dt-bindings/gpio/gpio.h and in __reset_add_reset_gpio_lookup()
865 pr_err("reset-gpio code does not support GPIO flags %u for GPIO %u\n", in __reset_add_reset_gpio_lookup()
867 return -EINVAL; in __reset_add_reset_gpio_lookup()
872 return -EPROBE_DEFER; in __reset_add_reset_gpio_lookup()
876 return -EINVAL; in __reset_add_reset_gpio_lookup()
880 return -ENOMEM; in __reset_add_reset_gpio_lookup()
886 return -ENOMEM; in __reset_add_reset_gpio_lookup()
888 lookup->dev_id = kasprintf(GFP_KERNEL, "reset-gpio.%d", id); in __reset_add_reset_gpio_lookup()
889 if (!lookup->dev_id) in __reset_add_reset_gpio_lookup()
890 return -ENOMEM; in __reset_add_reset_gpio_lookup()
894 lookup->table[0] = GPIO_LOOKUP(no_free_ptr(label), gpio, "reset", in __reset_add_reset_gpio_lookup()
913 * Currently only #gpio-cells=2 is supported with the meaning of: in __reset_add_reset_gpio_device()
918 if (args->args_count != 2) in __reset_add_reset_gpio_device()
919 return -ENOENT; in __reset_add_reset_gpio_device()
922 * Registering reset-gpio device might cause immediate in __reset_add_reset_gpio_device()
931 if (args->np == rgpio_dev->of_args.np) { in __reset_add_reset_gpio_device()
932 if (of_phandle_args_equal(args, &rgpio_dev->of_args)) in __reset_add_reset_gpio_device()
944 ret = -ENOMEM; in __reset_add_reset_gpio_device()
948 ret = __reset_add_reset_gpio_lookup(id, args->np, args->args[0], in __reset_add_reset_gpio_device()
949 args->args[1]); in __reset_add_reset_gpio_device()
953 rgpio_dev->of_args = *args; in __reset_add_reset_gpio_device()
959 of_node_get(rgpio_dev->of_args.np); in __reset_add_reset_gpio_device()
960 pdev = platform_device_register_data(NULL, "reset-gpio", id, in __reset_add_reset_gpio_device()
961 &rgpio_dev->of_args, in __reset_add_reset_gpio_device()
962 sizeof(rgpio_dev->of_args)); in __reset_add_reset_gpio_device()
967 list_add(&rgpio_dev->list, &reset_gpio_lookup_list); in __reset_add_reset_gpio_device()
972 of_node_put(rgpio_dev->of_args.np); in __reset_add_reset_gpio_device()
990 if (rcdev->of_args && of_phandle_args_equal(args, in __reset_find_rcdev()
991 rcdev->of_args)) in __reset_find_rcdev()
994 if (args->np == rcdev->of_node) in __reset_find_rcdev()
1015 return ERR_PTR(-EINVAL); in __of_reset_control_get()
1019 "reset-names", id); in __of_reset_control_get()
1020 if (index == -EILSEQ) in __of_reset_control_get()
1023 return optional ? NULL : ERR_PTR(-ENOENT); in __of_reset_control_get()
1026 ret = of_parse_phandle_with_args(node, "resets", "#reset-cells", in __of_reset_control_get()
1028 if (ret == -EINVAL) in __of_reset_control_get()
1035 * There can be only one reset-gpio for regular devices, so in __of_reset_control_get()
1036 * don't bother with the "reset-gpios" phandle index. in __of_reset_control_get()
1038 ret = of_parse_phandle_with_args(node, "reset-gpios", "#gpio-cells", in __of_reset_control_get()
1055 rstc = ERR_PTR(-EPROBE_DEFER); in __of_reset_control_get()
1059 if (WARN_ON(args.args_count != rcdev->of_reset_n_cells)) { in __of_reset_control_get()
1060 rstc = ERR_PTR(-EINVAL); in __of_reset_control_get()
1064 rstc_id = rcdev->of_xlate(rcdev, &args); in __of_reset_control_get()
1092 if (!rcdev->dev) in __reset_controller_by_name()
1095 if (!strcmp(name, dev_name(rcdev->dev))) in __reset_controller_by_name()
1115 if (strcmp(lookup->dev_id, dev_id)) in __reset_control_get_from_lookup()
1118 if ((!con_id && !lookup->con_id) || in __reset_control_get_from_lookup()
1119 ((con_id && lookup->con_id) && in __reset_control_get_from_lookup()
1120 !strcmp(con_id, lookup->con_id))) { in __reset_control_get_from_lookup()
1122 rcdev = __reset_controller_by_name(lookup->provider); in __reset_control_get_from_lookup()
1127 return ERR_PTR(-EPROBE_DEFER); in __reset_control_get_from_lookup()
1133 lookup->index, in __reset_control_get_from_lookup()
1143 return optional ? NULL : ERR_PTR(-ENOENT); in __reset_control_get_from_lookup()
1155 return ERR_PTR(-EINVAL); in __reset_control_get()
1157 if (dev->of_node) in __reset_control_get()
1158 return __of_reset_control_get(dev->of_node, id, index, flags); in __reset_control_get()
1182 while (i--) in __reset_control_bulk_get()
1194 for (i = 0; i < resets->num_rstcs; i++) in reset_control_array_put()
1195 __reset_control_put_internal(resets->rstc[i]); in reset_control_array_put()
1201 * reset_control_put - free the reset controller
1221 * reset_control_bulk_put - free the reset controllers
1228 while (num_rstcs--) in reset_control_bulk_put()
1258 return ERR_PTR(-ENOMEM); in __devm_reset_control_get()
1295 reset_control_bulk_put(devres->num_rstcs, devres->rstcs); in devm_reset_control_bulk_release()
1302 reset_control_bulk_assert(devres->num_rstcs, devres->rstcs); in devm_reset_control_bulk_release_deasserted()
1303 reset_control_bulk_put(devres->num_rstcs, devres->rstcs); in devm_reset_control_bulk_release_deasserted()
1318 return -ENOMEM; in __devm_reset_control_bulk_get()
1337 ptr->num_rstcs = num_rstcs; in __devm_reset_control_bulk_get()
1338 ptr->rstcs = rstcs; in __devm_reset_control_bulk_get()
1346 * __device_reset - find reset controller associated with the device
1366 return optional ? 0 : -ENOENT; in __device_reset()
1369 return -EIO; in __device_reset()
1391 * of_reset_control_get_count - Count number of resets available with a device
1403 return -EINVAL; in of_reset_control_get_count()
1405 count = of_count_phandle_with_args(node, "resets", "#reset-cells"); in of_reset_control_get_count()
1407 count = -ENOENT; in of_reset_control_get_count()
1413 * of_reset_control_array_get - Get a list of reset controls using
1435 return ERR_PTR(-ENOMEM); in of_reset_control_array_get()
1436 resets->num_rstcs = num; in of_reset_control_array_get()
1442 resets->rstc[i] = rstc; in of_reset_control_array_get()
1444 resets->base.array = true; in of_reset_control_array_get()
1446 return &resets->base; in of_reset_control_array_get()
1450 while (--i >= 0) in of_reset_control_array_get()
1451 __reset_control_put_internal(resets->rstc[i]); in of_reset_control_array_get()
1461 * devm_reset_control_array_get - Resource managed reset control array get
1480 return ERR_PTR(-ENOMEM); in devm_reset_control_array_get()
1482 rstc = of_reset_control_array_get(dev->of_node, flags); in devm_reset_control_array_get()
1502 return -EINVAL; in reset_control_get_count_from_lookup()
1508 if (!strcmp(lookup->dev_id, dev_id)) in reset_control_get_count_from_lookup()
1515 count = -ENOENT; in reset_control_get_count_from_lookup()
1521 * reset_control_get_count - Count number of resets available with a device
1530 if (dev->of_node) in reset_control_get_count()
1531 return of_reset_control_get_count(dev->of_node); in reset_control_get_count()