1 /* 2 * Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp. 3 * <benh@kernel.crashing.org> 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/of_reserved_mem.h> 25 #include <linux/platform_device.h> 26 27 const struct of_device_id of_default_bus_match_table[] = { 28 { .compatible = "simple-bus", }, 29 #ifdef CONFIG_ARM_AMBA 30 { .compatible = "arm,amba-bus", }, 31 #endif /* CONFIG_ARM_AMBA */ 32 {} /* Empty terminated list */ 33 }; 34 35 static int of_dev_node_match(struct device *dev, void *data) 36 { 37 return dev->of_node == data; 38 } 39 40 /** 41 * of_find_device_by_node - Find the platform_device associated with a node 42 * @np: Pointer to device tree node 43 * 44 * Returns platform_device pointer, or NULL if not found 45 */ 46 struct platform_device *of_find_device_by_node(struct device_node *np) 47 { 48 struct device *dev; 49 50 dev = bus_find_device(&platform_bus_type, NULL, np, of_dev_node_match); 51 return dev ? to_platform_device(dev) : NULL; 52 } 53 EXPORT_SYMBOL(of_find_device_by_node); 54 55 #if defined(CONFIG_PPC_DCR) 56 #include <asm/dcr.h> 57 #endif 58 59 #ifdef CONFIG_OF_ADDRESS 60 /* 61 * The following routines scan a subtree and registers a device for 62 * each applicable node. 63 * 64 * Note: sparc doesn't use these routines because it has a different 65 * mechanism for creating devices from device tree nodes. 66 */ 67 68 /** 69 * of_device_make_bus_id - Use the device node data to assign a unique name 70 * @dev: pointer to device structure that is linked to a device tree node 71 * 72 * This routine will first try using either the dcr-reg or the reg property 73 * value to derive a unique name. As a last resort it will use the node 74 * name followed by a unique number. 75 */ 76 void of_device_make_bus_id(struct device *dev) 77 { 78 static atomic_t bus_no_reg_magic; 79 struct device_node *node = dev->of_node; 80 const __be32 *reg; 81 u64 addr; 82 const __be32 *addrp; 83 int magic; 84 85 #ifdef CONFIG_PPC_DCR 86 /* 87 * If it's a DCR based device, use 'd' for native DCRs 88 * and 'D' for MMIO DCRs. 89 */ 90 reg = of_get_property(node, "dcr-reg", NULL); 91 if (reg) { 92 #ifdef CONFIG_PPC_DCR_NATIVE 93 dev_set_name(dev, "d%x.%s", *reg, node->name); 94 #else /* CONFIG_PPC_DCR_NATIVE */ 95 u64 addr = of_translate_dcr_address(node, *reg, NULL); 96 if (addr != OF_BAD_ADDR) { 97 dev_set_name(dev, "D%llx.%s", 98 (unsigned long long)addr, node->name); 99 return; 100 } 101 #endif /* !CONFIG_PPC_DCR_NATIVE */ 102 } 103 #endif /* CONFIG_PPC_DCR */ 104 105 /* 106 * For MMIO, get the physical address 107 */ 108 reg = of_get_property(node, "reg", NULL); 109 if (reg) { 110 if (of_can_translate_address(node)) { 111 addr = of_translate_address(node, reg); 112 } else { 113 addrp = of_get_address(node, 0, NULL, NULL); 114 if (addrp) 115 addr = of_read_number(addrp, 1); 116 else 117 addr = OF_BAD_ADDR; 118 } 119 if (addr != OF_BAD_ADDR) { 120 dev_set_name(dev, "%llx.%s", 121 (unsigned long long)addr, node->name); 122 return; 123 } 124 } 125 126 /* 127 * No BusID, use the node name and add a globally incremented 128 * counter (and pray...) 129 */ 130 magic = atomic_add_return(1, &bus_no_reg_magic); 131 dev_set_name(dev, "%s.%d", node->name, magic - 1); 132 } 133 134 /** 135 * of_device_alloc - Allocate and initialize an of_device 136 * @np: device node to assign to device 137 * @bus_id: Name to assign to the device. May be null to use default name. 138 * @parent: Parent device. 139 */ 140 struct platform_device *of_device_alloc(struct device_node *np, 141 const char *bus_id, 142 struct device *parent) 143 { 144 struct platform_device *dev; 145 int rc, i, num_reg = 0, num_irq; 146 struct resource *res, temp_res; 147 148 dev = platform_device_alloc("", -1); 149 if (!dev) 150 return NULL; 151 152 /* count the io and irq resources */ 153 if (of_can_translate_address(np)) 154 while (of_address_to_resource(np, num_reg, &temp_res) == 0) 155 num_reg++; 156 num_irq = of_irq_count(np); 157 158 /* Populate the resource table */ 159 if (num_irq || num_reg) { 160 res = kzalloc(sizeof(*res) * (num_irq + num_reg), GFP_KERNEL); 161 if (!res) { 162 platform_device_put(dev); 163 return NULL; 164 } 165 166 dev->num_resources = num_reg + num_irq; 167 dev->resource = res; 168 for (i = 0; i < num_reg; i++, res++) { 169 rc = of_address_to_resource(np, i, res); 170 WARN_ON(rc); 171 } 172 WARN_ON(of_irq_to_resource_table(np, res, num_irq) != num_irq); 173 } 174 175 dev->dev.of_node = of_node_get(np); 176 #if defined(CONFIG_MICROBLAZE) 177 dev->dev.dma_mask = &dev->archdata.dma_mask; 178 #endif 179 dev->dev.parent = parent; 180 181 if (bus_id) 182 dev_set_name(&dev->dev, "%s", bus_id); 183 else 184 of_device_make_bus_id(&dev->dev); 185 186 return dev; 187 } 188 EXPORT_SYMBOL(of_device_alloc); 189 190 /** 191 * of_platform_device_create_pdata - Alloc, initialize and register an of_device 192 * @np: pointer to node to create device for 193 * @bus_id: name to assign device 194 * @platform_data: pointer to populate platform_data pointer with 195 * @parent: Linux device model parent device. 196 * 197 * Returns pointer to created platform device, or NULL if a device was not 198 * registered. Unavailable devices will not get registered. 199 */ 200 struct platform_device *of_platform_device_create_pdata( 201 struct device_node *np, 202 const char *bus_id, 203 void *platform_data, 204 struct device *parent) 205 { 206 struct platform_device *dev; 207 208 if (!of_device_is_available(np)) 209 return NULL; 210 211 dev = of_device_alloc(np, bus_id, parent); 212 if (!dev) 213 return NULL; 214 215 #if defined(CONFIG_MICROBLAZE) 216 dev->archdata.dma_mask = 0xffffffffUL; 217 #endif 218 dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); 219 dev->dev.bus = &platform_bus_type; 220 dev->dev.platform_data = platform_data; 221 222 of_reserved_mem_device_init(&dev->dev); 223 224 /* We do not fill the DMA ops for platform devices by default. 225 * This is currently the responsibility of the platform code 226 * to do such, possibly using a device notifier 227 */ 228 229 if (of_device_add(dev) != 0) { 230 platform_device_put(dev); 231 of_reserved_mem_device_release(&dev->dev); 232 return NULL; 233 } 234 235 return dev; 236 } 237 238 /** 239 * of_platform_device_create - Alloc, initialize and register an of_device 240 * @np: pointer to node to create device for 241 * @bus_id: name to assign device 242 * @parent: Linux device model parent device. 243 * 244 * Returns pointer to created platform device, or NULL if a device was not 245 * registered. Unavailable devices will not get registered. 246 */ 247 struct platform_device *of_platform_device_create(struct device_node *np, 248 const char *bus_id, 249 struct device *parent) 250 { 251 return of_platform_device_create_pdata(np, bus_id, NULL, parent); 252 } 253 EXPORT_SYMBOL(of_platform_device_create); 254 255 #ifdef CONFIG_ARM_AMBA 256 static struct amba_device *of_amba_device_create(struct device_node *node, 257 const char *bus_id, 258 void *platform_data, 259 struct device *parent) 260 { 261 struct amba_device *dev; 262 const void *prop; 263 int i, ret; 264 265 pr_debug("Creating amba device %s\n", node->full_name); 266 267 if (!of_device_is_available(node)) 268 return NULL; 269 270 dev = amba_device_alloc(NULL, 0, 0); 271 if (!dev) 272 return NULL; 273 274 /* setup generic device info */ 275 dev->dev.coherent_dma_mask = ~0; 276 dev->dev.of_node = of_node_get(node); 277 dev->dev.parent = parent; 278 dev->dev.platform_data = platform_data; 279 if (bus_id) 280 dev_set_name(&dev->dev, "%s", bus_id); 281 else 282 of_device_make_bus_id(&dev->dev); 283 284 /* setup amba-specific device info */ 285 dev->dma_mask = ~0; 286 287 /* Allow the HW Peripheral ID to be overridden */ 288 prop = of_get_property(node, "arm,primecell-periphid", NULL); 289 if (prop) 290 dev->periphid = of_read_ulong(prop, 1); 291 292 /* Decode the IRQs and address ranges */ 293 for (i = 0; i < AMBA_NR_IRQS; i++) 294 dev->irq[i] = irq_of_parse_and_map(node, i); 295 296 ret = of_address_to_resource(node, 0, &dev->res); 297 if (ret) 298 goto err_free; 299 300 ret = amba_device_add(dev, &iomem_resource); 301 if (ret) 302 goto err_free; 303 304 return dev; 305 306 err_free: 307 amba_device_put(dev); 308 return NULL; 309 } 310 #else /* CONFIG_ARM_AMBA */ 311 static struct amba_device *of_amba_device_create(struct device_node *node, 312 const char *bus_id, 313 void *platform_data, 314 struct device *parent) 315 { 316 return NULL; 317 } 318 #endif /* CONFIG_ARM_AMBA */ 319 320 /** 321 * of_devname_lookup() - Given a device node, lookup the preferred Linux name 322 */ 323 static const struct of_dev_auxdata *of_dev_lookup(const struct of_dev_auxdata *lookup, 324 struct device_node *np) 325 { 326 struct resource res; 327 328 if (!lookup) 329 return NULL; 330 331 for(; lookup->compatible != NULL; lookup++) { 332 if (!of_device_is_compatible(np, lookup->compatible)) 333 continue; 334 if (!of_address_to_resource(np, 0, &res)) 335 if (res.start != lookup->phys_addr) 336 continue; 337 pr_debug("%s: devname=%s\n", np->full_name, lookup->name); 338 return lookup; 339 } 340 341 return NULL; 342 } 343 344 /** 345 * of_platform_bus_create() - Create a device for a node and its children. 346 * @bus: device node of the bus to instantiate 347 * @matches: match table for bus nodes 348 * @lookup: auxdata table for matching id and platform_data with device nodes 349 * @parent: parent for new device, or NULL for top level. 350 * @strict: require compatible property 351 * 352 * Creates a platform_device for the provided device_node, and optionally 353 * recursively create devices for all the child nodes. 354 */ 355 static int of_platform_bus_create(struct device_node *bus, 356 const struct of_device_id *matches, 357 const struct of_dev_auxdata *lookup, 358 struct device *parent, bool strict) 359 { 360 const struct of_dev_auxdata *auxdata; 361 struct device_node *child; 362 struct platform_device *dev; 363 const char *bus_id = NULL; 364 void *platform_data = NULL; 365 int rc = 0; 366 367 /* Make sure it has a compatible property */ 368 if (strict && (!of_get_property(bus, "compatible", NULL))) { 369 pr_debug("%s() - skipping %s, no compatible prop\n", 370 __func__, bus->full_name); 371 return 0; 372 } 373 374 auxdata = of_dev_lookup(lookup, bus); 375 if (auxdata) { 376 bus_id = auxdata->name; 377 platform_data = auxdata->platform_data; 378 } 379 380 if (of_device_is_compatible(bus, "arm,primecell")) { 381 of_amba_device_create(bus, bus_id, platform_data, parent); 382 return 0; 383 } 384 385 dev = of_platform_device_create_pdata(bus, bus_id, platform_data, parent); 386 if (!dev || !of_match_node(matches, bus)) 387 return 0; 388 389 for_each_child_of_node(bus, child) { 390 pr_debug(" create child: %s\n", child->full_name); 391 rc = of_platform_bus_create(child, matches, lookup, &dev->dev, strict); 392 if (rc) { 393 of_node_put(child); 394 break; 395 } 396 } 397 return rc; 398 } 399 400 /** 401 * of_platform_bus_probe() - Probe the device-tree for platform buses 402 * @root: parent of the first level to probe or NULL for the root of the tree 403 * @matches: match table for bus nodes 404 * @parent: parent to hook devices from, NULL for toplevel 405 * 406 * Note that children of the provided root are not instantiated as devices 407 * unless the specified root itself matches the bus list and is not NULL. 408 */ 409 int of_platform_bus_probe(struct device_node *root, 410 const struct of_device_id *matches, 411 struct device *parent) 412 { 413 struct device_node *child; 414 int rc = 0; 415 416 root = root ? of_node_get(root) : of_find_node_by_path("/"); 417 if (!root) 418 return -EINVAL; 419 420 pr_debug("of_platform_bus_probe()\n"); 421 pr_debug(" starting at: %s\n", root->full_name); 422 423 /* Do a self check of bus type, if there's a match, create children */ 424 if (of_match_node(matches, root)) { 425 rc = of_platform_bus_create(root, matches, NULL, parent, false); 426 } else for_each_child_of_node(root, child) { 427 if (!of_match_node(matches, child)) 428 continue; 429 rc = of_platform_bus_create(child, matches, NULL, parent, false); 430 if (rc) 431 break; 432 } 433 434 of_node_put(root); 435 return rc; 436 } 437 EXPORT_SYMBOL(of_platform_bus_probe); 438 439 /** 440 * of_platform_populate() - Populate platform_devices from device tree data 441 * @root: parent of the first level to probe or NULL for the root of the tree 442 * @matches: match table, NULL to use the default 443 * @lookup: auxdata table for matching id and platform_data with device nodes 444 * @parent: parent to hook devices from, NULL for toplevel 445 * 446 * Similar to of_platform_bus_probe(), this function walks the device tree 447 * and creates devices from nodes. It differs in that it follows the modern 448 * convention of requiring all device nodes to have a 'compatible' property, 449 * and it is suitable for creating devices which are children of the root 450 * node (of_platform_bus_probe will only create children of the root which 451 * are selected by the @matches argument). 452 * 453 * New board support should be using this function instead of 454 * of_platform_bus_probe(). 455 * 456 * Returns 0 on success, < 0 on failure. 457 */ 458 int of_platform_populate(struct device_node *root, 459 const struct of_device_id *matches, 460 const struct of_dev_auxdata *lookup, 461 struct device *parent) 462 { 463 struct device_node *child; 464 int rc = 0; 465 466 root = root ? of_node_get(root) : of_find_node_by_path("/"); 467 if (!root) 468 return -EINVAL; 469 470 for_each_child_of_node(root, child) { 471 rc = of_platform_bus_create(child, matches, lookup, parent, true); 472 if (rc) 473 break; 474 } 475 476 of_node_put(root); 477 return rc; 478 } 479 EXPORT_SYMBOL_GPL(of_platform_populate); 480 #endif /* CONFIG_OF_ADDRESS */ 481