xref: /openbmc/linux/arch/powerpc/kernel/of_platform.c (revision 96de0e252cedffad61b3cb5e05662c591898e69a)
1 /*
2  *    Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
3  *			 <benh@kernel.crashing.org>
4  *    and		 Arnd Bergmann, IBM Corp.
5  *
6  *  This program is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU General Public License
8  *  as published by the Free Software Foundation; either version
9  *  2 of the License, or (at your option) any later version.
10  *
11  */
12 
13 #undef DEBUG
14 
15 #include <linux/string.h>
16 #include <linux/kernel.h>
17 #include <linux/init.h>
18 #include <linux/module.h>
19 #include <linux/mod_devicetable.h>
20 #include <linux/slab.h>
21 #include <linux/pci.h>
22 #include <linux/of_device.h>
23 #include <linux/of_platform.h>
24 
25 #include <asm/errno.h>
26 #include <asm/topology.h>
27 #include <asm/pci-bridge.h>
28 #include <asm/ppc-pci.h>
29 #include <asm/atomic.h>
30 
31 /*
32  * The list of OF IDs below is used for matching bus types in the
33  * system whose devices are to be exposed as of_platform_devices.
34  *
35  * This is the default list valid for most platforms. This file provides
36  * functions who can take an explicit list if necessary though
37  *
38  * The search is always performed recursively looking for children of
39  * the provided device_node and recursively if such a children matches
40  * a bus type in the list
41  */
42 
43 static struct of_device_id of_default_bus_ids[] = {
44 	{ .type = "soc", },
45 	{ .compatible = "soc", },
46 	{ .type = "spider", },
47 	{ .type = "axon", },
48 	{ .type = "plb5", },
49 	{ .type = "plb4", },
50 	{ .type = "opb", },
51 	{ .type = "ebc", },
52 	{},
53 };
54 
55 struct bus_type of_platform_bus_type = {
56        .uevent	= of_device_uevent,
57 };
58 EXPORT_SYMBOL(of_platform_bus_type);
59 
60 static int __init of_bus_driver_init(void)
61 {
62 	return of_bus_type_init(&of_platform_bus_type, "of_platform");
63 }
64 
65 postcore_initcall(of_bus_driver_init);
66 
67 int of_register_platform_driver(struct of_platform_driver *drv)
68 {
69 	/* initialize common driver fields */
70 	if (!drv->driver.name)
71 		drv->driver.name = drv->name;
72 	if (!drv->driver.owner)
73 		drv->driver.owner = drv->owner;
74 	drv->driver.bus = &of_platform_bus_type;
75 
76 	/* register with core */
77 	return driver_register(&drv->driver);
78 }
79 EXPORT_SYMBOL(of_register_platform_driver);
80 
81 void of_unregister_platform_driver(struct of_platform_driver *drv)
82 {
83 	driver_unregister(&drv->driver);
84 }
85 EXPORT_SYMBOL(of_unregister_platform_driver);
86 
87 struct of_device* of_platform_device_create(struct device_node *np,
88 					    const char *bus_id,
89 					    struct device *parent)
90 {
91 	struct of_device *dev;
92 
93 	dev = of_device_alloc(np, bus_id, parent);
94 	if (!dev)
95 		return NULL;
96 
97 	dev->dma_mask = 0xffffffffUL;
98 	dev->dev.bus = &of_platform_bus_type;
99 
100 	/* We do not fill the DMA ops for platform devices by default.
101 	 * This is currently the responsibility of the platform code
102 	 * to do such, possibly using a device notifier
103 	 */
104 
105 	if (of_device_register(dev) != 0) {
106 		of_device_free(dev);
107 		return NULL;
108 	}
109 
110 	return dev;
111 }
112 EXPORT_SYMBOL(of_platform_device_create);
113 
114 
115 
116 /**
117  * of_platform_bus_create - Create an OF device for a bus node and all its
118  * children. Optionally recursively instanciate matching busses.
119  * @bus: device node of the bus to instanciate
120  * @matches: match table, NULL to use the default, OF_NO_DEEP_PROBE to
121  * disallow recursive creation of child busses
122  */
123 static int of_platform_bus_create(struct device_node *bus,
124 				  struct of_device_id *matches,
125 				  struct device *parent)
126 {
127 	struct device_node *child;
128 	struct of_device *dev;
129 	int rc = 0;
130 
131 	for (child = NULL; (child = of_get_next_child(bus, child)); ) {
132 		pr_debug("   create child: %s\n", child->full_name);
133 		dev = of_platform_device_create(child, NULL, parent);
134 		if (dev == NULL)
135 			rc = -ENOMEM;
136 		else if (!of_match_node(matches, child))
137 			continue;
138 		if (rc == 0) {
139 			pr_debug("   and sub busses\n");
140 			rc = of_platform_bus_create(child, matches, &dev->dev);
141 		} if (rc) {
142 			of_node_put(child);
143 			break;
144 		}
145 	}
146 	return rc;
147 }
148 
149 /**
150  * of_platform_bus_probe - Probe the device-tree for platform busses
151  * @root: parent of the first level to probe or NULL for the root of the tree
152  * @matches: match table, NULL to use the default
153  * @parent: parent to hook devices from, NULL for toplevel
154  *
155  * Note that children of the provided root are not instanciated as devices
156  * unless the specified root itself matches the bus list and is not NULL.
157  */
158 
159 int of_platform_bus_probe(struct device_node *root,
160 			  struct of_device_id *matches,
161 			  struct device *parent)
162 {
163 	struct device_node *child;
164 	struct of_device *dev;
165 	int rc = 0;
166 
167 	if (matches == NULL)
168 		matches = of_default_bus_ids;
169 	if (matches == OF_NO_DEEP_PROBE)
170 		return -EINVAL;
171 	if (root == NULL)
172 		root = of_find_node_by_path("/");
173 	else
174 		of_node_get(root);
175 
176 	pr_debug("of_platform_bus_probe()\n");
177 	pr_debug(" starting at: %s\n", root->full_name);
178 
179 	/* Do a self check of bus type, if there's a match, create
180 	 * children
181 	 */
182 	if (of_match_node(matches, root)) {
183 		pr_debug(" root match, create all sub devices\n");
184 		dev = of_platform_device_create(root, NULL, parent);
185 		if (dev == NULL) {
186 			rc = -ENOMEM;
187 			goto bail;
188 		}
189 		pr_debug(" create all sub busses\n");
190 		rc = of_platform_bus_create(root, matches, &dev->dev);
191 		goto bail;
192 	}
193 	for (child = NULL; (child = of_get_next_child(root, child)); ) {
194 		if (!of_match_node(matches, child))
195 			continue;
196 
197 		pr_debug("  match: %s\n", child->full_name);
198 		dev = of_platform_device_create(child, NULL, parent);
199 		if (dev == NULL)
200 			rc = -ENOMEM;
201 		else
202 			rc = of_platform_bus_create(child, matches, &dev->dev);
203 		if (rc) {
204 			of_node_put(child);
205 			break;
206 		}
207 	}
208  bail:
209 	of_node_put(root);
210 	return rc;
211 }
212 EXPORT_SYMBOL(of_platform_bus_probe);
213 
214 static int of_dev_node_match(struct device *dev, void *data)
215 {
216 	return to_of_device(dev)->node == data;
217 }
218 
219 struct of_device *of_find_device_by_node(struct device_node *np)
220 {
221 	struct device *dev;
222 
223 	dev = bus_find_device(&of_platform_bus_type,
224 			      NULL, np, of_dev_node_match);
225 	if (dev)
226 		return to_of_device(dev);
227 	return NULL;
228 }
229 EXPORT_SYMBOL(of_find_device_by_node);
230 
231 static int of_dev_phandle_match(struct device *dev, void *data)
232 {
233 	phandle *ph = data;
234 	return to_of_device(dev)->node->linux_phandle == *ph;
235 }
236 
237 struct of_device *of_find_device_by_phandle(phandle ph)
238 {
239 	struct device *dev;
240 
241 	dev = bus_find_device(&of_platform_bus_type,
242 			      NULL, &ph, of_dev_phandle_match);
243 	if (dev)
244 		return to_of_device(dev);
245 	return NULL;
246 }
247 EXPORT_SYMBOL(of_find_device_by_phandle);
248 
249 
250 #ifdef CONFIG_PPC_OF_PLATFORM_PCI
251 
252 /* The probing of PCI controllers from of_platform is currently
253  * 64 bits only, mostly due to gratuitous differences between
254  * the 32 and 64 bits PCI code on PowerPC and the 32 bits one
255  * lacking some bits needed here.
256  */
257 
258 static int __devinit of_pci_phb_probe(struct of_device *dev,
259 				      const struct of_device_id *match)
260 {
261 	struct pci_controller *phb;
262 
263 	/* Check if we can do that ... */
264 	if (ppc_md.pci_setup_phb == NULL)
265 		return -ENODEV;
266 
267 	printk(KERN_INFO "Setting up PCI bus %s\n", dev->node->full_name);
268 
269 	/* Alloc and setup PHB data structure */
270 	phb = pcibios_alloc_controller(dev->node);
271 	if (!phb)
272 		return -ENODEV;
273 
274 	/* Setup parent in sysfs */
275 	phb->parent = &dev->dev;
276 
277 	/* Setup the PHB using arch provided callback */
278 	if (ppc_md.pci_setup_phb(phb)) {
279 		pcibios_free_controller(phb);
280 		return -ENODEV;
281 	}
282 
283 	/* Process "ranges" property */
284 	pci_process_bridge_OF_ranges(phb, dev->node, 0);
285 
286 	/* Init pci_dn data structures */
287 	pci_devs_phb_init_dynamic(phb);
288 
289 	/* Register devices with EEH */
290 #ifdef CONFIG_EEH
291 	if (dev->node->child)
292 		eeh_add_device_tree_early(dev->node);
293 #endif /* CONFIG_EEH */
294 
295 	/* Scan the bus */
296 	scan_phb(phb);
297 
298 	/* Claim resources. This might need some rework as well depending
299 	 * wether we are doing probe-only or not, like assigning unassigned
300 	 * resources etc...
301 	 */
302 	pcibios_claim_one_bus(phb->bus);
303 
304 	/* Finish EEH setup */
305 #ifdef CONFIG_EEH
306 	eeh_add_device_tree_late(phb->bus);
307 #endif
308 
309 	/* Add probed PCI devices to the device model */
310 	pci_bus_add_devices(phb->bus);
311 
312 	return 0;
313 }
314 
315 static struct of_device_id of_pci_phb_ids[] = {
316 	{ .type = "pci", },
317 	{ .type = "pcix", },
318 	{ .type = "pcie", },
319 	{ .type = "pciex", },
320 	{ .type = "ht", },
321 	{}
322 };
323 
324 static struct of_platform_driver of_pci_phb_driver = {
325 	.match_table = of_pci_phb_ids,
326 	.probe = of_pci_phb_probe,
327 	.driver = {
328 		.name = "of-pci",
329 	},
330 };
331 
332 static __init int of_pci_phb_init(void)
333 {
334 	return of_register_platform_driver(&of_pci_phb_driver);
335 }
336 
337 device_initcall(of_pci_phb_init);
338 
339 #endif /* CONFIG_PPC_OF_PLATFORM_PCI */
340