xref: /openbmc/u-boot/drivers/core/device.c (revision d90f0d4cae5c9349a412e3f924bf25e20e35ddfa)
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@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@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