Lines Matching +full:de +full:- +full:assertion
1 // SPDX-License-Identifier: GPL-2.0-or-later
24 #include <linux/reset-controller.h>
36 * struct reset_control - a reset control
64 * struct reset_control_array - an array of reset controls
76 * struct reset_gpio_lookup - lookup key for ad-hoc created reset-gpio devices
89 if (rcdev->dev) in rcdev_name()
90 return dev_name(rcdev->dev); in rcdev_name()
92 if (rcdev->of_node) in rcdev_name()
93 return rcdev->of_node->full_name; in rcdev_name()
95 if (rcdev->of_args) in rcdev_name()
96 return rcdev->of_args->np->full_name; in rcdev_name()
102 * of_reset_simple_xlate - translate reset_spec to the reset line number
114 if (reset_spec->args[0] >= rcdev->nr_resets) in of_reset_simple_xlate()
115 return -EINVAL; in of_reset_simple_xlate()
117 return reset_spec->args[0]; in of_reset_simple_xlate()
121 * reset_controller_register - register a reset controller device
126 if (rcdev->of_node && rcdev->of_args) in reset_controller_register()
127 return -EINVAL; in reset_controller_register()
129 if (!rcdev->of_xlate) { in reset_controller_register()
130 rcdev->of_reset_n_cells = 1; in reset_controller_register()
131 rcdev->of_xlate = of_reset_simple_xlate; in reset_controller_register()
134 INIT_LIST_HEAD(&rcdev->reset_control_head); in reset_controller_register()
137 list_add(&rcdev->list, &reset_controller_list); in reset_controller_register()
145 * reset_controller_unregister - unregister a reset controller device
151 list_del(&rcdev->list); in reset_controller_unregister()
162 * devm_reset_controller_register - resource managed reset_controller_register()
179 return -ENOMEM; in devm_reset_controller_register()
203 for (i = 0; i < resets->num_rstcs; i++) { in reset_control_array_reset()
204 ret = reset_control_reset(resets->rstc[i]); in reset_control_array_reset()
217 for (i = 0; i < resets->num_rstcs; i++) { in reset_control_array_rearm()
218 rstc = resets->rstc[i]; in reset_control_array_rearm()
224 return -EINVAL; in reset_control_array_rearm()
226 if (rstc->shared) { in reset_control_array_rearm()
227 if (WARN_ON(atomic_read(&rstc->deassert_count) != 0)) in reset_control_array_rearm()
228 return -EINVAL; in reset_control_array_rearm()
230 if (!rstc->acquired) in reset_control_array_rearm()
231 return -EPERM; in reset_control_array_rearm()
235 for (i = 0; i < resets->num_rstcs; i++) { in reset_control_array_rearm()
236 rstc = resets->rstc[i]; in reset_control_array_rearm()
238 if (rstc && rstc->shared) in reset_control_array_rearm()
239 WARN_ON(atomic_dec_return(&rstc->triggered_count) < 0); in reset_control_array_rearm()
249 for (i = 0; i < resets->num_rstcs; i++) { in reset_control_array_assert()
250 ret = reset_control_assert(resets->rstc[i]); in reset_control_array_assert()
258 while (i--) in reset_control_array_assert()
259 reset_control_deassert(resets->rstc[i]); in reset_control_array_assert()
267 for (i = 0; i < resets->num_rstcs; i++) { in reset_control_array_deassert()
268 ret = reset_control_deassert(resets->rstc[i]); in reset_control_array_deassert()
276 while (i--) in reset_control_array_deassert()
277 reset_control_assert(resets->rstc[i]); in reset_control_array_deassert()
286 for (i = 0; i < resets->num_rstcs; i++) { in reset_control_array_acquire()
287 err = reset_control_acquire(resets->rstc[i]); in reset_control_array_acquire()
295 while (i--) in reset_control_array_acquire()
296 reset_control_release(resets->rstc[i]); in reset_control_array_acquire()
305 for (i = 0; i < resets->num_rstcs; i++) in reset_control_array_release()
306 reset_control_release(resets->rstc[i]); in reset_control_array_release()
311 return rstc->array; in reset_control_is_array()
315 * reset_control_reset - reset the controlled device
320 * a no-op.
321 * Consumers must not use reset_control_(de)assert on shared reset lines when
335 return -EINVAL; in reset_control_reset()
340 if (!rstc->rcdev->ops->reset) in reset_control_reset()
341 return -ENOTSUPP; in reset_control_reset()
343 if (rstc->shared) { in reset_control_reset()
344 if (WARN_ON(atomic_read(&rstc->deassert_count) != 0)) in reset_control_reset()
345 return -EINVAL; in reset_control_reset()
347 if (atomic_inc_return(&rstc->triggered_count) != 1) in reset_control_reset()
350 if (!rstc->acquired) in reset_control_reset()
351 return -EPERM; in reset_control_reset()
354 ret = rstc->rcdev->ops->reset(rstc->rcdev, rstc->id); in reset_control_reset()
355 if (rstc->shared && ret) in reset_control_reset()
356 atomic_dec(&rstc->triggered_count); in reset_control_reset()
363 * reset_control_bulk_reset - reset the controlled devices in order
387 * reset_control_rearm - allow shared reset line to be re-triggered"
396 * Consumers must not use reset_control_(de)assert on shared reset lines when
407 return -EINVAL; in reset_control_rearm()
412 if (rstc->shared) { in reset_control_rearm()
413 if (WARN_ON(atomic_read(&rstc->deassert_count) != 0)) in reset_control_rearm()
414 return -EINVAL; in reset_control_rearm()
416 WARN_ON(atomic_dec_return(&rstc->triggered_count) < 0); in reset_control_rearm()
418 if (!rstc->acquired) in reset_control_rearm()
419 return -EPERM; in reset_control_rearm()
427 * reset_control_assert - asserts the reset line
437 * reset_control_(de)assert has been used.
448 return -EINVAL; in reset_control_assert()
453 if (rstc->shared) { in reset_control_assert()
454 if (WARN_ON(atomic_read(&rstc->triggered_count) != 0)) in reset_control_assert()
455 return -EINVAL; in reset_control_assert()
457 if (WARN_ON(atomic_read(&rstc->deassert_count) == 0)) in reset_control_assert()
458 return -EINVAL; in reset_control_assert()
460 if (atomic_dec_return(&rstc->deassert_count) != 0) in reset_control_assert()
467 if (!rstc->rcdev->ops->assert) in reset_control_assert()
475 if (!rstc->rcdev->ops->assert) in reset_control_assert()
476 return -ENOTSUPP; in reset_control_assert()
478 if (!rstc->acquired) { in reset_control_assert()
480 rcdev_name(rstc->rcdev), rstc->id); in reset_control_assert()
481 return -EPERM; in reset_control_assert()
485 return rstc->rcdev->ops->assert(rstc->rcdev, rstc->id); in reset_control_assert()
490 * reset_control_bulk_assert - asserts the reset lines in order
495 * If an assertion fails, already asserted resets are deasserted again.
513 while (i--) in reset_control_bulk_assert()
520 * reset_control_deassert - deasserts the reset line
525 * reset_control_(de)assert has been used.
536 return -EINVAL; in reset_control_deassert()
541 if (rstc->shared) { in reset_control_deassert()
542 if (WARN_ON(atomic_read(&rstc->triggered_count) != 0)) in reset_control_deassert()
543 return -EINVAL; in reset_control_deassert()
545 if (atomic_inc_return(&rstc->deassert_count) != 1) in reset_control_deassert()
548 if (!rstc->acquired) { in reset_control_deassert()
550 rcdev_name(rstc->rcdev), rstc->id); in reset_control_deassert()
551 return -EPERM; in reset_control_deassert()
557 * that it handles self-deasserting reset lines via .reset(). In that in reset_control_deassert()
560 * return -ENOTSUPP. in reset_control_deassert()
562 if (!rstc->rcdev->ops->deassert) in reset_control_deassert()
565 return rstc->rcdev->ops->deassert(rstc->rcdev, rstc->id); in reset_control_deassert()
570 * reset_control_bulk_deassert - deasserts the reset lines in reverse order
584 for (i = num_rstcs - 1; i >= 0; i--) { in reset_control_bulk_deassert()
600 * reset_control_status - returns a negative errno if not supported, a
611 return -EINVAL; in reset_control_status()
613 if (rstc->rcdev->ops->status) in reset_control_status()
614 return rstc->rcdev->ops->status(rstc->rcdev, rstc->id); in reset_control_status()
616 return -ENOTSUPP; in reset_control_status()
621 * reset_control_acquire() - acquires a reset control for exclusive use
648 return -EINVAL; in reset_control_acquire()
655 if (rstc->acquired) { in reset_control_acquire()
660 list_for_each_entry(rc, &rstc->rcdev->reset_control_head, list) { in reset_control_acquire()
661 if (rstc != rc && rstc->id == rc->id) { in reset_control_acquire()
662 if (rc->acquired) { in reset_control_acquire()
664 return -EBUSY; in reset_control_acquire()
669 rstc->acquired = true; in reset_control_acquire()
677 * reset_control_bulk_acquire - acquires reset controls for exclusive use
700 while (i--) in reset_control_bulk_acquire()
707 * reset_control_release() - releases exclusive access to a reset control
724 rstc->acquired = false; in reset_control_release()
729 * reset_control_bulk_release() - releases exclusive access to reset controls
761 return ERR_PTR(-EINVAL); in __reset_control_get_internal()
763 list_for_each_entry(rstc, &rcdev->reset_control_head, list) { in __reset_control_get_internal()
764 if (rstc->id == index) { in __reset_control_get_internal()
770 if (!rstc->shared && !shared && !acquired) in __reset_control_get_internal()
773 if (WARN_ON(!rstc->shared || !shared)) in __reset_control_get_internal()
774 return ERR_PTR(-EBUSY); in __reset_control_get_internal()
776 kref_get(&rstc->refcnt); in __reset_control_get_internal()
783 return ERR_PTR(-ENOMEM); in __reset_control_get_internal()
785 if (!try_module_get(rcdev->owner)) { in __reset_control_get_internal()
787 return ERR_PTR(-ENODEV); in __reset_control_get_internal()
790 rstc->rcdev = rcdev; in __reset_control_get_internal()
791 list_add(&rstc->list, &rcdev->reset_control_head); in __reset_control_get_internal()
792 rstc->id = index; in __reset_control_get_internal()
793 kref_init(&rstc->refcnt); in __reset_control_get_internal()
794 rstc->acquired = acquired; in __reset_control_get_internal()
795 rstc->shared = shared; in __reset_control_get_internal()
796 get_device(rcdev->dev); in __reset_control_get_internal()
808 module_put(rstc->rcdev->owner); in __reset_control_release()
810 list_del(&rstc->list); in __reset_control_release()
811 put_device(rstc->rcdev->dev); in __reset_control_release()
822 kref_put(&rstc->refcnt, __reset_control_release); in __reset_control_put_internal()
841 return -ENOMEM; in reset_add_gpio_aux_device()
843 adev->id = id; in reset_add_gpio_aux_device()
844 adev->name = "gpio"; in reset_add_gpio_aux_device()
845 adev->dev.parent = parent; in reset_add_gpio_aux_device()
846 adev->dev.platform_data = pdata; in reset_add_gpio_aux_device()
847 adev->dev.release = reset_gpio_aux_device_release; in reset_add_gpio_aux_device()
848 device_set_node(&adev->dev, swnode); in reset_add_gpio_aux_device()
878 * Currently only #gpio-cells=2 is supported with the meaning of: in __reset_add_reset_gpio_device()
883 if (args->args_count != 2) in __reset_add_reset_gpio_device()
884 return -ENOENT; in __reset_add_reset_gpio_device()
887 * Registering reset-gpio device might cause immediate in __reset_add_reset_gpio_device()
893 offset = args->args[0]; in __reset_add_reset_gpio_device()
894 of_flags = args->args[1]; in __reset_add_reset_gpio_device()
898 * constants from include/dt-bindings/gpio/gpio.h and in __reset_add_reset_gpio_device()
905 pr_err("reset-gpio code does not support GPIO flags %u for GPIO %u\n", in __reset_add_reset_gpio_device()
907 return -EINVAL; in __reset_add_reset_gpio_device()
911 gpio_device_find_by_fwnode(of_fwnode_handle(args->np)); in __reset_add_reset_gpio_device()
913 return -EPROBE_DEFER; in __reset_add_reset_gpio_device()
918 if (args->np == rgpio_dev->of_args.np) { in __reset_add_reset_gpio_device()
919 if (of_phandle_args_equal(args, &rgpio_dev->of_args)) in __reset_add_reset_gpio_device()
926 properties[0] = PROPERTY_ENTRY_GPIO("reset-gpios", parent->fwnode, offset, lflags); in __reset_add_reset_gpio_device()
935 ret = -ENOMEM; in __reset_add_reset_gpio_device()
939 rgpio_dev->of_args = *args; in __reset_add_reset_gpio_device()
945 of_node_get(rgpio_dev->of_args.np); in __reset_add_reset_gpio_device()
947 rgpio_dev->swnode = fwnode_create_software_node(properties, NULL); in __reset_add_reset_gpio_device()
948 if (IS_ERR(rgpio_dev->swnode)) { in __reset_add_reset_gpio_device()
949 ret = PTR_ERR(rgpio_dev->swnode); in __reset_add_reset_gpio_device()
953 ret = reset_add_gpio_aux_device(parent, rgpio_dev->swnode, id, in __reset_add_reset_gpio_device()
954 &rgpio_dev->of_args); in __reset_add_reset_gpio_device()
958 list_add(&rgpio_dev->list, &reset_gpio_lookup_list); in __reset_add_reset_gpio_device()
963 fwnode_remove_software_node(rgpio_dev->swnode); in __reset_add_reset_gpio_device()
965 of_node_put(rgpio_dev->of_args.np); in __reset_add_reset_gpio_device()
982 if (rcdev->of_args && of_phandle_args_equal(args, in __reset_find_rcdev()
983 rcdev->of_args)) in __reset_find_rcdev()
986 if (args->np == rcdev->of_node) in __reset_find_rcdev()
1007 return ERR_PTR(-EINVAL); in __of_reset_control_get()
1011 "reset-names", id); in __of_reset_control_get()
1012 if (index == -EILSEQ) in __of_reset_control_get()
1015 return optional ? NULL : ERR_PTR(-ENOENT); in __of_reset_control_get()
1018 ret = of_parse_phandle_with_args(node, "resets", "#reset-cells", in __of_reset_control_get()
1020 if (ret == -EINVAL) in __of_reset_control_get()
1027 * There can be only one reset-gpio for regular devices, so in __of_reset_control_get()
1028 * don't bother with the "reset-gpios" phandle index. in __of_reset_control_get()
1030 ret = of_parse_phandle_with_args(node, "reset-gpios", "#gpio-cells", in __of_reset_control_get()
1047 rstc = ERR_PTR(-EPROBE_DEFER); in __of_reset_control_get()
1051 if (WARN_ON(args.args_count != rcdev->of_reset_n_cells)) { in __of_reset_control_get()
1052 rstc = ERR_PTR(-EINVAL); in __of_reset_control_get()
1056 rstc_id = rcdev->of_xlate(rcdev, &args); in __of_reset_control_get()
1084 return ERR_PTR(-EINVAL); in __reset_control_get()
1086 if (dev->of_node) in __reset_control_get()
1087 return __of_reset_control_get(dev->of_node, id, index, flags); in __reset_control_get()
1089 return optional ? NULL : ERR_PTR(-ENOENT); in __reset_control_get()
1111 while (i--) in __reset_control_bulk_get()
1123 for (i = 0; i < resets->num_rstcs; i++) in reset_control_array_put()
1124 __reset_control_put_internal(resets->rstc[i]); in reset_control_array_put()
1130 * reset_control_put - free the reset controller
1150 * reset_control_bulk_put - free the reset controllers
1157 while (num_rstcs--) in reset_control_bulk_put()
1187 return ERR_PTR(-ENOMEM); in __devm_reset_control_get()
1224 reset_control_bulk_put(devres->num_rstcs, devres->rstcs); in devm_reset_control_bulk_release()
1231 reset_control_bulk_assert(devres->num_rstcs, devres->rstcs); in devm_reset_control_bulk_release_deasserted()
1232 reset_control_bulk_put(devres->num_rstcs, devres->rstcs); in devm_reset_control_bulk_release_deasserted()
1247 return -ENOMEM; in __devm_reset_control_bulk_get()
1266 ptr->num_rstcs = num_rstcs; in __devm_reset_control_bulk_get()
1267 ptr->rstcs = rstcs; in __devm_reset_control_bulk_get()
1275 * __device_reset - find reset controller associated with the device
1295 return optional ? 0 : -ENOENT; in __device_reset()
1298 return -EIO; in __device_reset()
1320 * of_reset_control_get_count - Count number of resets available with a device
1332 return -EINVAL; in of_reset_control_get_count()
1334 count = of_count_phandle_with_args(node, "resets", "#reset-cells"); in of_reset_control_get_count()
1336 count = -ENOENT; in of_reset_control_get_count()
1342 * of_reset_control_array_get - Get a list of reset controls using
1364 return ERR_PTR(-ENOMEM); in of_reset_control_array_get()
1365 resets->num_rstcs = num; in of_reset_control_array_get()
1371 resets->rstc[i] = rstc; in of_reset_control_array_get()
1373 resets->base.array = true; in of_reset_control_array_get()
1375 return &resets->base; in of_reset_control_array_get()
1379 while (--i >= 0) in of_reset_control_array_get()
1380 __reset_control_put_internal(resets->rstc[i]); in of_reset_control_array_get()
1390 * devm_reset_control_array_get - Resource managed reset control array get
1409 return ERR_PTR(-ENOMEM); in devm_reset_control_array_get()
1411 rstc = of_reset_control_array_get(dev->of_node, flags); in devm_reset_control_array_get()
1425 * reset_control_get_count - Count number of resets available with a device
1434 if (dev->of_node) in reset_control_get_count()
1435 return of_reset_control_get_count(dev->of_node); in reset_control_get_count()
1437 return -ENOENT; in reset_control_get_count()