1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright (c) 2013 Google, Inc
8 * Pavel Herrmann <morpheus.ibis@gmail.com>
15 #include <asm/global_data.h>
19 #include <fdt_support.h>
21 #include <asm/cache.h>
22 #include <dm/device.h>
23 #include <dm/device-internal.h>
25 #include <dm/of_access.h>
26 #include <dm/pinctrl.h>
27 #include <dm/platdata.h>
29 #include <dm/uclass.h>
30 #include <dm/uclass-internal.h>
33 #include <linux/err.h>
34 #include <linux/list.h>
35 #include <power-domain.h>
37 DECLARE_GLOBAL_DATA_PTR;
39 static int device_bind_common(struct udevice *parent, const struct driver *drv,
40 const char *name, void *plat,
41 ulong driver_data, ofnode node,
42 uint of_plat_size, struct udevice **devp)
50 if (CONFIG_IS_ENABLED(OF_PLATDATA_NO_BIND))
58 ret = uclass_get(drv->id, &uc);
60 debug("Missing uclass for driver %s\n", drv->name);
64 dev = calloc(1, sizeof(struct udevice));
68 INIT_LIST_HEAD(&dev->sibling_node);
69 INIT_LIST_HEAD(&dev->child_head);
70 INIT_LIST_HEAD(&dev->uclass_node);
71 #if CONFIG_IS_ENABLED(DEVRES)
72 INIT_LIST_HEAD(&dev->devres_head);
74 dev_set_plat(dev, plat);
75 dev->driver_data = driver_data;
77 dev_set_ofnode(dev, node);
83 if (CONFIG_IS_ENABLED(DM_SEQ_ALIAS) &&
84 (uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS)) {
86 * Some devices, such as a SPI bus, I2C bus and serial ports
87 * are numbered using aliases.
89 if (CONFIG_IS_ENABLED(OF_CONTROL) &&
90 !CONFIG_IS_ENABLED(OF_PLATDATA)) {
91 if (uc->uc_drv->name && ofnode_valid(node)) {
92 if (!dev_read_alias_seq(dev, &dev->seq_)) {
94 log_debug(" - seq=%d\n", dev->seq_);
99 if (auto_seq && !(uc->uc_drv->flags & DM_UC_FLAG_NO_AUTO_SEQ))
100 dev->seq_ = uclass_find_next_free_seq(uc);
102 /* Check if we need to allocate plat */
103 if (drv->plat_auto) {
107 * For of-platdata, we try use the existing data, but if
108 * plat_auto is larger, we must allocate a new space
110 if (CONFIG_IS_ENABLED(OF_PLATDATA)) {
112 dev_or_flags(dev, DM_FLAG_OF_PLATDATA);
113 if (of_plat_size < drv->plat_auto)
117 dev_or_flags(dev, DM_FLAG_ALLOC_PDATA);
118 ptr = calloc(1, drv->plat_auto);
125 * For of-platdata, copy the old plat into the new
128 if (CONFIG_IS_ENABLED(OF_PLATDATA) && plat)
129 memcpy(ptr, plat, of_plat_size);
130 dev_set_plat(dev, ptr);
134 size = uc->uc_drv->per_device_plat_auto;
136 dev_or_flags(dev, DM_FLAG_ALLOC_UCLASS_PDATA);
137 ptr = calloc(1, size);
142 dev_set_uclass_plat(dev, ptr);
146 size = parent->driver->per_child_plat_auto;
148 size = parent->uclass->uc_drv->per_child_plat_auto;
150 dev_or_flags(dev, DM_FLAG_ALLOC_PARENT_PDATA);
151 ptr = calloc(1, size);
156 dev_set_parent_plat(dev, ptr);
158 /* put dev into parent's successor list */
159 list_add_tail(&dev->sibling_node, &parent->child_head);
162 ret = uclass_bind_device(dev);
164 goto fail_uclass_bind;
166 /* if we fail to bind we remove device from successors and free it */
168 ret = drv->bind(dev);
172 if (parent && parent->driver->child_post_bind) {
173 ret = parent->driver->child_post_bind(dev);
175 goto fail_child_post_bind;
177 if (uc->uc_drv->post_bind) {
178 ret = uc->uc_drv->post_bind(dev);
180 goto fail_uclass_post_bind;
184 pr_debug("Bound device %s to %s\n", dev->name, parent->name);
188 dev_or_flags(dev, DM_FLAG_BOUND);
192 fail_uclass_post_bind:
193 /* There is no child unbind() method, so no clean-up required */
194 fail_child_post_bind:
195 if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
196 if (drv->unbind && drv->unbind(dev)) {
197 dm_warn("unbind() method failed on dev '%s' on error path\n",
203 if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
204 if (uclass_unbind_device(dev)) {
205 dm_warn("Failed to unbind dev '%s' on error path\n",
210 if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
211 list_del(&dev->sibling_node);
212 if (dev_get_flags(dev) & DM_FLAG_ALLOC_PARENT_PDATA) {
213 free(dev_get_parent_plat(dev));
214 dev_set_parent_plat(dev, NULL);
218 if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
219 if (dev_get_flags(dev) & DM_FLAG_ALLOC_UCLASS_PDATA) {
220 free(dev_get_uclass_plat(dev));
221 dev_set_uclass_plat(dev, NULL);
225 if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
226 if (dev_get_flags(dev) & DM_FLAG_ALLOC_PDATA) {
227 free(dev_get_plat(dev));
228 dev_set_plat(dev, NULL);
232 devres_release_all(dev);
239 int device_bind_with_driver_data(struct udevice *parent,
240 const struct driver *drv, const char *name,
241 ulong driver_data, ofnode node,
242 struct udevice **devp)
244 return device_bind_common(parent, drv, name, NULL, driver_data, node,
248 int device_bind(struct udevice *parent, const struct driver *drv,
249 const char *name, void *plat, ofnode node,
250 struct udevice **devp)
252 return device_bind_common(parent, drv, name, plat, 0, node, 0,
256 int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
257 const struct driver_info *info, struct udevice **devp)
263 drv = lists_driver_lookup_name(info->name);
266 if (pre_reloc_only && !(drv->flags & DM_FLAG_PRE_RELOC))
269 #if CONFIG_IS_ENABLED(OF_PLATDATA)
270 plat_size = info->plat_size;
272 ret = device_bind_common(parent, drv, info->name, (void *)info->plat, 0,
273 ofnode_null(), plat_size, devp);
280 int device_reparent(struct udevice *dev, struct udevice *new_parent)
282 struct udevice *pos, *n;
287 device_foreach_child_safe(pos, n, dev->parent) {
288 if (pos->driver != dev->driver)
291 list_del(&dev->sibling_node);
292 list_add_tail(&dev->sibling_node, &new_parent->child_head);
293 dev->parent = new_parent;
301 static void *alloc_priv(int size, uint flags)
305 if (flags & DM_FLAG_ALLOC_PRIV_DMA) {
306 size = ROUND(size, ARCH_DMA_MINALIGN);
307 priv = memalign(ARCH_DMA_MINALIGN, size);
309 memset(priv, '\0', size);
312 * Ensure that the zero bytes are flushed to memory.
313 * This prevents problems if the driver uses this as
314 * both an input and an output buffer:
316 * 1. Zeroes written to buffer (here) and sit in the
318 * 2. Driver issues a read command to DMA
319 * 3. CPU runs out of cache space and evicts some cache
320 * data in the buffer, writing zeroes to RAM from
323 * 5. Buffer now has some DMA data and some zeroes
324 * 6. Data being read is now incorrect
326 * To prevent this, ensure that the cache is clean
327 * within this range at the start. The driver can then
328 * use normal flush-after-write, invalidate-before-read
331 flush_dcache_range((ulong)priv, (ulong)priv + size);
334 priv = calloc(1, size);
341 * device_alloc_priv() - Allocate priv/plat data required by the device
343 * @dev: Device to process
344 * Return: 0 if OK, -ENOMEM if out of memory
346 static int device_alloc_priv(struct udevice *dev)
348 const struct driver *drv;
355 /* Allocate private data if requested and not reentered */
356 if (drv->priv_auto && !dev_get_priv(dev)) {
357 ptr = alloc_priv(drv->priv_auto, drv->flags);
360 dev_set_priv(dev, ptr);
363 /* Allocate private data if requested and not reentered */
364 size = dev->uclass->uc_drv->per_device_auto;
365 if (size && !dev_get_uclass_priv(dev)) {
366 ptr = alloc_priv(size, dev->uclass->uc_drv->flags);
369 dev_set_uclass_priv(dev, ptr);
372 /* Allocate parent data for this child */
374 size = dev->parent->driver->per_child_auto;
376 size = dev->parent->uclass->uc_drv->per_child_auto;
377 if (size && !dev_get_parent_priv(dev)) {
378 ptr = alloc_priv(size, drv->flags);
381 dev_set_parent_priv(dev, ptr);
388 int device_of_to_plat(struct udevice *dev)
390 const struct driver *drv;
396 if (dev_get_flags(dev) & DM_FLAG_PLATDATA_VALID)
400 * This is not needed if binding is disabled, since data is allocated
403 if (!CONFIG_IS_ENABLED(OF_PLATDATA_NO_BIND)) {
404 /* Ensure all parents have ofdata */
406 ret = device_of_to_plat(dev->parent);
411 * The device might have already been probed during
412 * the call to device_probe() on its parent device
413 * (e.g. PCI bridge devices). Test the flags again
414 * so that we don't mess up the device.
416 if (dev_get_flags(dev) & DM_FLAG_PLATDATA_VALID)
420 ret = device_alloc_priv(dev);
427 if (drv->of_to_plat &&
428 (CONFIG_IS_ENABLED(OF_PLATDATA) || dev_has_ofnode(dev))) {
429 ret = drv->of_to_plat(dev);
434 dev_or_flags(dev, DM_FLAG_PLATDATA_VALID);
444 * device_get_dma_constraints() - Populate device's DMA constraints
446 * Gets a device's DMA constraints from firmware. This information is later
447 * used by drivers to translate physcal addresses to the device's bus address
448 * space. For now only device-tree is supported.
450 * @dev: Pointer to target device
451 * Return: 0 if OK or if no DMA constraints were found, error otherwise
453 static int device_get_dma_constraints(struct udevice *dev)
455 struct udevice *parent = dev->parent;
461 if (!CONFIG_IS_ENABLED(DM_DMA) || !parent || !dev_has_ofnode(parent))
465 * We start parsing for dma-ranges from the device's bus node. This is
466 * specially important on nested buses.
468 ret = dev_get_dma_range(parent, &cpu, &bus, &size);
469 /* Don't return an error if no 'dma-ranges' were found */
470 if (ret && ret != -ENOENT) {
471 dm_warn("%s: failed to get DMA range, %d\n", dev->name, ret);
475 dev_set_dma_offset(dev, cpu - bus);
480 int device_probe(struct udevice *dev)
482 const struct driver *drv;
488 if (dev_get_flags(dev) & DM_FLAG_ACTIVATED)
491 ret = device_notify(dev, EVT_DM_PRE_PROBE);
498 ret = device_of_to_plat(dev);
502 /* Ensure all parents are probed */
504 ret = device_probe(dev->parent);
509 * The device might have already been probed during
510 * the call to device_probe() on its parent device
511 * (e.g. PCI bridge devices). Test the flags again
512 * so that we don't mess up the device.
514 if (dev_get_flags(dev) & DM_FLAG_ACTIVATED)
518 dev_or_flags(dev, DM_FLAG_ACTIVATED);
520 if (CONFIG_IS_ENABLED(POWER_DOMAIN) && dev->parent &&
521 (device_get_uclass_id(dev) != UCLASS_POWER_DOMAIN) &&
522 !(drv->flags & DM_FLAG_DEFAULT_PD_CTRL_OFF)) {
523 ret = dev_power_domain_on(dev);
529 * Process pinctrl for everything except the root device, and
530 * continue regardless of the result of pinctrl. Don't process pinctrl
531 * settings for pinctrl devices since the device may not yet be
534 * This call can produce some non-intuitive results. For example, on an
535 * x86 device where dev is the main PCI bus, the pinctrl device may be
536 * child or grandchild of that bus, meaning that the child will be
537 * probed here. If the child happens to be the P2SB and the pinctrl
538 * device is a child of that, then both the pinctrl and P2SB will be
539 * probed by this call. This works because the DM_FLAG_ACTIVATED flag
540 * is set just above. However, the PCI bus' probe() method and
541 * associated uclass methods have not yet been called.
543 if (dev->parent && device_get_uclass_id(dev) != UCLASS_PINCTRL) {
544 ret = pinctrl_select_state(dev, "default");
545 if (ret && ret != -ENOSYS)
546 log_debug("Device '%s' failed to configure default pinctrl: %d (%s)\n",
547 dev->name, ret, errno_str(ret));
550 if (CONFIG_IS_ENABLED(IOMMU) && dev->parent &&
551 (device_get_uclass_id(dev) != UCLASS_IOMMU)) {
552 ret = dev_iommu_enable(dev);
557 ret = device_get_dma_constraints(dev);
561 ret = uclass_pre_probe_device(dev);
565 if (dev->parent && dev->parent->driver->child_pre_probe) {
566 ret = dev->parent->driver->child_pre_probe(dev);
571 /* Only handle devices that have a valid ofnode */
572 if (dev_has_ofnode(dev)) {
574 * Process 'assigned-{clocks/clock-parents/clock-rates}'
577 ret = clk_set_defaults(dev, CLK_DEFAULTS_PRE);
583 ret = drv->probe(dev);
588 ret = uclass_post_probe_device(dev);
592 if (dev->parent && device_get_uclass_id(dev) == UCLASS_PINCTRL) {
593 ret = pinctrl_select_state(dev, "default");
594 if (ret && ret != -ENOSYS)
595 log_debug("Device '%s' failed to configure default pinctrl: %d (%s)\n",
596 dev->name, ret, errno_str(ret));
599 ret = device_notify(dev, EVT_DM_POST_PROBE);
605 if (device_remove(dev, DM_REMOVE_NORMAL)) {
606 dm_warn("%s: Device '%s' failed to remove on error path\n",
607 __func__, dev->name);
610 dev_bic_flags(dev, DM_FLAG_ACTIVATED);
617 void *dev_get_plat(const struct udevice *dev)
620 dm_warn("%s: null device\n", __func__);
624 return dm_priv_to_rw(dev->plat_);
627 void *dev_get_parent_plat(const struct udevice *dev)
630 dm_warn("%s: null device\n", __func__);
634 return dm_priv_to_rw(dev->parent_plat_);
637 void *dev_get_uclass_plat(const struct udevice *dev)
640 dm_warn("%s: null device\n", __func__);
644 return dm_priv_to_rw(dev->uclass_plat_);
647 void *dev_get_priv(const struct udevice *dev)
650 dm_warn("%s: null device\n", __func__);
654 return dm_priv_to_rw(dev->priv_);
657 void *dev_get_uclass_priv(const struct udevice *dev)
660 dm_warn("%s: null device\n", __func__);
664 return dm_priv_to_rw(dev->uclass_priv_);
667 void *dev_get_parent_priv(const struct udevice *dev)
670 dm_warn("%s: null device\n", __func__);
674 return dm_priv_to_rw(dev->parent_priv_);
677 void *dev_get_attach_ptr(const struct udevice *dev, enum dm_tag_t tag)
681 return dev_get_plat(dev);
682 case DM_TAG_PARENT_PLAT:
683 return dev_get_parent_plat(dev);
685 return dev_get_uclass_plat(dev);
687 return dev_get_priv(dev);
688 case DM_TAG_PARENT_PRIV:
689 return dev_get_parent_priv(dev);
691 return dev_get_uclass_priv(dev);
697 int dev_get_attach_size(const struct udevice *dev, enum dm_tag_t tag)
699 const struct udevice *parent = dev_get_parent(dev);
700 const struct uclass *uc = dev->uclass;
701 const struct uclass_driver *uc_drv = uc->uc_drv;
702 const struct driver *parent_drv = NULL;
706 parent_drv = parent->driver;
710 size = dev->driver->plat_auto;
712 case DM_TAG_PARENT_PLAT:
714 size = parent_drv->per_child_plat_auto;
716 size = parent->uclass->uc_drv->per_child_plat_auto;
720 size = uc_drv->per_device_plat_auto;
723 size = dev->driver->priv_auto;
725 case DM_TAG_PARENT_PRIV:
727 size = parent_drv->per_child_auto;
729 size = parent->uclass->uc_drv->per_child_auto;
733 size = uc_drv->per_device_auto;
742 static int device_get_device_tail(struct udevice *dev, int ret,
743 struct udevice **devp)
748 ret = device_probe(dev);
757 #if CONFIG_IS_ENABLED(OF_REAL)
759 * device_find_by_ofnode() - Return device associated with given ofnode
761 * The returned device is *not* activated.
763 * @node: The ofnode for which a associated device should be looked up
764 * @devp: Pointer to structure to hold the found device
765 * Return: 0 if OK, -ve on error
767 static int device_find_by_ofnode(ofnode node, struct udevice **devp)
773 list_for_each_entry(uc, gd->uclass_root, sibling_node) {
774 ret = uclass_find_device_by_ofnode(uc->uc_drv->id, node,
786 int device_get_child(const struct udevice *parent, int index,
787 struct udevice **devp)
791 device_foreach_child(dev, parent) {
793 return device_get_device_tail(dev, 0, devp);
799 int device_get_child_count(const struct udevice *parent)
804 device_foreach_child(dev, parent)
810 int device_get_decendent_count(const struct udevice *parent)
812 const struct udevice *dev;
815 device_foreach_child(dev, parent)
816 count += device_get_decendent_count(dev);
821 int device_find_child_by_seq(const struct udevice *parent, int seq,
822 struct udevice **devp)
828 device_foreach_child(dev, parent) {
829 if (dev->seq_ == seq) {
838 int device_get_child_by_seq(const struct udevice *parent, int seq,
839 struct udevice **devp)
845 ret = device_find_child_by_seq(parent, seq, &dev);
847 return device_get_device_tail(dev, ret, devp);
850 int device_find_child_by_of_offset(const struct udevice *parent, int of_offset,
851 struct udevice **devp)
857 device_foreach_child(dev, parent) {
858 if (dev_of_offset(dev) == of_offset) {
867 int device_get_child_by_of_offset(const struct udevice *parent, int node,
868 struct udevice **devp)
874 ret = device_find_child_by_of_offset(parent, node, &dev);
875 return device_get_device_tail(dev, ret, devp);
878 static struct udevice *_device_find_global_by_ofnode(struct udevice *parent,
881 struct udevice *dev, *found;
883 if (ofnode_equal(dev_ofnode(parent), ofnode))
886 device_foreach_child(dev, parent) {
887 found = _device_find_global_by_ofnode(dev, ofnode);
895 int device_find_global_by_ofnode(ofnode ofnode, struct udevice **devp)
897 *devp = _device_find_global_by_ofnode(gd->dm_root, ofnode);
899 return *devp ? 0 : -ENOENT;
902 int device_get_global_by_ofnode(ofnode ofnode, struct udevice **devp)
906 dev = _device_find_global_by_ofnode(gd->dm_root, ofnode);
907 return device_get_device_tail(dev, dev ? 0 : -ENOENT, devp);
910 #if CONFIG_IS_ENABLED(OF_PLATDATA)
911 int device_get_by_ofplat_idx(uint idx, struct udevice **devp)
915 if (CONFIG_IS_ENABLED(OF_PLATDATA_INST)) {
916 struct udevice *base = ll_entry_start(struct udevice, udevice);
920 struct driver_rt *drt = gd_dm_driver_rt() + idx;
926 return device_get_device_tail(dev, dev ? 0 : -ENOENT, devp);
930 int device_find_first_child(const struct udevice *parent, struct udevice **devp)
932 if (list_empty(&parent->child_head)) {
935 *devp = list_first_entry(&parent->child_head, struct udevice,
942 int device_find_next_child(struct udevice **devp)
944 struct udevice *dev = *devp;
945 struct udevice *parent = dev->parent;
947 if (list_is_last(&dev->sibling_node, &parent->child_head)) {
950 *devp = list_entry(dev->sibling_node.next, struct udevice,
957 int device_find_first_inactive_child(const struct udevice *parent,
958 enum uclass_id uclass_id,
959 struct udevice **devp)
964 device_foreach_child(dev, parent) {
965 if (!device_active(dev) &&
966 device_get_uclass_id(dev) == uclass_id) {
975 int device_find_first_child_by_uclass(const struct udevice *parent,
976 enum uclass_id uclass_id,
977 struct udevice **devp)
982 device_foreach_child(dev, parent) {
983 if (device_get_uclass_id(dev) == uclass_id) {
992 int device_find_child_by_namelen(const struct udevice *parent, const char *name,
993 int len, struct udevice **devp)
999 device_foreach_child(dev, parent) {
1000 if (!strncmp(dev->name, name, len) &&
1001 strlen(dev->name) == len) {
1010 int device_find_child_by_name(const struct udevice *parent, const char *name,
1011 struct udevice **devp)
1013 return device_find_child_by_namelen(parent, name, strlen(name), devp);
1016 int device_first_child_err(struct udevice *parent, struct udevice **devp)
1018 struct udevice *dev;
1020 device_find_first_child(parent, &dev);
1024 return device_get_device_tail(dev, 0, devp);
1027 int device_next_child_err(struct udevice **devp)
1029 struct udevice *dev = *devp;
1031 device_find_next_child(&dev);
1035 return device_get_device_tail(dev, 0, devp);
1038 int device_first_child_ofdata_err(struct udevice *parent, struct udevice **devp)
1040 struct udevice *dev;
1043 device_find_first_child(parent, &dev);
1047 ret = device_of_to_plat(dev);
1056 int device_next_child_ofdata_err(struct udevice **devp)
1058 struct udevice *dev = *devp;
1061 device_find_next_child(&dev);
1065 ret = device_of_to_plat(dev);
1074 struct udevice *dev_get_parent(const struct udevice *child)
1076 return child->parent;
1079 ulong dev_get_driver_data(const struct udevice *dev)
1081 return dev->driver_data;
1084 const void *dev_get_driver_ops(const struct udevice *dev)
1086 if (!dev || !dev->driver->ops)
1089 return dev->driver->ops;
1092 enum uclass_id device_get_uclass_id(const struct udevice *dev)
1094 return dev->uclass->uc_drv->id;
1097 const char *dev_get_uclass_name(const struct udevice *dev)
1102 return dev->uclass->uc_drv->name;
1105 bool device_has_children(const struct udevice *dev)
1107 return !list_empty(&dev->child_head);
1110 bool device_has_active_children(const struct udevice *dev)
1112 struct udevice *child;
1114 for (device_find_first_child(dev, &child);
1116 device_find_next_child(&child)) {
1117 if (device_active(child))
1124 bool device_is_last_sibling(const struct udevice *dev)
1126 struct udevice *parent = dev->parent;
1130 return list_is_last(&dev->sibling_node, &parent->child_head);
1133 void device_set_name_alloced(struct udevice *dev)
1135 dev_or_flags(dev, DM_FLAG_NAME_ALLOCED);
1138 int device_set_name(struct udevice *dev, const char *name)
1140 name = strdup(name);
1144 device_set_name_alloced(dev);
1149 void dev_set_priv(struct udevice *dev, void *priv)
1154 void dev_set_parent_priv(struct udevice *dev, void *parent_priv)
1156 dev->parent_priv_ = parent_priv;
1159 void dev_set_uclass_priv(struct udevice *dev, void *uclass_priv)
1161 dev->uclass_priv_ = uclass_priv;
1164 void dev_set_plat(struct udevice *dev, void *plat)
1169 void dev_set_parent_plat(struct udevice *dev, void *parent_plat)
1171 dev->parent_plat_ = parent_plat;
1174 void dev_set_uclass_plat(struct udevice *dev, void *uclass_plat)
1176 dev->uclass_plat_ = uclass_plat;
1179 #if CONFIG_IS_ENABLED(OF_REAL)
1180 bool device_is_compatible(const struct udevice *dev, const char *compat)
1182 return ofnode_device_is_compatible(dev_ofnode(dev), compat);
1185 bool of_machine_is_compatible(const char *compat)
1187 return ofnode_device_is_compatible(ofnode_root(), compat);
1190 int dev_disable_by_path(const char *path)
1193 ofnode node = ofnode_path(path);
1194 struct udevice *dev;
1197 if (!of_live_active())
1200 list_for_each_entry(uc, gd->uclass_root, sibling_node) {
1201 ret = uclass_find_device_by_ofnode(uc->uc_drv->id, node, &dev);
1209 ret = device_remove(dev, DM_REMOVE_NORMAL);
1213 ret = device_unbind(dev);
1217 return ofnode_set_enabled(node, false);
1220 int dev_enable_by_path(const char *path)
1222 ofnode node = ofnode_path(path);
1223 ofnode pnode = ofnode_get_parent(node);
1224 struct udevice *parent;
1227 if (!of_live_active())
1230 ret = device_find_by_ofnode(pnode, &parent);
1234 ret = ofnode_set_enabled(node, true);
1238 return lists_bind_fdt(parent, node, NULL, NULL, false);
1242 #if CONFIG_IS_ENABLED(OF_PLATDATA_RT)
1243 static struct udevice_rt *dev_get_rt(const struct udevice *dev)
1245 struct udevice *base = ll_entry_start(struct udevice, udevice);
1246 uint each_size = dm_udevice_size();
1247 int idx = ((void *)dev - (void *)base) / each_size;
1249 struct udevice_rt *urt = gd_dm_udevice_rt() + idx;
1254 u32 dev_get_flags(const struct udevice *dev)
1256 const struct udevice_rt *urt = dev_get_rt(dev);
1261 void dev_or_flags(const struct udevice *dev, u32 or)
1263 struct udevice_rt *urt = dev_get_rt(dev);
1268 void dev_bic_flags(const struct udevice *dev, u32 bic)
1270 struct udevice_rt *urt = dev_get_rt(dev);
1272 urt->flags_ &= ~bic;
1274 #endif /* OF_PLATDATA_RT */