Lines Matching +full:pd +full:- +full:node
1 // SPDX-License-Identifier: GPL-2.0+
18 #include <dm/device-internal.h>
25 #include <dm/uclass-internal.h>
29 #include <power-domain.h>
35 ulong driver_data, ofnode node, in device_bind_common() argument
45 return -EINVAL; in device_bind_common()
47 ret = uclass_get(drv->id, &uc); in device_bind_common()
49 debug("Missing uclass for driver %s\n", drv->name); in device_bind_common()
55 return -ENOMEM; in device_bind_common()
57 INIT_LIST_HEAD(&dev->sibling_node); in device_bind_common()
58 INIT_LIST_HEAD(&dev->child_head); in device_bind_common()
59 INIT_LIST_HEAD(&dev->uclass_node); in device_bind_common()
61 INIT_LIST_HEAD(&dev->devres_head); in device_bind_common()
63 dev->platdata = platdata; in device_bind_common()
64 dev->driver_data = driver_data; in device_bind_common()
65 dev->name = name; in device_bind_common()
66 dev->node = node; in device_bind_common()
67 dev->parent = parent; in device_bind_common()
68 dev->driver = drv; in device_bind_common()
69 dev->uclass = uc; in device_bind_common()
71 dev->seq = -1; in device_bind_common()
72 dev->req_seq = -1; in device_bind_common()
74 (uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS)) { in device_bind_common()
80 * resolved (and ->seq updated) when the device is probed. in device_bind_common()
83 if (uc->uc_drv->name && ofnode_valid(node)) in device_bind_common()
84 dev_read_alias_seq(dev, &dev->req_seq); in device_bind_common()
86 dev->req_seq = uclass_find_next_free_req_seq(drv->id); in device_bind_common()
90 if (drv->platdata_auto_alloc_size) { in device_bind_common()
95 dev->flags |= DM_FLAG_OF_PLATDATA; in device_bind_common()
97 drv->platdata_auto_alloc_size) in device_bind_common()
102 dev->flags |= DM_FLAG_ALLOC_PDATA; in device_bind_common()
103 dev->platdata = calloc(1, in device_bind_common()
104 drv->platdata_auto_alloc_size); in device_bind_common()
105 if (!dev->platdata) { in device_bind_common()
106 ret = -ENOMEM; in device_bind_common()
110 memcpy(dev->platdata, platdata, in device_bind_common()
116 size = uc->uc_drv->per_device_platdata_auto_alloc_size; in device_bind_common()
118 dev->flags |= DM_FLAG_ALLOC_UCLASS_PDATA; in device_bind_common()
119 dev->uclass_platdata = calloc(1, size); in device_bind_common()
120 if (!dev->uclass_platdata) { in device_bind_common()
121 ret = -ENOMEM; in device_bind_common()
127 size = parent->driver->per_child_platdata_auto_alloc_size; in device_bind_common()
129 size = parent->uclass->uc_drv-> in device_bind_common()
133 dev->flags |= DM_FLAG_ALLOC_PARENT_PDATA; in device_bind_common()
134 dev->parent_platdata = calloc(1, size); in device_bind_common()
135 if (!dev->parent_platdata) { in device_bind_common()
136 ret = -ENOMEM; in device_bind_common()
144 list_add_tail(&dev->sibling_node, &parent->child_head); in device_bind_common()
151 if (drv->bind) { in device_bind_common()
152 ret = drv->bind(dev); in device_bind_common()
156 if (parent && parent->driver->child_post_bind) { in device_bind_common()
157 ret = parent->driver->child_post_bind(dev); in device_bind_common()
161 if (uc->uc_drv->post_bind) { in device_bind_common()
162 ret = uc->uc_drv->post_bind(dev); in device_bind_common()
168 pr_debug("Bound device %s to %s\n", dev->name, parent->name); in device_bind_common()
172 dev->flags |= DM_FLAG_BOUND; in device_bind_common()
177 /* There is no child unbind() method, so no clean-up required */ in device_bind_common()
180 if (drv->unbind && drv->unbind(dev)) { in device_bind_common()
182 dev->name); in device_bind_common()
190 dev->name); in device_bind_common()
195 list_del(&dev->sibling_node); in device_bind_common()
196 if (dev->flags & DM_FLAG_ALLOC_PARENT_PDATA) { in device_bind_common()
197 free(dev->parent_platdata); in device_bind_common()
198 dev->parent_platdata = NULL; in device_bind_common()
202 if (dev->flags & DM_FLAG_ALLOC_UCLASS_PDATA) { in device_bind_common()
203 free(dev->uclass_platdata); in device_bind_common()
204 dev->uclass_platdata = NULL; in device_bind_common()
207 if (dev->flags & DM_FLAG_ALLOC_PDATA) { in device_bind_common()
208 free(dev->platdata); in device_bind_common()
209 dev->platdata = NULL; in device_bind_common()
221 ulong driver_data, ofnode node, in device_bind_with_driver_data() argument
224 return device_bind_common(parent, drv, name, NULL, driver_data, node, in device_bind_with_driver_data()
237 const char *name, void *platdata, ofnode node, in device_bind_ofnode() argument
240 return device_bind_common(parent, drv, name, platdata, 0, node, 0, in device_bind_ofnode()
250 drv = lists_driver_lookup_name(info->name); in device_bind_by_name()
252 return -ENOENT; in device_bind_by_name()
253 if (pre_reloc_only && !(drv->flags & DM_FLAG_PRE_RELOC)) in device_bind_by_name()
254 return -EPERM; in device_bind_by_name()
257 platdata_size = info->platdata_size; in device_bind_by_name()
259 return device_bind_common(parent, drv, info->name, in device_bind_by_name()
260 (void *)info->platdata, 0, ofnode_null(), platdata_size, in device_bind_by_name()
291 * use normal flush-after-write, invalidate-before-read in alloc_priv()
310 struct power_domain pd; in device_probe() local
317 return -EINVAL; in device_probe()
319 if (dev->flags & DM_FLAG_ACTIVATED) in device_probe()
322 drv = dev->driver; in device_probe()
326 if (drv->priv_auto_alloc_size && !dev->priv) { in device_probe()
327 dev->priv = alloc_priv(drv->priv_auto_alloc_size, drv->flags); in device_probe()
328 if (!dev->priv) { in device_probe()
329 ret = -ENOMEM; in device_probe()
334 size = dev->uclass->uc_drv->per_device_auto_alloc_size; in device_probe()
335 if (size && !dev->uclass_priv) { in device_probe()
336 dev->uclass_priv = alloc_priv(size, in device_probe()
337 dev->uclass->uc_drv->flags); in device_probe()
338 if (!dev->uclass_priv) { in device_probe()
339 ret = -ENOMEM; in device_probe()
345 if (dev->parent) { in device_probe()
346 size = dev->parent->driver->per_child_auto_alloc_size; in device_probe()
348 size = dev->parent->uclass->uc_drv-> in device_probe()
351 if (size && !dev->parent_priv) { in device_probe()
352 dev->parent_priv = alloc_priv(size, drv->flags); in device_probe()
353 if (!dev->parent_priv) { in device_probe()
354 ret = -ENOMEM; in device_probe()
359 ret = device_probe(dev->parent); in device_probe()
369 if (dev->flags & DM_FLAG_ACTIVATED) in device_probe()
378 dev->seq = seq; in device_probe()
380 dev->flags |= DM_FLAG_ACTIVATED; in device_probe()
388 if (dev->parent && device_get_uclass_id(dev) != UCLASS_PINCTRL) in device_probe()
391 if (dev->parent && device_get_uclass_id(dev) != UCLASS_POWER_DOMAIN) { in device_probe()
392 if (!power_domain_get(dev, &pd)) in device_probe()
393 power_domain_on(&pd); in device_probe()
400 if (dev->parent && dev->parent->driver->child_pre_probe) { in device_probe()
401 ret = dev->parent->driver->child_pre_probe(dev); in device_probe()
406 if (drv->ofdata_to_platdata && dev_has_of_node(dev)) { in device_probe()
407 ret = drv->ofdata_to_platdata(dev); in device_probe()
412 /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ in device_probe()
417 if (drv->probe) { in device_probe()
418 ret = drv->probe(dev); in device_probe()
420 dev->flags &= ~DM_FLAG_ACTIVATED; in device_probe()
429 if (dev->parent && device_get_uclass_id(dev) == UCLASS_PINCTRL) in device_probe()
436 __func__, dev->name); in device_probe()
439 dev->flags &= ~DM_FLAG_ACTIVATED; in device_probe()
441 dev->seq = -1; in device_probe()
454 return dev->platdata; in dev_get_platdata()
464 return dev->parent_platdata; in dev_get_parent_platdata()
474 return dev->uclass_platdata; in dev_get_uclass_platdata()
484 return dev->priv; in dev_get_priv()
494 return dev->uclass_priv; in dev_get_uclass_priv()
504 return dev->parent_priv; in dev_get_parent_priv()
523 * device_find_by_ofnode() - Return device associated with given ofnode
527 * @node: The ofnode for which a associated device should be looked up
529 * Return: 0 if OK, -ve on error
531 static int device_find_by_ofnode(ofnode node, struct udevice **devp) in device_find_by_ofnode() argument
537 list_for_each_entry(uc, &gd->uclass_root, sibling_node) { in device_find_by_ofnode()
538 ret = uclass_find_device_by_ofnode(uc->uc_drv->id, node, in device_find_by_ofnode()
546 return -ENODEV; in device_find_by_ofnode()
553 list_for_each_entry(dev, &parent->child_head, sibling_node) { in device_get_child()
554 if (!index--) in device_get_child()
558 return -ENODEV; in device_get_child()
567 if (seq_or_req_seq == -1) in device_find_child_by_seq()
568 return -ENODEV; in device_find_child_by_seq()
570 list_for_each_entry(dev, &parent->child_head, sibling_node) { in device_find_child_by_seq()
571 if ((find_req_seq ? dev->req_seq : dev->seq) == in device_find_child_by_seq()
578 return -ENODEV; in device_find_child_by_seq()
589 if (ret == -ENODEV) { in device_get_child_by_seq()
606 list_for_each_entry(dev, &parent->child_head, sibling_node) { in device_find_child_by_of_offset()
613 return -ENODEV; in device_find_child_by_of_offset()
616 int device_get_child_by_of_offset(struct udevice *parent, int node, in device_get_child_by_of_offset() argument
623 ret = device_find_child_by_of_offset(parent, node, &dev); in device_get_child_by_of_offset()
635 list_for_each_entry(dev, &parent->child_head, sibling_node) { in _device_find_global_by_ofnode()
646 *devp = _device_find_global_by_ofnode(gd->dm_root, ofnode); in device_find_global_by_ofnode()
648 return *devp ? 0 : -ENOENT; in device_find_global_by_ofnode()
655 dev = _device_find_global_by_ofnode(gd->dm_root, ofnode); in device_get_global_by_ofnode()
656 return device_get_device_tail(dev, dev ? 0 : -ENOENT, devp); in device_get_global_by_ofnode()
661 if (list_empty(&parent->child_head)) { in device_find_first_child()
664 *devp = list_first_entry(&parent->child_head, struct udevice, in device_find_first_child()
674 struct udevice *parent = dev->parent; in device_find_next_child()
676 if (list_is_last(&dev->sibling_node, &parent->child_head)) { in device_find_next_child()
679 *devp = list_entry(dev->sibling_node.next, struct udevice, in device_find_next_child()
693 list_for_each_entry(dev, &parent->child_head, sibling_node) { in device_find_first_inactive_child()
701 return -ENODEV; in device_find_first_inactive_child()
711 list_for_each_entry(dev, &parent->child_head, sibling_node) { in device_find_first_child_by_uclass()
718 return -ENODEV; in device_find_first_child_by_uclass()
728 list_for_each_entry(dev, &parent->child_head, sibling_node) { in device_find_child_by_name()
729 if (!strcmp(dev->name, name)) { in device_find_child_by_name()
735 return -ENODEV; in device_find_child_by_name()
740 return child->parent; in dev_get_parent()
745 return dev->driver_data; in dev_get_driver_data()
750 if (!dev || !dev->driver->ops) in dev_get_driver_ops()
753 return dev->driver->ops; in dev_get_driver_ops()
758 return dev->uclass->uc_drv->id; in device_get_uclass_id()
766 return dev->uclass->uc_drv->name; in dev_get_uclass_name()
771 return !list_empty(&dev->child_head); in device_has_children()
790 struct udevice *parent = dev->parent; in device_is_last_sibling()
794 return list_is_last(&dev->sibling_node, &parent->child_head); in device_is_last_sibling()
799 dev->flags |= DM_FLAG_NAME_ALLOCED; in device_set_name_alloced()
806 return -ENOMEM; in device_set_name()
807 dev->name = name; in device_set_name()
820 const void *fdt = gd->fdt_blob; in of_machine_is_compatible()
828 ofnode node = ofnode_path(path); in dev_disable_by_path() local
833 return -ENOSYS; in dev_disable_by_path()
835 list_for_each_entry(uc, &gd->uclass_root, sibling_node) { in dev_disable_by_path()
836 ret = uclass_find_device_by_ofnode(uc->uc_drv->id, node, &dev); in dev_disable_by_path()
852 return ofnode_set_enabled(node, false); in dev_disable_by_path()
857 ofnode node = ofnode_path(path); in dev_enable_by_path() local
858 ofnode pnode = ofnode_get_parent(node); in dev_enable_by_path()
863 return -ENOSYS; in dev_enable_by_path()
869 ret = ofnode_set_enabled(node, true); in dev_enable_by_path()
873 return lists_bind_fdt(parent, node, NULL, false); in dev_enable_by_path()