Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
platform.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
4  * and Arnd Bergmann, IBM Corp.
5  * Merged from powerpc/kernel/of_platform.c and
6  * sparc{,64}/kernel/of_device.c by Stephen Rothwell
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version
11  * 2 of the License, or (at your option) any later version.
12  *
13  */
14 #include <linux/errno.h>
15 #include <linux/module.h>
16 #include <linux/amba/bus.h>
17 #include <linux/device.h>
18 #include <linux/dma-mapping.h>
19 #include <linux/slab.h>
20 #include <linux/of_address.h>
21 #include <linux/of_device.h>
22 #include <linux/of_irq.h>
23 #include <linux/of_platform.h>
24 #include <linux/platform_device.h>
25 
27  { .compatible = "simple-bus", },
28 #ifdef CONFIG_ARM_AMBA
29  { .compatible = "arm,amba-bus", },
30 #endif /* CONFIG_ARM_AMBA */
31  {} /* Empty terminated list */
32 };
33 
34 static int of_dev_node_match(struct device *dev, void *data)
35 {
36  return dev->of_node == data;
37 }
38 
46 {
47  struct device *dev;
48 
49  dev = bus_find_device(&platform_bus_type, NULL, np, of_dev_node_match);
50  return dev ? to_platform_device(dev) : NULL;
51 }
53 
54 #if defined(CONFIG_PPC_DCR)
55 #include <asm/dcr.h>
56 #endif
57 
58 #ifdef CONFIG_OF_ADDRESS
59 /*
60  * The following routines scan a subtree and registers a device for
61  * each applicable node.
62  *
63  * Note: sparc doesn't use these routines because it has a different
64  * mechanism for creating devices from device tree nodes.
65  */
66 
75 void of_device_make_bus_id(struct device *dev)
76 {
77  static atomic_t bus_no_reg_magic;
78  struct device_node *node = dev->of_node;
79  const __be32 *reg;
80  u64 addr;
81  const __be32 *addrp;
82  int magic;
83 
84 #ifdef CONFIG_PPC_DCR
85  /*
86  * If it's a DCR based device, use 'd' for native DCRs
87  * and 'D' for MMIO DCRs.
88  */
89  reg = of_get_property(node, "dcr-reg", NULL);
90  if (reg) {
91 #ifdef CONFIG_PPC_DCR_NATIVE
92  dev_set_name(dev, "d%x.%s", *reg, node->name);
93 #else /* CONFIG_PPC_DCR_NATIVE */
94  u64 addr = of_translate_dcr_address(node, *reg, NULL);
95  if (addr != OF_BAD_ADDR) {
96  dev_set_name(dev, "D%llx.%s",
97  (unsigned long long)addr, node->name);
98  return;
99  }
100 #endif /* !CONFIG_PPC_DCR_NATIVE */
101  }
102 #endif /* CONFIG_PPC_DCR */
103 
104  /*
105  * For MMIO, get the physical address
106  */
107  reg = of_get_property(node, "reg", NULL);
108  if (reg) {
109  if (of_can_translate_address(node)) {
110  addr = of_translate_address(node, reg);
111  } else {
112  addrp = of_get_address(node, 0, NULL, NULL);
113  if (addrp)
114  addr = of_read_number(addrp, 1);
115  else
116  addr = OF_BAD_ADDR;
117  }
118  if (addr != OF_BAD_ADDR) {
119  dev_set_name(dev, "%llx.%s",
120  (unsigned long long)addr, node->name);
121  return;
122  }
123  }
124 
125  /*
126  * No BusID, use the node name and add a globally incremented
127  * counter (and pray...)
128  */
129  magic = atomic_add_return(1, &bus_no_reg_magic);
130  dev_set_name(dev, "%s.%d", node->name, magic - 1);
131 }
132 
139 struct platform_device *of_device_alloc(struct device_node *np,
140  const char *bus_id,
141  struct device *parent)
142 {
143  struct platform_device *dev;
144  int rc, i, num_reg = 0, num_irq;
145  struct resource *res, temp_res;
146 
147  dev = platform_device_alloc("", -1);
148  if (!dev)
149  return NULL;
150 
151  /* count the io and irq resources */
152  if (of_can_translate_address(np))
153  while (of_address_to_resource(np, num_reg, &temp_res) == 0)
154  num_reg++;
155  num_irq = of_irq_count(np);
156 
157  /* Populate the resource table */
158  if (num_irq || num_reg) {
159  res = kzalloc(sizeof(*res) * (num_irq + num_reg), GFP_KERNEL);
160  if (!res) {
161  platform_device_put(dev);
162  return NULL;
163  }
164 
165  dev->num_resources = num_reg + num_irq;
166  dev->resource = res;
167  for (i = 0; i < num_reg; i++, res++) {
168  rc = of_address_to_resource(np, i, res);
169  WARN_ON(rc);
170  }
171  WARN_ON(of_irq_to_resource_table(np, res, num_irq) != num_irq);
172  }
173 
174  dev->dev.of_node = of_node_get(np);
175 #if defined(CONFIG_MICROBLAZE)
176  dev->dev.dma_mask = &dev->archdata.dma_mask;
177 #endif
178  dev->dev.parent = parent;
179 
180  if (bus_id)
181  dev_set_name(&dev->dev, "%s", bus_id);
182  else
183  of_device_make_bus_id(&dev->dev);
184 
185  return dev;
186 }
187 EXPORT_SYMBOL(of_device_alloc);
188 
199 struct platform_device *of_platform_device_create_pdata(
200  struct device_node *np,
201  const char *bus_id,
202  void *platform_data,
203  struct device *parent)
204 {
205  struct platform_device *dev;
206 
207  if (!of_device_is_available(np))
208  return NULL;
209 
210  dev = of_device_alloc(np, bus_id, parent);
211  if (!dev)
212  return NULL;
213 
214 #if defined(CONFIG_MICROBLAZE)
215  dev->archdata.dma_mask = 0xffffffffUL;
216 #endif
217  dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
218  dev->dev.bus = &platform_bus_type;
219  dev->dev.platform_data = platform_data;
220 
221  /* We do not fill the DMA ops for platform devices by default.
222  * This is currently the responsibility of the platform code
223  * to do such, possibly using a device notifier
224  */
225 
226  if (of_device_add(dev) != 0) {
227  platform_device_put(dev);
228  return NULL;
229  }
230 
231  return dev;
232 }
233 
243 struct platform_device *of_platform_device_create(struct device_node *np,
244  const char *bus_id,
245  struct device *parent)
246 {
247  return of_platform_device_create_pdata(np, bus_id, NULL, parent);
248 }
249 EXPORT_SYMBOL(of_platform_device_create);
250 
251 #ifdef CONFIG_ARM_AMBA
252 static struct amba_device *of_amba_device_create(struct device_node *node,
253  const char *bus_id,
254  void *platform_data,
255  struct device *parent)
256 {
257  struct amba_device *dev;
258  const void *prop;
259  int i, ret;
260 
261  pr_debug("Creating amba device %s\n", node->full_name);
262 
263  if (!of_device_is_available(node))
264  return NULL;
265 
266  dev = amba_device_alloc(NULL, 0, 0);
267  if (!dev)
268  return NULL;
269 
270  /* setup generic device info */
271  dev->dev.coherent_dma_mask = ~0;
272  dev->dev.of_node = of_node_get(node);
273  dev->dev.parent = parent;
274  dev->dev.platform_data = platform_data;
275  if (bus_id)
276  dev_set_name(&dev->dev, "%s", bus_id);
277  else
278  of_device_make_bus_id(&dev->dev);
279 
280  /* setup amba-specific device info */
281  dev->dma_mask = ~0;
282 
283  /* Allow the HW Peripheral ID to be overridden */
284  prop = of_get_property(node, "arm,primecell-periphid", NULL);
285  if (prop)
286  dev->periphid = of_read_ulong(prop, 1);
287 
288  /* Decode the IRQs and address ranges */
289  for (i = 0; i < AMBA_NR_IRQS; i++)
290  dev->irq[i] = irq_of_parse_and_map(node, i);
291 
292  ret = of_address_to_resource(node, 0, &dev->res);
293  if (ret)
294  goto err_free;
295 
296  ret = amba_device_add(dev, &iomem_resource);
297  if (ret)
298  goto err_free;
299 
300  return dev;
301 
302 err_free:
303  amba_device_put(dev);
304  return NULL;
305 }
306 #else /* CONFIG_ARM_AMBA */
307 static struct amba_device *of_amba_device_create(struct device_node *node,
308  const char *bus_id,
309  void *platform_data,
310  struct device *parent)
311 {
312  return NULL;
313 }
314 #endif /* CONFIG_ARM_AMBA */
315 
319 static const struct of_dev_auxdata *of_dev_lookup(const struct of_dev_auxdata *lookup,
320  struct device_node *np)
321 {
322  struct resource res;
323 
324  if (!lookup)
325  return NULL;
326 
327  for(; lookup->compatible != NULL; lookup++) {
328  if (!of_device_is_compatible(np, lookup->compatible))
329  continue;
330  if (!of_address_to_resource(np, 0, &res))
331  if (res.start != lookup->phys_addr)
332  continue;
333  pr_debug("%s: devname=%s\n", np->full_name, lookup->name);
334  return lookup;
335  }
336 
337  return NULL;
338 }
339 
351 static int of_platform_bus_create(struct device_node *bus,
352  const struct of_device_id *matches,
353  const struct of_dev_auxdata *lookup,
354  struct device *parent, bool strict)
355 {
356  const struct of_dev_auxdata *auxdata;
357  struct device_node *child;
358  struct platform_device *dev;
359  const char *bus_id = NULL;
360  void *platform_data = NULL;
361  int rc = 0;
362 
363  /* Make sure it has a compatible property */
364  if (strict && (!of_get_property(bus, "compatible", NULL))) {
365  pr_debug("%s() - skipping %s, no compatible prop\n",
366  __func__, bus->full_name);
367  return 0;
368  }
369 
370  auxdata = of_dev_lookup(lookup, bus);
371  if (auxdata) {
372  bus_id = auxdata->name;
373  platform_data = auxdata->platform_data;
374  }
375 
376  if (of_device_is_compatible(bus, "arm,primecell")) {
377  of_amba_device_create(bus, bus_id, platform_data, parent);
378  return 0;
379  }
380 
381  dev = of_platform_device_create_pdata(bus, bus_id, platform_data, parent);
382  if (!dev || !of_match_node(matches, bus))
383  return 0;
384 
385  for_each_child_of_node(bus, child) {
386  pr_debug(" create child: %s\n", child->full_name);
387  rc = of_platform_bus_create(child, matches, lookup, &dev->dev, strict);
388  if (rc) {
389  of_node_put(child);
390  break;
391  }
392  }
393  return rc;
394 }
395 
405 int of_platform_bus_probe(struct device_node *root,
406  const struct of_device_id *matches,
407  struct device *parent)
408 {
409  struct device_node *child;
410  int rc = 0;
411 
412  root = root ? of_node_get(root) : of_find_node_by_path("/");
413  if (!root)
414  return -EINVAL;
415 
416  pr_debug("of_platform_bus_probe()\n");
417  pr_debug(" starting at: %s\n", root->full_name);
418 
419  /* Do a self check of bus type, if there's a match, create children */
420  if (of_match_node(matches, root)) {
421  rc = of_platform_bus_create(root, matches, NULL, parent, false);
422  } else for_each_child_of_node(root, child) {
423  if (!of_match_node(matches, child))
424  continue;
425  rc = of_platform_bus_create(child, matches, NULL, parent, false);
426  if (rc)
427  break;
428  }
429 
430  of_node_put(root);
431  return rc;
432 }
433 EXPORT_SYMBOL(of_platform_bus_probe);
434 
453 int of_platform_populate(struct device_node *root,
454  const struct of_device_id *matches,
455  const struct of_dev_auxdata *lookup,
456  struct device *parent)
457 {
458  struct device_node *child;
459  int rc = 0;
460 
461  root = root ? of_node_get(root) : of_find_node_by_path("/");
462  if (!root)
463  return -EINVAL;
464 
465  for_each_child_of_node(root, child) {
466  rc = of_platform_bus_create(child, matches, lookup, parent, true);
467  if (rc)
468  break;
469  }
470 
471  of_node_put(root);
472  return rc;
473 }
474 EXPORT_SYMBOL_GPL(of_platform_populate);
475 #endif /* CONFIG_OF_ADDRESS */