arm: vf610: add uart0 clock/iomux definitions
[u-boot/qq2440-u-boot.git] / drivers / core / root.c
blob407bc0d04640b249b3102c62a679bf7a6e0b6bd7
1 /*
2 * Copyright (c) 2013 Google, Inc
4 * (C) Copyright 2012
5 * Pavel Herrmann <morpheus.ibis@gmail.com>
7 * SPDX-License-Identifier: GPL-2.0+
8 */
10 #include <common.h>
11 #include <errno.h>
12 #include <malloc.h>
13 #include <dm/device.h>
14 #include <dm/device-internal.h>
15 #include <dm/lists.h>
16 #include <dm/platdata.h>
17 #include <dm/uclass.h>
18 #include <dm/util.h>
19 #include <linux/list.h>
21 DECLARE_GLOBAL_DATA_PTR;
23 static const struct driver_info root_info = {
24 .name = "root_driver",
27 struct device *dm_root(void)
29 if (!gd->dm_root) {
30 dm_warn("Virtual root driver does not exist!\n");
31 return NULL;
34 return gd->dm_root;
37 int dm_init(void)
39 int ret;
41 if (gd->dm_root) {
42 dm_warn("Virtual root driver already exists!\n");
43 return -EINVAL;
45 INIT_LIST_HEAD(&gd->uclass_root);
47 ret = device_bind_by_name(NULL, &root_info, &gd->dm_root);
48 if (ret)
49 return ret;
51 return 0;
54 int dm_scan_platdata(void)
56 int ret;
58 ret = lists_bind_drivers(gd->dm_root);
59 if (ret == -ENOENT) {
60 dm_warn("Some drivers were not found\n");
61 ret = 0;
63 if (ret)
64 return ret;
66 return 0;
69 #ifdef CONFIG_OF_CONTROL
70 int dm_scan_fdt(const void *blob)
72 int offset = 0;
73 int ret = 0, err;
74 int depth = 0;
76 do {
77 offset = fdt_next_node(blob, offset, &depth);
78 if (offset > 0 && depth == 1) {
79 err = lists_bind_fdt(gd->dm_root, blob, offset);
80 if (err && !ret)
81 ret = err;
83 } while (offset > 0);
85 if (ret)
86 dm_warn("Some drivers failed to bind\n");
88 return ret;
90 #endif
92 /* This is the root driver - all drivers are children of this */
93 U_BOOT_DRIVER(root_driver) = {
94 .name = "root_driver",
95 .id = UCLASS_ROOT,
98 /* This is the root uclass */
99 UCLASS_DRIVER(root) = {
100 .name = "root",
101 .id = UCLASS_ROOT,