Home | History | Annotate | Download | only in core
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  * Device manager
      4  *
      5  * Copyright (c) 2013 Google, Inc
      6  *
      7  * (C) Copyright 2012
      8  * Pavel Herrmann <morpheus.ibis (at) gmail.com>
      9  */
     10 
     11 #include <common.h>
     12 #include <asm/io.h>
     13 #include <clk.h>
     14 #include <fdtdec.h>
     15 #include <fdt_support.h>
     16 #include <malloc.h>
     17 #include <dm/device.h>
     18 #include <dm/device-internal.h>
     19 #include <dm/lists.h>
     20 #include <dm/of_access.h>
     21 #include <dm/pinctrl.h>
     22 #include <dm/platdata.h>
     23 #include <dm/read.h>
     24 #include <dm/uclass.h>
     25 #include <dm/uclass-internal.h>
     26 #include <dm/util.h>
     27 #include <linux/err.h>
     28 #include <linux/list.h>
     29 
     30 DECLARE_GLOBAL_DATA_PTR;
     31 
     32 static int device_bind_common(struct udevice *parent, const struct driver *drv,
     33 			      const char *name, void *platdata,
     34 			      ulong driver_data, ofnode node,
     35 			      uint of_platdata_size, struct udevice **devp)
     36 {
     37 	struct udevice *dev;
     38 	struct uclass *uc;
     39 	int size, ret = 0;
     40 
     41 	if (devp)
     42 		*devp = NULL;
     43 	if (!name)
     44 		return -EINVAL;
     45 
     46 	ret = uclass_get(drv->id, &uc);
     47 	if (ret) {
     48 		debug("Missing uclass for driver %s\n", drv->name);
     49 		return ret;
     50 	}
     51 
     52 	dev = calloc(1, sizeof(struct udevice));
     53 	if (!dev)
     54 		return -ENOMEM;
     55 
     56 	INIT_LIST_HEAD(&dev->sibling_node);
     57 	INIT_LIST_HEAD(&dev->child_head);
     58 	INIT_LIST_HEAD(&dev->uclass_node);
     59 #ifdef CONFIG_DEVRES
     60 	INIT_LIST_HEAD(&dev->devres_head);
     61 #endif
     62 	dev->platdata = platdata;
     63 	dev->driver_data = driver_data;
     64 	dev->name = name;
     65 	dev->node = node;
     66 	dev->parent = parent;
     67 	dev->driver = drv;
     68 	dev->uclass = uc;
     69 
     70 	dev->seq = -1;
     71 	dev->req_seq = -1;
     72 	if (CONFIG_IS_ENABLED(OF_CONTROL) && CONFIG_IS_ENABLED(DM_SEQ_ALIAS)) {
     73 		/*
     74 		 * Some devices, such as a SPI bus, I2C bus and serial ports
     75 		 * are numbered using aliases.
     76 		 *
     77 		 * This is just a 'requested' sequence, and will be
     78 		 * resolved (and ->seq updated) when the device is probed.
     79 		 */
     80 		if (uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS) {
     81 			if (uc->uc_drv->name && ofnode_valid(node)) {
     82 				dev_read_alias_seq(dev, &dev->req_seq);
     83 			}
     84 		}
     85 	}
     86 
     87 	if (drv->platdata_auto_alloc_size) {
     88 		bool alloc = !platdata;
     89 
     90 		if (CONFIG_IS_ENABLED(OF_PLATDATA)) {
     91 			if (of_platdata_size) {
     92 				dev->flags |= DM_FLAG_OF_PLATDATA;
     93 				if (of_platdata_size <
     94 						drv->platdata_auto_alloc_size)
     95 					alloc = true;
     96 			}
     97 		}
     98 		if (alloc) {
     99 			dev->flags |= DM_FLAG_ALLOC_PDATA;
    100 			dev->platdata = calloc(1,
    101 					       drv->platdata_auto_alloc_size);
    102 			if (!dev->platdata) {
    103 				ret = -ENOMEM;
    104 				goto fail_alloc1;
    105 			}
    106 			if (CONFIG_IS_ENABLED(OF_PLATDATA) && platdata) {
    107 				memcpy(dev->platdata, platdata,
    108 				       of_platdata_size);
    109 			}
    110 		}
    111 	}
    112 
    113 	size = uc->uc_drv->per_device_platdata_auto_alloc_size;
    114 	if (size) {
    115 		dev->flags |= DM_FLAG_ALLOC_UCLASS_PDATA;
    116 		dev->uclass_platdata = calloc(1, size);
    117 		if (!dev->uclass_platdata) {
    118 			ret = -ENOMEM;
    119 			goto fail_alloc2;
    120 		}
    121 	}
    122 
    123 	if (parent) {
    124 		size = parent->driver->per_child_platdata_auto_alloc_size;
    125 		if (!size) {
    126 			size = parent->uclass->uc_drv->
    127 					per_child_platdata_auto_alloc_size;
    128 		}
    129 		if (size) {
    130 			dev->flags |= DM_FLAG_ALLOC_PARENT_PDATA;
    131 			dev->parent_platdata = calloc(1, size);
    132 			if (!dev->parent_platdata) {
    133 				ret = -ENOMEM;
    134 				goto fail_alloc3;
    135 			}
    136 		}
    137 	}
    138 
    139 	/* put dev into parent's successor list */
    140 	if (parent)
    141 		list_add_tail(&dev->sibling_node, &parent->child_head);
    142 
    143 	ret = uclass_bind_device(dev);
    144 	if (ret)
    145 		goto fail_uclass_bind;
    146 
    147 	/* if we fail to bind we remove device from successors and free it */
    148 	if (drv->bind) {
    149 		ret = drv->bind(dev);
    150 		if (ret)
    151 			goto fail_bind;
    152 	}
    153 	if (parent && parent->driver->child_post_bind) {
    154 		ret = parent->driver->child_post_bind(dev);
    155 		if (ret)
    156 			goto fail_child_post_bind;
    157 	}
    158 	if (uc->uc_drv->post_bind) {
    159 		ret = uc->uc_drv->post_bind(dev);
    160 		if (ret)
    161 			goto fail_uclass_post_bind;
    162 	}
    163 
    164 	if (parent)
    165 		pr_debug("Bound device %s to %s\n", dev->name, parent->name);
    166 	if (devp)
    167 		*devp = dev;
    168 
    169 	dev->flags |= DM_FLAG_BOUND;
    170 
    171 	return 0;
    172 
    173 fail_uclass_post_bind:
    174 	/* There is no child unbind() method, so no clean-up required */
    175 fail_child_post_bind:
    176 	if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
    177 		if (drv->unbind && drv->unbind(dev)) {
    178 			dm_warn("unbind() method failed on dev '%s' on error path\n",
    179 				dev->name);
    180 		}
    181 	}
    182 
    183 fail_bind:
    184 	if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
    185 		if (uclass_unbind_device(dev)) {
    186 			dm_warn("Failed to unbind dev '%s' on error path\n",
    187 				dev->name);
    188 		}
    189 	}
    190 fail_uclass_bind:
    191 	if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
    192 		list_del(&dev->sibling_node);
    193 		if (dev->flags & DM_FLAG_ALLOC_PARENT_PDATA) {
    194 			free(dev->parent_platdata);
    195 			dev->parent_platdata = NULL;
    196 		}
    197 	}
    198 fail_alloc3:
    199 	if (dev->flags & DM_FLAG_ALLOC_UCLASS_PDATA) {
    200 		free(dev->uclass_platdata);
    201 		dev->uclass_platdata = NULL;
    202 	}
    203 fail_alloc2:
    204 	if (dev->flags & DM_FLAG_ALLOC_PDATA) {
    205 		free(dev->platdata);
    206 		dev->platdata = NULL;
    207 	}
    208 fail_alloc1:
    209 	devres_release_all(dev);
    210 
    211 	free(dev);
    212 
    213 	return ret;
    214 }
    215 
    216 int device_bind_with_driver_data(struct udevice *parent,
    217 				 const struct driver *drv, const char *name,
    218 				 ulong driver_data, ofnode node,
    219 				 struct udevice **devp)
    220 {
    221 	return device_bind_common(parent, drv, name, NULL, driver_data, node,
    222 				  0, devp);
    223 }
    224 
    225 int device_bind(struct udevice *parent, const struct driver *drv,
    226 		const char *name, void *platdata, int of_offset,
    227 		struct udevice **devp)
    228 {
    229 	return device_bind_common(parent, drv, name, platdata, 0,
    230 				  offset_to_ofnode(of_offset), 0, devp);
    231 }
    232 
    233 int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
    234 			const struct driver_info *info, struct udevice **devp)
    235 {
    236 	struct driver *drv;
    237 	uint platdata_size = 0;
    238 
    239 	drv = lists_driver_lookup_name(info->name);
    240 	if (!drv)
    241 		return -ENOENT;
    242 	if (pre_reloc_only && !(drv->flags & DM_FLAG_PRE_RELOC))
    243 		return -EPERM;
    244 
    245 #if CONFIG_IS_ENABLED(OF_PLATDATA)
    246 	platdata_size = info->platdata_size;
    247 #endif
    248 	return device_bind_common(parent, drv, info->name,
    249 			(void *)info->platdata, 0, ofnode_null(), platdata_size,
    250 			devp);
    251 }
    252 
    253 static void *alloc_priv(int size, uint flags)
    254 {
    255 	void *priv;
    256 
    257 	if (flags & DM_FLAG_ALLOC_PRIV_DMA) {
    258 		size = ROUND(size, ARCH_DMA_MINALIGN);
    259 		priv = memalign(ARCH_DMA_MINALIGN, size);
    260 		if (priv) {
    261 			memset(priv, '\0', size);
    262 
    263 			/*
    264 			 * Ensure that the zero bytes are flushed to memory.
    265 			 * This prevents problems if the driver uses this as
    266 			 * both an input and an output buffer:
    267 			 *
    268 			 * 1. Zeroes written to buffer (here) and sit in the
    269 			 *	cache
    270 			 * 2. Driver issues a read command to DMA
    271 			 * 3. CPU runs out of cache space and evicts some cache
    272 			 *	data in the buffer, writing zeroes to RAM from
    273 			 *	the memset() above
    274 			 * 4. DMA completes
    275 			 * 5. Buffer now has some DMA data and some zeroes
    276 			 * 6. Data being read is now incorrect
    277 			 *
    278 			 * To prevent this, ensure that the cache is clean
    279 			 * within this range at the start. The driver can then
    280 			 * use normal flush-after-write, invalidate-before-read
    281 			 * procedures.
    282 			 *
    283 			 * TODO(sjg (at) chromium.org): Drop this microblaze
    284 			 * exception.
    285 			 */
    286 #ifndef CONFIG_MICROBLAZE
    287 			flush_dcache_range((ulong)priv, (ulong)priv + size);
    288 #endif
    289 		}
    290 	} else {
    291 		priv = calloc(1, size);
    292 	}
    293 
    294 	return priv;
    295 }
    296 
    297 int device_probe(struct udevice *dev)
    298 {
    299 	const struct driver *drv;
    300 	int size = 0;
    301 	int ret;
    302 	int seq;
    303 
    304 	if (!dev)
    305 		return -EINVAL;
    306 
    307 	if (dev->flags & DM_FLAG_ACTIVATED)
    308 		return 0;
    309 
    310 	drv = dev->driver;
    311 	assert(drv);
    312 
    313 	/* Allocate private data if requested and not reentered */
    314 	if (drv->priv_auto_alloc_size && !dev->priv) {
    315 		dev->priv = alloc_priv(drv->priv_auto_alloc_size, drv->flags);
    316 		if (!dev->priv) {
    317 			ret = -ENOMEM;
    318 			goto fail;
    319 		}
    320 	}
    321 	/* Allocate private data if requested and not reentered */
    322 	size = dev->uclass->uc_drv->per_device_auto_alloc_size;
    323 	if (size && !dev->uclass_priv) {
    324 		dev->uclass_priv = calloc(1, size);
    325 		if (!dev->uclass_priv) {
    326 			ret = -ENOMEM;
    327 			goto fail;
    328 		}
    329 	}
    330 
    331 	/* Ensure all parents are probed */
    332 	if (dev->parent) {
    333 		size = dev->parent->driver->per_child_auto_alloc_size;
    334 		if (!size) {
    335 			size = dev->parent->uclass->uc_drv->
    336 					per_child_auto_alloc_size;
    337 		}
    338 		if (size && !dev->parent_priv) {
    339 			dev->parent_priv = alloc_priv(size, drv->flags);
    340 			if (!dev->parent_priv) {
    341 				ret = -ENOMEM;
    342 				goto fail;
    343 			}
    344 		}
    345 
    346 		ret = device_probe(dev->parent);
    347 		if (ret)
    348 			goto fail;
    349 
    350 		/*
    351 		 * The device might have already been probed during
    352 		 * the call to device_probe() on its parent device
    353 		 * (e.g. PCI bridge devices). Test the flags again
    354 		 * so that we don't mess up the device.
    355 		 */
    356 		if (dev->flags & DM_FLAG_ACTIVATED)
    357 			return 0;
    358 	}
    359 
    360 	seq = uclass_resolve_seq(dev);
    361 	if (seq < 0) {
    362 		ret = seq;
    363 		goto fail;
    364 	}
    365 	dev->seq = seq;
    366 
    367 	dev->flags |= DM_FLAG_ACTIVATED;
    368 
    369 	/*
    370 	 * Process pinctrl for everything except the root device, and
    371 	 * continue regardless of the result of pinctrl. Don't process pinctrl
    372 	 * settings for pinctrl devices since the device may not yet be
    373 	 * probed.
    374 	 */
    375 	if (dev->parent && device_get_uclass_id(dev) != UCLASS_PINCTRL)
    376 		pinctrl_select_state(dev, "default");
    377 
    378 	ret = uclass_pre_probe_device(dev);
    379 	if (ret)
    380 		goto fail;
    381 
    382 	if (dev->parent && dev->parent->driver->child_pre_probe) {
    383 		ret = dev->parent->driver->child_pre_probe(dev);
    384 		if (ret)
    385 			goto fail;
    386 	}
    387 
    388 	if (drv->ofdata_to_platdata && dev_has_of_node(dev)) {
    389 		ret = drv->ofdata_to_platdata(dev);
    390 		if (ret)
    391 			goto fail;
    392 	}
    393 
    394 	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
    395 	ret = clk_set_defaults(dev);
    396 	if (ret)
    397 		goto fail;
    398 
    399 	if (drv->probe) {
    400 		ret = drv->probe(dev);
    401 		if (ret) {
    402 			dev->flags &= ~DM_FLAG_ACTIVATED;
    403 			goto fail;
    404 		}
    405 	}
    406 
    407 	ret = uclass_post_probe_device(dev);
    408 	if (ret)
    409 		goto fail_uclass;
    410 
    411 	if (dev->parent && device_get_uclass_id(dev) == UCLASS_PINCTRL)
    412 		pinctrl_select_state(dev, "default");
    413 
    414 	return 0;
    415 fail_uclass:
    416 	if (device_remove(dev, DM_REMOVE_NORMAL)) {
    417 		dm_warn("%s: Device '%s' failed to remove on error path\n",
    418 			__func__, dev->name);
    419 	}
    420 fail:
    421 	dev->flags &= ~DM_FLAG_ACTIVATED;
    422 
    423 	dev->seq = -1;
    424 	device_free(dev);
    425 
    426 	return ret;
    427 }
    428 
    429 void *dev_get_platdata(struct udevice *dev)
    430 {
    431 	if (!dev) {
    432 		dm_warn("%s: null device\n", __func__);
    433 		return NULL;
    434 	}
    435 
    436 	return dev->platdata;
    437 }
    438 
    439 void *dev_get_parent_platdata(struct udevice *dev)
    440 {
    441 	if (!dev) {
    442 		dm_warn("%s: null device\n", __func__);
    443 		return NULL;
    444 	}
    445 
    446 	return dev->parent_platdata;
    447 }
    448 
    449 void *dev_get_uclass_platdata(struct udevice *dev)
    450 {
    451 	if (!dev) {
    452 		dm_warn("%s: null device\n", __func__);
    453 		return NULL;
    454 	}
    455 
    456 	return dev->uclass_platdata;
    457 }
    458 
    459 void *dev_get_priv(struct udevice *dev)
    460 {
    461 	if (!dev) {
    462 		dm_warn("%s: null device\n", __func__);
    463 		return NULL;
    464 	}
    465 
    466 	return dev->priv;
    467 }
    468 
    469 void *dev_get_uclass_priv(struct udevice *dev)
    470 {
    471 	if (!dev) {
    472 		dm_warn("%s: null device\n", __func__);
    473 		return NULL;
    474 	}
    475 
    476 	return dev->uclass_priv;
    477 }
    478 
    479 void *dev_get_parent_priv(struct udevice *dev)
    480 {
    481 	if (!dev) {
    482 		dm_warn("%s: null device\n", __func__);
    483 		return NULL;
    484 	}
    485 
    486 	return dev->parent_priv;
    487 }
    488 
    489 static int device_get_device_tail(struct udevice *dev, int ret,
    490 				  struct udevice **devp)
    491 {
    492 	if (ret)
    493 		return ret;
    494 
    495 	ret = device_probe(dev);
    496 	if (ret)
    497 		return ret;
    498 
    499 	*devp = dev;
    500 
    501 	return 0;
    502 }
    503 
    504 int device_get_child(struct udevice *parent, int index, struct udevice **devp)
    505 {
    506 	struct udevice *dev;
    507 
    508 	list_for_each_entry(dev, &parent->child_head, sibling_node) {
    509 		if (!index--)
    510 			return device_get_device_tail(dev, 0, devp);
    511 	}
    512 
    513 	return -ENODEV;
    514 }
    515 
    516 int device_find_child_by_seq(struct udevice *parent, int seq_or_req_seq,
    517 			     bool find_req_seq, struct udevice **devp)
    518 {
    519 	struct udevice *dev;
    520 
    521 	*devp = NULL;
    522 	if (seq_or_req_seq == -1)
    523 		return -ENODEV;
    524 
    525 	list_for_each_entry(dev, &parent->child_head, sibling_node) {
    526 		if ((find_req_seq ? dev->req_seq : dev->seq) ==
    527 				seq_or_req_seq) {
    528 			*devp = dev;
    529 			return 0;
    530 		}
    531 	}
    532 
    533 	return -ENODEV;
    534 }
    535 
    536 int device_get_child_by_seq(struct udevice *parent, int seq,
    537 			    struct udevice **devp)
    538 {
    539 	struct udevice *dev;
    540 	int ret;
    541 
    542 	*devp = NULL;
    543 	ret = device_find_child_by_seq(parent, seq, false, &dev);
    544 	if (ret == -ENODEV) {
    545 		/*
    546 		 * We didn't find it in probed devices. See if there is one
    547 		 * that will request this seq if probed.
    548 		 */
    549 		ret = device_find_child_by_seq(parent, seq, true, &dev);
    550 	}
    551 	return device_get_device_tail(dev, ret, devp);
    552 }
    553 
    554 int device_find_child_by_of_offset(struct udevice *parent, int of_offset,
    555 				   struct udevice **devp)
    556 {
    557 	struct udevice *dev;
    558 
    559 	*devp = NULL;
    560 
    561 	list_for_each_entry(dev, &parent->child_head, sibling_node) {
    562 		if (dev_of_offset(dev) == of_offset) {
    563 			*devp = dev;
    564 			return 0;
    565 		}
    566 	}
    567 
    568 	return -ENODEV;
    569 }
    570 
    571 int device_get_child_by_of_offset(struct udevice *parent, int node,
    572 				  struct udevice **devp)
    573 {
    574 	struct udevice *dev;
    575 	int ret;
    576 
    577 	*devp = NULL;
    578 	ret = device_find_child_by_of_offset(parent, node, &dev);
    579 	return device_get_device_tail(dev, ret, devp);
    580 }
    581 
    582 static struct udevice *_device_find_global_by_of_offset(struct udevice *parent,
    583 							int of_offset)
    584 {
    585 	struct udevice *dev, *found;
    586 
    587 	if (dev_of_offset(parent) == of_offset)
    588 		return parent;
    589 
    590 	list_for_each_entry(dev, &parent->child_head, sibling_node) {
    591 		found = _device_find_global_by_of_offset(dev, of_offset);
    592 		if (found)
    593 			return found;
    594 	}
    595 
    596 	return NULL;
    597 }
    598 
    599 int device_get_global_by_of_offset(int of_offset, struct udevice **devp)
    600 {
    601 	struct udevice *dev;
    602 
    603 	dev = _device_find_global_by_of_offset(gd->dm_root, of_offset);
    604 	return device_get_device_tail(dev, dev ? 0 : -ENOENT, devp);
    605 }
    606 
    607 int device_find_first_child(struct udevice *parent, struct udevice **devp)
    608 {
    609 	if (list_empty(&parent->child_head)) {
    610 		*devp = NULL;
    611 	} else {
    612 		*devp = list_first_entry(&parent->child_head, struct udevice,
    613 					 sibling_node);
    614 	}
    615 
    616 	return 0;
    617 }
    618 
    619 int device_find_next_child(struct udevice **devp)
    620 {
    621 	struct udevice *dev = *devp;
    622 	struct udevice *parent = dev->parent;
    623 
    624 	if (list_is_last(&dev->sibling_node, &parent->child_head)) {
    625 		*devp = NULL;
    626 	} else {
    627 		*devp = list_entry(dev->sibling_node.next, struct udevice,
    628 				   sibling_node);
    629 	}
    630 
    631 	return 0;
    632 }
    633 
    634 struct udevice *dev_get_parent(struct udevice *child)
    635 {
    636 	return child->parent;
    637 }
    638 
    639 ulong dev_get_driver_data(struct udevice *dev)
    640 {
    641 	return dev->driver_data;
    642 }
    643 
    644 const void *dev_get_driver_ops(struct udevice *dev)
    645 {
    646 	if (!dev || !dev->driver->ops)
    647 		return NULL;
    648 
    649 	return dev->driver->ops;
    650 }
    651 
    652 enum uclass_id device_get_uclass_id(struct udevice *dev)
    653 {
    654 	return dev->uclass->uc_drv->id;
    655 }
    656 
    657 const char *dev_get_uclass_name(struct udevice *dev)
    658 {
    659 	if (!dev)
    660 		return NULL;
    661 
    662 	return dev->uclass->uc_drv->name;
    663 }
    664 
    665 bool device_has_children(struct udevice *dev)
    666 {
    667 	return !list_empty(&dev->child_head);
    668 }
    669 
    670 bool device_has_active_children(struct udevice *dev)
    671 {
    672 	struct udevice *child;
    673 
    674 	for (device_find_first_child(dev, &child);
    675 	     child;
    676 	     device_find_next_child(&child)) {
    677 		if (device_active(child))
    678 			return true;
    679 	}
    680 
    681 	return false;
    682 }
    683 
    684 bool device_is_last_sibling(struct udevice *dev)
    685 {
    686 	struct udevice *parent = dev->parent;
    687 
    688 	if (!parent)
    689 		return false;
    690 	return list_is_last(&dev->sibling_node, &parent->child_head);
    691 }
    692 
    693 void device_set_name_alloced(struct udevice *dev)
    694 {
    695 	dev->flags |= DM_FLAG_NAME_ALLOCED;
    696 }
    697 
    698 int device_set_name(struct udevice *dev, const char *name)
    699 {
    700 	name = strdup(name);
    701 	if (!name)
    702 		return -ENOMEM;
    703 	dev->name = name;
    704 	device_set_name_alloced(dev);
    705 
    706 	return 0;
    707 }
    708 
    709 bool device_is_compatible(struct udevice *dev, const char *compat)
    710 {
    711 	return ofnode_device_is_compatible(dev_ofnode(dev), compat);
    712 }
    713 
    714 bool of_machine_is_compatible(const char *compat)
    715 {
    716 	const void *fdt = gd->fdt_blob;
    717 
    718 	return !fdt_node_check_compatible(fdt, 0, compat);
    719 }
    720