platform.c 17.2 KB
Newer Older
S
Stephen Rothwell 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 *    Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
 *			 <benh@kernel.crashing.org>
 *    and		 Arnd Bergmann, IBM Corp.
 *    Merged from powerpc/kernel/of_platform.c and
 *    sparc{,64}/kernel/of_device.c by Stephen Rothwell
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version
 *  2 of the License, or (at your option) any later version.
 *
 */
#include <linux/errno.h>
15
#include <linux/module.h>
16
#include <linux/amba/bus.h>
S
Stephen Rothwell 已提交
17
#include <linux/device.h>
18
#include <linux/dma-mapping.h>
G
Grant Likely 已提交
19
#include <linux/slab.h>
20
#include <linux/of_address.h>
S
Stephen Rothwell 已提交
21
#include <linux/of_device.h>
22
#include <linux/of_iommu.h>
23
#include <linux/of_irq.h>
S
Stephen Rothwell 已提交
24
#include <linux/of_platform.h>
25 26
#include <linux/platform_device.h>

27 28 29 30 31 32 33 34
const struct of_device_id of_default_bus_match_table[] = {
	{ .compatible = "simple-bus", },
#ifdef CONFIG_ARM_AMBA
	{ .compatible = "arm,amba-bus", },
#endif /* CONFIG_ARM_AMBA */
	{} /* Empty terminated list */
};

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
static int of_dev_node_match(struct device *dev, void *data)
{
	return dev->of_node == data;
}

/**
 * of_find_device_by_node - Find the platform_device associated with a node
 * @np: Pointer to device tree node
 *
 * Returns platform_device pointer, or NULL if not found
 */
struct platform_device *of_find_device_by_node(struct device_node *np)
{
	struct device *dev;

	dev = bus_find_device(&platform_bus_type, NULL, np, of_dev_node_match);
	return dev ? to_platform_device(dev) : NULL;
}
EXPORT_SYMBOL(of_find_device_by_node);

55
#ifdef CONFIG_OF_ADDRESS
56 57 58 59 60 61 62 63
/*
 * The following routines scan a subtree and registers a device for
 * each applicable node.
 *
 * Note: sparc doesn't use these routines because it has a different
 * mechanism for creating devices from device tree nodes.
 */

64 65 66 67
/**
 * of_device_make_bus_id - Use the device node data to assign a unique name
 * @dev: pointer to device structure that is linked to a device tree node
 *
68 69 70
 * This routine will first try using the translated bus address to
 * derive a unique name. If it cannot, then it will prepend names from
 * parent nodes until a unique name can be derived.
71
 */
72
void of_device_make_bus_id(struct device *dev)
73 74
{
	struct device_node *node = dev->of_node;
K
Kim Phillips 已提交
75
	const __be32 *reg;
76 77
	u64 addr;

78 79 80 81 82 83 84 85 86 87 88
	/* Construct the name, using parent nodes if necessary to ensure uniqueness */
	while (node->parent) {
		/*
		 * If the address can be translated, then that is as much
		 * uniqueness as we need. Make it the first component and return
		 */
		reg = of_get_property(node, "reg", NULL);
		if (reg && (addr = of_translate_address(node, reg)) != OF_BAD_ADDR) {
			dev_set_name(dev, dev_name(dev) ? "%llx.%s:%s" : "%llx.%s",
				     (unsigned long long)addr, node->name,
				     dev_name(dev));
89 90 91
			return;
		}

92 93 94 95 96
		/* format arguments only used if dev_name() resolves to NULL */
		dev_set_name(dev, dev_name(dev) ? "%s:%s" : "%s",
			     strrchr(node->full_name, '/') + 1, dev_name(dev));
		node = node->parent;
	}
97 98 99 100 101 102 103 104
}

/**
 * of_device_alloc - Allocate and initialize an of_device
 * @np: device node to assign to device
 * @bus_id: Name to assign to the device.  May be null to use default name.
 * @parent: Parent device.
 */
105
struct platform_device *of_device_alloc(struct device_node *np,
106 107 108
				  const char *bus_id,
				  struct device *parent)
{
109
	struct platform_device *dev;
110
	int rc, i, num_reg = 0, num_irq;
111 112
	struct resource *res, temp_res;

113 114 115 116 117
	dev = platform_device_alloc("", -1);
	if (!dev)
		return NULL;

	/* count the io and irq resources */
118 119
	while (of_address_to_resource(np, num_reg, &temp_res) == 0)
		num_reg++;
120
	num_irq = of_irq_count(np);
121 122 123

	/* Populate the resource table */
	if (num_irq || num_reg) {
124 125 126 127 128 129
		res = kzalloc(sizeof(*res) * (num_irq + num_reg), GFP_KERNEL);
		if (!res) {
			platform_device_put(dev);
			return NULL;
		}

130 131 132 133 134 135
		dev->num_resources = num_reg + num_irq;
		dev->resource = res;
		for (i = 0; i < num_reg; i++, res++) {
			rc = of_address_to_resource(np, i, res);
			WARN_ON(rc);
		}
136 137 138
		if (of_irq_to_resource_table(np, res, num_irq) != num_irq)
			pr_debug("not all legacy IRQ resources mapped for %s\n",
				 np->name);
139
	}
140 141

	dev->dev.of_node = of_node_get(np);
142
	dev->dev.parent = parent ? : &platform_bus;
143 144 145 146 147 148 149 150 151 152

	if (bus_id)
		dev_set_name(&dev->dev, "%s", bus_id);
	else
		of_device_make_bus_id(&dev->dev);

	return dev;
}
EXPORT_SYMBOL(of_device_alloc);

153 154 155 156 157 158 159 160 161 162 163
/**
 * of_dma_configure - Setup DMA configuration
 * @dev:	Device to apply DMA configuration
 *
 * Try to get devices's DMA configuration from DT and update it
 * accordingly.
 *
 * In case if platform code need to use own special DMA configuration,it
 * can use Platform bus notifier and handle BUS_NOTIFY_ADD_DEVICE event
 * to fix up DMA configuration.
 */
164
static void of_dma_configure(struct device *dev)
165 166 167
{
	u64 dma_addr, paddr, size;
	int ret;
168 169
	bool coherent;
	unsigned long offset;
170
	struct iommu_ops *iommu;
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

	/*
	 * Set default dma-mask to 32 bit. Drivers are expected to setup
	 * the correct supported dma_mask.
	 */
	dev->coherent_dma_mask = DMA_BIT_MASK(32);

	/*
	 * Set it to coherent_dma_mask by default if the architecture
	 * code has not set it.
	 */
	if (!dev->dma_mask)
		dev->dma_mask = &dev->coherent_dma_mask;

	ret = of_dma_get_range(dev->of_node, &dma_addr, &paddr, &size);
	if (ret < 0) {
187 188 189 190
		dma_addr = offset = 0;
		size = dev->coherent_dma_mask;
	} else {
		offset = PFN_DOWN(paddr - dma_addr);
191
		dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", offset);
192
	}
193 194 195 196 197
	dev->dma_pfn_offset = offset;

	coherent = of_dma_is_coherent(dev->of_node);
	dev_dbg(dev, "device is%sdma coherent\n",
		coherent ? " " : " not ");
198

199 200 201
	iommu = of_iommu_configure(dev);
	dev_dbg(dev, "device is%sbehind an iommu\n",
		iommu ? " " : " not ");
202

203 204 205 206 207 208
	arch_setup_dma_ops(dev, dma_addr, size, iommu, coherent);
}

static void of_dma_deconfigure(struct device *dev)
{
	arch_teardown_dma_ops(dev);
209 210
}

211
/**
212
 * of_platform_device_create_pdata - Alloc, initialize and register an of_device
213 214
 * @np: pointer to node to create device for
 * @bus_id: name to assign device
215
 * @platform_data: pointer to populate platform_data pointer with
216
 * @parent: Linux device model parent device.
217 218 219
 *
 * Returns pointer to created platform device, or NULL if a device was not
 * registered.  Unavailable devices will not get registered.
220
 */
221
static struct platform_device *of_platform_device_create_pdata(
222 223 224 225
					struct device_node *np,
					const char *bus_id,
					void *platform_data,
					struct device *parent)
226
{
227
	struct platform_device *dev;
228

229 230
	if (!of_device_is_available(np) ||
	    of_node_test_and_set_flag(np, OF_POPULATED))
231 232
		return NULL;

233 234
	dev = of_device_alloc(np, bus_id, parent);
	if (!dev)
235
		goto err_clear_flag;
236

237
	dev->dev.bus = &platform_bus_type;
238
	dev->dev.platform_data = platform_data;
239
	of_dma_configure(&dev->dev);
240

241
	if (of_device_add(dev) != 0) {
242
		of_dma_deconfigure(&dev->dev);
243
		platform_device_put(dev);
244
		goto err_clear_flag;
245 246 247
	}

	return dev;
248 249 250 251

err_clear_flag:
	of_node_clear_flag(np, OF_POPULATED);
	return NULL;
252
}
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268

/**
 * of_platform_device_create - Alloc, initialize and register an of_device
 * @np: pointer to node to create device for
 * @bus_id: name to assign device
 * @parent: Linux device model parent device.
 *
 * Returns pointer to created platform device, or NULL if a device was not
 * registered.  Unavailable devices will not get registered.
 */
struct platform_device *of_platform_device_create(struct device_node *np,
					    const char *bus_id,
					    struct device *parent)
{
	return of_platform_device_create_pdata(np, bus_id, NULL, parent);
}
269 270
EXPORT_SYMBOL(of_platform_device_create);

271 272 273 274 275 276 277 278 279 280 281 282
#ifdef CONFIG_ARM_AMBA
static struct amba_device *of_amba_device_create(struct device_node *node,
						 const char *bus_id,
						 void *platform_data,
						 struct device *parent)
{
	struct amba_device *dev;
	const void *prop;
	int i, ret;

	pr_debug("Creating amba device %s\n", node->full_name);

283 284
	if (!of_device_is_available(node) ||
	    of_node_test_and_set_flag(node, OF_POPULATED))
285 286
		return NULL;

287
	dev = amba_device_alloc(NULL, 0, 0);
288 289 290
	if (!dev) {
		pr_err("%s(): amba_device_alloc() failed for %s\n",
		       __func__, node->full_name);
291
		goto err_clear_flag;
292
	}
293 294 295

	/* setup generic device info */
	dev->dev.of_node = of_node_get(node);
296
	dev->dev.parent = parent ? : &platform_bus;
297 298 299 300 301
	dev->dev.platform_data = platform_data;
	if (bus_id)
		dev_set_name(&dev->dev, "%s", bus_id);
	else
		of_device_make_bus_id(&dev->dev);
302
	of_dma_configure(&dev->dev);
303 304 305 306 307 308 309 310 311 312 313

	/* Allow the HW Peripheral ID to be overridden */
	prop = of_get_property(node, "arm,primecell-periphid", NULL);
	if (prop)
		dev->periphid = of_read_ulong(prop, 1);

	/* Decode the IRQs and address ranges */
	for (i = 0; i < AMBA_NR_IRQS; i++)
		dev->irq[i] = irq_of_parse_and_map(node, i);

	ret = of_address_to_resource(node, 0, &dev->res);
314 315 316
	if (ret) {
		pr_err("%s(): of_address_to_resource() failed (%d) for %s\n",
		       __func__, ret, node->full_name);
317
		goto err_free;
318
	}
319

320
	ret = amba_device_add(dev, &iomem_resource);
321 322 323
	if (ret) {
		pr_err("%s(): amba_device_add() failed (%d) for %s\n",
		       __func__, ret, node->full_name);
324
		goto err_free;
325
	}
326 327 328 329

	return dev;

err_free:
330
	amba_device_put(dev);
331 332
err_clear_flag:
	of_node_clear_flag(node, OF_POPULATED);
333 334 335 336 337 338 339 340 341 342 343 344
	return NULL;
}
#else /* CONFIG_ARM_AMBA */
static struct amba_device *of_amba_device_create(struct device_node *node,
						 const char *bus_id,
						 void *platform_data,
						 struct device *parent)
{
	return NULL;
}
#endif /* CONFIG_ARM_AMBA */

345 346 347 348 349 350 351
/**
 * of_devname_lookup() - Given a device node, lookup the preferred Linux name
 */
static const struct of_dev_auxdata *of_dev_lookup(const struct of_dev_auxdata *lookup,
				 struct device_node *np)
{
	struct resource res;
O
Olof Johansson 已提交
352 353 354 355

	if (!lookup)
		return NULL;

356
	for(; lookup->compatible != NULL; lookup++) {
O
Olof Johansson 已提交
357 358
		if (!of_device_is_compatible(np, lookup->compatible))
			continue;
359 360 361
		if (!of_address_to_resource(np, 0, &res))
			if (res.start != lookup->phys_addr)
				continue;
O
Olof Johansson 已提交
362 363
		pr_debug("%s: devname=%s\n", np->full_name, lookup->name);
		return lookup;
364
	}
O
Olof Johansson 已提交
365

366 367 368
	return NULL;
}

369
/**
370
 * of_platform_bus_create() - Create a device for a node and its children.
371
 * @bus: device node of the bus to instantiate
372
 * @matches: match table for bus nodes
O
Olof Johansson 已提交
373
 * @lookup: auxdata table for matching id and platform_data with device nodes
374
 * @parent: parent for new device, or NULL for top level.
O
Olof Johansson 已提交
375
 * @strict: require compatible property
376 377 378
 *
 * Creates a platform_device for the provided device_node, and optionally
 * recursively create devices for all the child nodes.
379
 */
380
static int of_platform_bus_create(struct device_node *bus,
381
				  const struct of_device_id *matches,
382
				  const struct of_dev_auxdata *lookup,
383
				  struct device *parent, bool strict)
384
{
385
	const struct of_dev_auxdata *auxdata;
386
	struct device_node *child;
387
	struct platform_device *dev;
388 389
	const char *bus_id = NULL;
	void *platform_data = NULL;
390 391
	int rc = 0;

392 393 394 395 396 397 398
	/* Make sure it has a compatible property */
	if (strict && (!of_get_property(bus, "compatible", NULL))) {
		pr_debug("%s() - skipping %s, no compatible prop\n",
			 __func__, bus->full_name);
		return 0;
	}

399 400 401 402 403 404
	auxdata = of_dev_lookup(lookup, bus);
	if (auxdata) {
		bus_id = auxdata->name;
		platform_data = auxdata->platform_data;
	}

405
	if (of_device_is_compatible(bus, "arm,primecell")) {
406 407 408 409
		/*
		 * Don't return an error here to keep compatibility with older
		 * device tree files.
		 */
410
		of_amba_device_create(bus, bus_id, platform_data, parent);
411 412 413
		return 0;
	}

414
	dev = of_platform_device_create_pdata(bus, bus_id, platform_data, parent);
415 416 417
	if (!dev || !of_match_node(matches, bus))
		return 0;

418 419
	for_each_child_of_node(bus, child) {
		pr_debug("   create child: %s\n", child->full_name);
420
		rc = of_platform_bus_create(child, matches, lookup, &dev->dev, strict);
421 422 423 424 425
		if (rc) {
			of_node_put(child);
			break;
		}
	}
426
	of_node_set_flag(bus, OF_POPULATED_BUS);
427 428 429 430
	return rc;
}

/**
431
 * of_platform_bus_probe() - Probe the device-tree for platform buses
432
 * @root: parent of the first level to probe or NULL for the root of the tree
433
 * @matches: match table for bus nodes
434 435 436 437 438 439 440 441 442 443 444 445
 * @parent: parent to hook devices from, NULL for toplevel
 *
 * Note that children of the provided root are not instantiated as devices
 * unless the specified root itself matches the bus list and is not NULL.
 */
int of_platform_bus_probe(struct device_node *root,
			  const struct of_device_id *matches,
			  struct device *parent)
{
	struct device_node *child;
	int rc = 0;

446 447
	root = root ? of_node_get(root) : of_find_node_by_path("/");
	if (!root)
448
		return -EINVAL;
449 450 451 452

	pr_debug("of_platform_bus_probe()\n");
	pr_debug(" starting at: %s\n", root->full_name);

453
	/* Do a self check of bus type, if there's a match, create children */
454
	if (of_match_node(matches, root)) {
455
		rc = of_platform_bus_create(root, matches, NULL, parent, false);
456
	} else for_each_child_of_node(root, child) {
457 458
		if (!of_match_node(matches, child))
			continue;
459
		rc = of_platform_bus_create(child, matches, NULL, parent, false);
460
		if (rc)
461 462
			break;
	}
463

464 465 466 467
	of_node_put(root);
	return rc;
}
EXPORT_SYMBOL(of_platform_bus_probe);
468 469 470 471 472

/**
 * of_platform_populate() - Populate platform_devices from device tree data
 * @root: parent of the first level to probe or NULL for the root of the tree
 * @matches: match table, NULL to use the default
473
 * @lookup: auxdata table for matching id and platform_data with device nodes
474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489
 * @parent: parent to hook devices from, NULL for toplevel
 *
 * Similar to of_platform_bus_probe(), this function walks the device tree
 * and creates devices from nodes.  It differs in that it follows the modern
 * convention of requiring all device nodes to have a 'compatible' property,
 * and it is suitable for creating devices which are children of the root
 * node (of_platform_bus_probe will only create children of the root which
 * are selected by the @matches argument).
 *
 * New board support should be using this function instead of
 * of_platform_bus_probe().
 *
 * Returns 0 on success, < 0 on failure.
 */
int of_platform_populate(struct device_node *root,
			const struct of_device_id *matches,
490
			const struct of_dev_auxdata *lookup,
491 492 493 494 495 496 497 498 499 500
			struct device *parent)
{
	struct device_node *child;
	int rc = 0;

	root = root ? of_node_get(root) : of_find_node_by_path("/");
	if (!root)
		return -EINVAL;

	for_each_child_of_node(root, child) {
501
		rc = of_platform_bus_create(child, matches, lookup, parent, true);
502 503 504
		if (rc)
			break;
	}
505
	of_node_set_flag(root, OF_POPULATED_BUS);
506 507 508 509

	of_node_put(root);
	return rc;
}
510
EXPORT_SYMBOL_GPL(of_platform_populate);
511 512 513 514

static int of_platform_device_destroy(struct device *dev, void *data)
{
	/* Do not touch devices not populated from the device tree */
515
	if (!dev->of_node || !of_node_check_flag(dev->of_node, OF_POPULATED))
516 517
		return 0;

518 519 520
	/* Recurse for any nodes that were treated as busses */
	if (of_node_check_flag(dev->of_node, OF_POPULATED_BUS))
		device_for_each_child(dev, NULL, of_platform_device_destroy);
521 522 523 524 525 526 527 528 529

	if (dev->bus == &platform_bus_type)
		platform_device_unregister(to_platform_device(dev));
#ifdef CONFIG_ARM_AMBA
	else if (dev->bus == &amba_bustype)
		amba_device_unregister(to_amba_device(dev));
#endif

	of_node_clear_flag(dev->of_node, OF_POPULATED);
530
	of_node_clear_flag(dev->of_node, OF_POPULATED_BUS);
531 532 533 534 535
	return 0;
}

/**
 * of_platform_depopulate() - Remove devices populated from device tree
536
 * @parent: device which children will be removed
537 538 539 540 541 542 543 544 545
 *
 * Complementary to of_platform_populate(), this function removes children
 * of the given device (and, recurrently, their children) that have been
 * created from their respective device tree nodes (and only those,
 * leaving others - eg. manually created - unharmed).
 *
 * Returns 0 when all children devices have been removed or
 * -EBUSY when some children remained.
 */
546
void of_platform_depopulate(struct device *parent)
547
{
548 549 550 551
	if (parent->of_node && of_node_check_flag(parent->of_node, OF_POPULATED_BUS)) {
		device_for_each_child(parent, NULL, of_platform_device_destroy);
		of_node_clear_flag(parent->of_node, OF_POPULATED_BUS);
	}
552 553 554
}
EXPORT_SYMBOL_GPL(of_platform_depopulate);

555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609
#ifdef CONFIG_OF_DYNAMIC
static int of_platform_notify(struct notifier_block *nb,
				unsigned long action, void *arg)
{
	struct of_reconfig_data *rd = arg;
	struct platform_device *pdev_parent, *pdev;
	bool children_left;

	switch (of_reconfig_get_state_change(action, rd)) {
	case OF_RECONFIG_CHANGE_ADD:
		/* verify that the parent is a bus */
		if (!of_node_check_flag(rd->dn->parent, OF_POPULATED_BUS))
			return NOTIFY_OK;	/* not for us */

		/* pdev_parent may be NULL when no bus platform device */
		pdev_parent = of_find_device_by_node(rd->dn->parent);
		pdev = of_platform_device_create(rd->dn, NULL,
				pdev_parent ? &pdev_parent->dev : NULL);
		of_dev_put(pdev_parent);

		if (pdev == NULL) {
			pr_err("%s: failed to create for '%s'\n",
					__func__, rd->dn->full_name);
			/* of_platform_device_create tosses the error code */
			return notifier_from_errno(-EINVAL);
		}
		break;

	case OF_RECONFIG_CHANGE_REMOVE:
		/* find our device by node */
		pdev = of_find_device_by_node(rd->dn);
		if (pdev == NULL)
			return NOTIFY_OK;	/* no? not meant for us */

		/* unregister takes one ref away */
		of_platform_device_destroy(&pdev->dev, &children_left);

		/* and put the reference of the find */
		of_dev_put(pdev);
		break;
	}

	return NOTIFY_OK;
}

static struct notifier_block platform_of_notifier = {
	.notifier_call = of_platform_notify,
};

void of_platform_register_reconfig_notifier(void)
{
	WARN_ON(of_reconfig_notifier_register(&platform_of_notifier));
}
#endif /* CONFIG_OF_DYNAMIC */

610
#endif /* CONFIG_OF_ADDRESS */