Lines Matching +full:- +full:- +full:id
7 * SPDX-License-Identifier: GPL-2.0+
15 #include <dm/device-internal.h>
18 #include <dm/uclass-internal.h>
27 if (!gd->dm_root) in uclass_find()
32 * id to node. in uclass_find()
34 list_for_each_entry(uc, &gd->uclass_root, sibling_node) { in uclass_find()
35 if (uc->uc_drv->id == key) in uclass_find()
38 if (uc->uc_drv->id == UCLASS_ROOT) in uclass_find()
46 * uclass_add() - Create new uclass in list
47 * @id: Id number to create
49 * @return 0 on success, -ve on error
52 * each id.
54 static int uclass_add(enum uclass_id id, struct uclass **ucp) in uclass_add() argument
61 uc_drv = lists_uclass_lookup(id); in uclass_add()
63 …debug("Cannot find uclass for id %d: please add the UCLASS_DRIVER() declaration for this UCLASS_..… in uclass_add()
64 id); in uclass_add()
70 return -EPFNOSUPPORT; in uclass_add()
74 return -ENOMEM; in uclass_add()
75 if (uc_drv->priv_auto_alloc_size) { in uclass_add()
76 uc->priv = calloc(1, uc_drv->priv_auto_alloc_size); in uclass_add()
77 if (!uc->priv) { in uclass_add()
78 ret = -ENOMEM; in uclass_add()
82 uc->uc_drv = uc_drv; in uclass_add()
84 uc->u_boot_dev_head = NULL; in uclass_add()
86 INIT_LIST_HEAD(&uc->sibling_node); in uclass_add()
87 INIT_LIST_HEAD(&uc->dev_head); in uclass_add()
88 list_add(&uc->sibling_node, &DM_UCLASS_ROOT_NON_CONST); in uclass_add()
90 if (uc_drv->init) { in uclass_add()
91 ret = uc_drv->init(uc); in uclass_add()
100 if (uc_drv->priv_auto_alloc_size) { in uclass_add()
101 free(uc->priv); in uclass_add()
102 uc->priv = NULL; in uclass_add()
104 list_del(&uc->sibling_node); in uclass_add()
123 while (!list_empty(&uc->dev_head)) { in uclass_destroy()
124 dev = list_first_entry(&uc->dev_head, struct udevice, in uclass_destroy()
134 uc_drv = uc->uc_drv; in uclass_destroy()
135 if (uc_drv->destroy) in uclass_destroy()
136 uc_drv->destroy(uc); in uclass_destroy()
137 list_del(&uc->sibling_node); in uclass_destroy()
138 if (uc_drv->priv_auto_alloc_size) in uclass_destroy()
139 free(uc->priv); in uclass_destroy()
145 int uclass_get(enum uclass_id id, struct uclass **ucp) in uclass_get() argument
150 uc = uclass_find(id); in uclass_get()
152 return uclass_add(id, ucp); in uclass_get()
158 const char *uclass_get_name(enum uclass_id id) in uclass_get_name() argument
162 if (uclass_get(id, &uc)) in uclass_get_name()
164 return uc->uc_drv->name; in uclass_get_name()
174 if (uc_drv && !strcmp(uc_drv->name, name)) in uclass_get_by_name()
181 int uclass_find_device(enum uclass_id id, int index, struct udevice **devp) in uclass_find_device() argument
188 ret = uclass_get(id, &uc); in uclass_find_device()
191 if (list_empty(&uc->dev_head)) in uclass_find_device()
192 return -ENODEV; in uclass_find_device()
194 list_for_each_entry(dev, &uc->dev_head, uclass_node) { in uclass_find_device()
195 if (!index--) { in uclass_find_device()
201 return -ENODEV; in uclass_find_device()
204 int uclass_find_first_device(enum uclass_id id, struct udevice **devp) in uclass_find_first_device() argument
210 ret = uclass_get(id, &uc); in uclass_find_first_device()
213 if (list_empty(&uc->dev_head)) in uclass_find_first_device()
216 *devp = list_first_entry(&uc->dev_head, struct udevice, uclass_node); in uclass_find_first_device()
226 if (list_is_last(&dev->uclass_node, &dev->uclass->dev_head)) in uclass_find_next_device()
229 *devp = list_entry(dev->uclass_node.next, struct udevice, uclass_node); in uclass_find_next_device()
234 int uclass_find_device_by_name(enum uclass_id id, const char *name, in uclass_find_device_by_name() argument
243 return -EINVAL; in uclass_find_device_by_name()
244 ret = uclass_get(id, &uc); in uclass_find_device_by_name()
248 list_for_each_entry(dev, &uc->dev_head, uclass_node) { in uclass_find_device_by_name()
249 if (!strncmp(dev->name, name, strlen(name))) { in uclass_find_device_by_name()
255 return -ENODEV; in uclass_find_device_by_name()
258 int uclass_find_device_by_seq(enum uclass_id id, int seq_or_req_seq, in uclass_find_device_by_seq() argument
267 if (seq_or_req_seq == -1) in uclass_find_device_by_seq()
268 return -ENODEV; in uclass_find_device_by_seq()
269 ret = uclass_get(id, &uc); in uclass_find_device_by_seq()
273 list_for_each_entry(dev, &uc->dev_head, uclass_node) { in uclass_find_device_by_seq()
274 pr_debug(" - %d %d '%s'\n", dev->req_seq, dev->seq, dev->name); in uclass_find_device_by_seq()
275 if ((find_req_seq ? dev->req_seq : dev->seq) == in uclass_find_device_by_seq()
278 pr_debug(" - found\n"); in uclass_find_device_by_seq()
282 pr_debug(" - not found\n"); in uclass_find_device_by_seq()
284 return -ENODEV; in uclass_find_device_by_seq()
287 int uclass_find_device_by_of_offset(enum uclass_id id, int node, in uclass_find_device_by_of_offset() argument
296 return -ENODEV; in uclass_find_device_by_of_offset()
297 ret = uclass_get(id, &uc); in uclass_find_device_by_of_offset()
301 list_for_each_entry(dev, &uc->dev_head, uclass_node) { in uclass_find_device_by_of_offset()
308 return -ENODEV; in uclass_find_device_by_of_offset()
311 int uclass_find_device_by_ofnode(enum uclass_id id, ofnode node, in uclass_find_device_by_ofnode() argument
320 return -ENODEV; in uclass_find_device_by_ofnode()
321 ret = uclass_get(id, &uc); in uclass_find_device_by_ofnode()
325 list_for_each_entry(dev, &uc->dev_head, uclass_node) { in uclass_find_device_by_ofnode()
332 return -ENODEV; in uclass_find_device_by_ofnode()
336 static int uclass_find_device_by_phandle(enum uclass_id id, in uclass_find_device_by_phandle() argument
347 find_phandle = dev_read_u32_default(parent, name, -1); in uclass_find_device_by_phandle()
349 return -ENOENT; in uclass_find_device_by_phandle()
350 ret = uclass_get(id, &uc); in uclass_find_device_by_phandle()
354 list_for_each_entry(dev, &uc->dev_head, uclass_node) { in uclass_find_device_by_phandle()
365 return -ENODEV; in uclass_find_device_by_phandle()
369 int uclass_get_device_by_driver(enum uclass_id id, in uclass_get_device_by_driver() argument
377 ret = uclass_get(id, &uc); in uclass_get_device_by_driver()
381 list_for_each_entry(dev, &uc->dev_head, uclass_node) { in uclass_get_device_by_driver()
382 if (dev->driver == find_drv) in uclass_get_device_by_driver()
386 return -ENODEV; in uclass_get_device_by_driver()
404 int uclass_get_device(enum uclass_id id, int index, struct udevice **devp) in uclass_get_device() argument
410 ret = uclass_find_device(id, index, &dev); in uclass_get_device()
414 int uclass_get_device_by_name(enum uclass_id id, const char *name, in uclass_get_device_by_name() argument
421 ret = uclass_find_device_by_name(id, name, &dev); in uclass_get_device_by_name()
425 int uclass_get_device_by_seq(enum uclass_id id, int seq, struct udevice **devp) in uclass_get_device_by_seq() argument
431 ret = uclass_find_device_by_seq(id, seq, false, &dev); in uclass_get_device_by_seq()
432 if (ret == -ENODEV) { in uclass_get_device_by_seq()
437 ret = uclass_find_device_by_seq(id, seq, true, &dev); in uclass_get_device_by_seq()
442 int uclass_get_device_by_of_offset(enum uclass_id id, int node, in uclass_get_device_by_of_offset() argument
449 ret = uclass_find_device_by_of_offset(id, node, &dev); in uclass_get_device_by_of_offset()
453 int uclass_get_device_by_ofnode(enum uclass_id id, ofnode node, in uclass_get_device_by_ofnode() argument
460 ret = uclass_find_device_by_ofnode(id, node, &dev); in uclass_get_device_by_ofnode()
466 int uclass_get_device_by_phandle_id(enum uclass_id id, uint phandle_id, in uclass_get_device_by_phandle_id() argument
474 ret = uclass_get(id, &uc); in uclass_get_device_by_phandle_id()
478 ret = -ENODEV; in uclass_get_device_by_phandle_id()
479 list_for_each_entry(dev, &uc->dev_head, uclass_node) { in uclass_get_device_by_phandle_id()
494 int uclass_get_device_by_phandle(enum uclass_id id, struct udevice *parent, in uclass_get_device_by_phandle() argument
501 ret = uclass_find_device_by_phandle(id, parent, name, &dev); in uclass_get_device_by_phandle()
519 void uclass_first_device(enum uclass_id id, struct udevice **devp) in uclass_first_device() argument
523 uclass_find_first_device(id, &dev); in uclass_first_device()
535 int uclass_first_device_err(enum uclass_id id, struct udevice **devp) in uclass_first_device_err() argument
539 ret = uclass_first_device_check(id, devp); in uclass_first_device_err()
543 return -ENODEV; in uclass_first_device_err()
556 return -ENODEV; in uclass_next_device_err()
561 int uclass_first_device_check(enum uclass_id id, struct udevice **devp) in uclass_first_device_check() argument
566 ret = uclass_find_first_device(id, devp); in uclass_first_device_check()
588 int uclass_first_device_drvdata(enum uclass_id id, ulong driver_data, in uclass_first_device_drvdata() argument
594 uclass_id_foreach_dev(id, dev, uc) { in uclass_first_device_drvdata()
602 return -ENODEV; in uclass_first_device_drvdata()
610 uc = dev->uclass; in uclass_bind_device()
613 list_add_tail(&dev->uclass_node, &uc->dev_head); in uclass_bind_device()
615 list_add_tail(&dev->uclass_node, uc->u_boot_dev_head); in uclass_bind_device()
617 list_add_tail(&dev->uclass_node, &uc->dev_head); in uclass_bind_device()
619 if (dev->parent) { in uclass_bind_device()
620 struct uclass_driver *uc_drv = dev->parent->uclass->uc_drv; in uclass_bind_device()
622 if (uc_drv->child_post_bind) { in uclass_bind_device()
623 ret = uc_drv->child_post_bind(dev); in uclass_bind_device()
632 list_del(&dev->uclass_node); in uclass_bind_device()
643 uc = dev->uclass; in uclass_unbind_device()
644 if (uc->uc_drv->pre_unbind) { in uclass_unbind_device()
645 ret = uc->uc_drv->pre_unbind(dev); in uclass_unbind_device()
650 list_del(&dev->uclass_node); in uclass_unbind_device()
661 assert(dev->seq == -1); in uclass_resolve_seq()
662 ret = uclass_find_device_by_seq(dev->uclass->uc_drv->id, dev->req_seq, in uclass_resolve_seq()
666 dev->name, dev->req_seq, dup->name); in uclass_resolve_seq()
667 } else if (ret == -ENODEV) { in uclass_resolve_seq()
669 if (dev->req_seq != -1) in uclass_resolve_seq()
670 return dev->req_seq; in uclass_resolve_seq()
676 ret = uclass_find_device_by_seq(dev->uclass->uc_drv->id, seq, in uclass_resolve_seq()
678 if (ret == -ENODEV) in uclass_resolve_seq()
691 uc_drv = dev->uclass->uc_drv; in uclass_pre_probe_device()
692 if (uc_drv->pre_probe) { in uclass_pre_probe_device()
693 ret = uc_drv->pre_probe(dev); in uclass_pre_probe_device()
698 if (!dev->parent) in uclass_pre_probe_device()
700 uc_drv = dev->parent->uclass->uc_drv; in uclass_pre_probe_device()
701 if (uc_drv->child_pre_probe) in uclass_pre_probe_device()
702 return uc_drv->child_pre_probe(dev); in uclass_pre_probe_device()
709 struct uclass_driver *uc_drv = dev->uclass->uc_drv; in uclass_post_probe_device()
711 if (uc_drv->post_probe) in uclass_post_probe_device()
712 return uc_drv->post_probe(dev); in uclass_post_probe_device()
723 uc = dev->uclass; in uclass_pre_remove_device()
724 if (uc->uc_drv->pre_remove) { in uclass_pre_remove_device()
725 ret = uc->uc_drv->pre_remove(dev); in uclass_pre_remove_device()
735 .id = UCLASS_NOP,