platform.c 13.0 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_irq.h>
S
Stephen Rothwell 已提交
23
#include <linux/of_platform.h>
24
#include <linux/of_reserved_mem.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 56 57 58
#if defined(CONFIG_PPC_DCR)
#include <asm/dcr.h>
#endif

59
#ifdef CONFIG_OF_ADDRESS
60 61 62 63 64 65 66 67
/*
 * 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.
 */

68 69 70 71 72 73 74 75
/**
 * 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
 *
 * This routine will first try using either the dcr-reg or the reg property
 * value to derive a unique name.  As a last resort it will use the node
 * name followed by a unique number.
 */
76
void of_device_make_bus_id(struct device *dev)
77 78 79
{
	static atomic_t bus_no_reg_magic;
	struct device_node *node = dev->of_node;
K
Kim Phillips 已提交
80
	const __be32 *reg;
81
	u64 addr;
82
	const __be32 *addrp;
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
	int magic;

#ifdef CONFIG_PPC_DCR
	/*
	 * If it's a DCR based device, use 'd' for native DCRs
	 * and 'D' for MMIO DCRs.
	 */
	reg = of_get_property(node, "dcr-reg", NULL);
	if (reg) {
#ifdef CONFIG_PPC_DCR_NATIVE
		dev_set_name(dev, "d%x.%s", *reg, node->name);
#else /* CONFIG_PPC_DCR_NATIVE */
		u64 addr = of_translate_dcr_address(node, *reg, NULL);
		if (addr != OF_BAD_ADDR) {
			dev_set_name(dev, "D%llx.%s",
				     (unsigned long long)addr, node->name);
			return;
		}
#endif /* !CONFIG_PPC_DCR_NATIVE */
	}
#endif /* CONFIG_PPC_DCR */

	/*
	 * For MMIO, get the physical address
	 */
	reg = of_get_property(node, "reg", NULL);
	if (reg) {
110 111 112 113 114 115 116 117 118
		if (of_can_translate_address(node)) {
			addr = of_translate_address(node, reg);
		} else {
			addrp = of_get_address(node, 0, NULL, NULL);
			if (addrp)
				addr = of_read_number(addrp, 1);
			else
				addr = OF_BAD_ADDR;
		}
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
		if (addr != OF_BAD_ADDR) {
			dev_set_name(dev, "%llx.%s",
				     (unsigned long long)addr, node->name);
			return;
		}
	}

	/*
	 * No BusID, use the node name and add a globally incremented
	 * counter (and pray...)
	 */
	magic = atomic_add_return(1, &bus_no_reg_magic);
	dev_set_name(dev, "%s.%d", node->name, magic - 1);
}

/**
 * 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.
 */
140
struct platform_device *of_device_alloc(struct device_node *np,
141 142 143
				  const char *bus_id,
				  struct device *parent)
{
144
	struct platform_device *dev;
145
	int rc, i, num_reg = 0, num_irq;
146 147
	struct resource *res, temp_res;

148 149 150 151 152
	dev = platform_device_alloc("", -1);
	if (!dev)
		return NULL;

	/* count the io and irq resources */
153 154 155
	if (of_can_translate_address(np))
		while (of_address_to_resource(np, num_reg, &temp_res) == 0)
			num_reg++;
156
	num_irq = of_irq_count(np);
157 158 159

	/* Populate the resource table */
	if (num_irq || num_reg) {
160 161 162 163 164 165
		res = kzalloc(sizeof(*res) * (num_irq + num_reg), GFP_KERNEL);
		if (!res) {
			platform_device_put(dev);
			return NULL;
		}

166 167 168 169 170 171
		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);
		}
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 180 181 182 183 184 185 186 187 188 189
	dev->dev.parent = parent;

	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);

190
/**
191
 * of_platform_device_create_pdata - Alloc, initialize and register an of_device
192 193
 * @np: pointer to node to create device for
 * @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 198
 *
 * Returns pointer to created platform device, or NULL if a device was not
 * registered.  Unavailable devices will not get registered.
199
 */
200 201 202 203 204
struct platform_device *of_platform_device_create_pdata(
					struct device_node *np,
					const char *bus_id,
					void *platform_data,
					struct device *parent)
205
{
206
	struct platform_device *dev;
207

208 209 210
	if (!of_device_is_available(np))
		return NULL;

211 212 213 214
	dev = of_device_alloc(np, bus_id, parent);
	if (!dev)
		return NULL;

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 223
	of_reserved_mem_device_init(&dev->dev);

224 225 226 227 228
	/* We do not fill the DMA ops for platform devices by default.
	 * This is currently the responsibility of the platform code
	 * to do such, possibly using a device notifier
	 */

229 230
	if (of_device_add(dev) != 0) {
		platform_device_put(dev);
231
		of_reserved_mem_device_release(&dev->dev);
232 233 234 235 236
		return NULL;
	}

	return dev;
}
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252

/**
 * 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);
}
253 254
EXPORT_SYMBOL(of_platform_device_create);

255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
#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);

	if (!of_device_is_available(node))
		return NULL;

270
	dev = amba_device_alloc(NULL, 0, 0);
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
	if (!dev)
		return NULL;

	/* setup generic device info */
	dev->dev.coherent_dma_mask = ~0;
	dev->dev.of_node = of_node_get(node);
	dev->dev.parent = parent;
	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);

	/* setup amba-specific device info */
	dev->dma_mask = ~0;

	/* 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);
	if (ret)
		goto err_free;

300
	ret = amba_device_add(dev, &iomem_resource);
301 302 303 304 305 306
	if (ret)
		goto err_free;

	return dev;

err_free:
307
	amba_device_put(dev);
308 309 310 311 312 313 314 315 316 317 318 319
	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 */

320 321 322 323 324 325 326
/**
 * 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 已提交
327 328 329 330

	if (!lookup)
		return NULL;

331
	for(; lookup->compatible != NULL; lookup++) {
O
Olof Johansson 已提交
332 333
		if (!of_device_is_compatible(np, lookup->compatible))
			continue;
334 335 336
		if (!of_address_to_resource(np, 0, &res))
			if (res.start != lookup->phys_addr)
				continue;
O
Olof Johansson 已提交
337 338
		pr_debug("%s: devname=%s\n", np->full_name, lookup->name);
		return lookup;
339
	}
O
Olof Johansson 已提交
340

341 342 343
	return NULL;
}

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
O
Olof Johansson 已提交
348
 * @lookup: auxdata table for matching id and platform_data with device nodes
349
 * @parent: parent for new device, or NULL for top level.
O
Olof Johansson 已提交
350
 * @strict: require compatible property
351 352 353
 *
 * Creates a platform_device for the provided device_node, and optionally
 * 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 364
	const char *bus_id = NULL;
	void *platform_data = NULL;
365 366
	int rc = 0;

367 368 369 370 371 372 373
	/* 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;
	}

374 375 376 377 378 379
	auxdata = of_dev_lookup(lookup, bus);
	if (auxdata) {
		bus_id = auxdata->name;
		platform_data = auxdata->platform_data;
	}

380
	if (of_device_is_compatible(bus, "arm,primecell")) {
381
		of_amba_device_create(bus, bus_id, platform_data, parent);
382 383 384
		return 0;
	}

385
	dev = of_platform_device_create_pdata(bus, bus_id, platform_data, parent);
386 387 388
	if (!dev || !of_match_node(matches, bus))
		return 0;

389 390
	for_each_child_of_node(bus, child) {
		pr_debug("   create child: %s\n", child->full_name);
391
		rc = of_platform_bus_create(child, matches, lookup, &dev->dev, strict);
392 393 394 395 396 397 398 399 400
		if (rc) {
			of_node_put(child);
			break;
		}
	}
	return rc;
}

/**
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 405 406 407 408 409 410 411 412 413 414 415
 * @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;

416 417
	root = root ? of_node_get(root) : of_find_node_by_path("/");
	if (!root)
418
		return -EINVAL;
419 420 421 422

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

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 428
		if (!of_match_node(matches, child))
			continue;
429
		rc = of_platform_bus_create(child, matches, NULL, parent, false);
430
		if (rc)
431 432
			break;
	}
433

434 435 436 437
	of_node_put(root);
	return rc;
}
EXPORT_SYMBOL(of_platform_bus_probe);
438 439 440 441 442

/**
 * 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
443
 * @lookup: auxdata table for matching id and platform_data with device nodes
444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
 * @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,
460
			const struct of_dev_auxdata *lookup,
461 462 463 464 465 466 467 468 469 470
			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) {
471
		rc = of_platform_bus_create(child, matches, lookup, parent, true);
472 473 474 475 476 477 478
		if (rc)
			break;
	}

	of_node_put(root);
	return rc;
}
479
EXPORT_SYMBOL_GPL(of_platform_populate);
480
#endif /* CONFIG_OF_ADDRESS */