platform.c 29.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12
/*
 * platform.c - platform 'pseudo' bus for legacy devices
 *
 * Copyright (c) 2002-3 Patrick Mochel
 * Copyright (c) 2002-3 Open Source Development Labs
 *
 * This file is released under the GPLv2
 *
 * Please see Documentation/driver-model/platform.txt for more
 * information.
 */

13
#include <linux/string.h>
14
#include <linux/platform_device.h>
15
#include <linux/of_device.h>
L
Linus Torvalds 已提交
16 17 18 19 20
#include <linux/module.h>
#include <linux/init.h>
#include <linux/dma-mapping.h>
#include <linux/bootmem.h>
#include <linux/err.h>
T
Tim Schmielau 已提交
21
#include <linux/slab.h>
22
#include <linux/pm_runtime.h>
23
#include <linux/idr.h>
L
Linus Torvalds 已提交
24

25
#include "base.h"
26
#include "power/power.h"
27

28 29 30
/* For automatically allocated device IDs */
static DEFINE_IDA(platform_devid_ida);

31 32
#define to_platform_driver(drv)	(container_of((drv), struct platform_driver, \
				 driver))
R
Russell King 已提交
33

L
Linus Torvalds 已提交
34
struct device platform_bus = {
35
	.init_name	= "platform",
L
Linus Torvalds 已提交
36
};
37
EXPORT_SYMBOL_GPL(platform_bus);
L
Linus Torvalds 已提交
38

39 40
/**
 * arch_setup_pdev_archdata - Allow manipulation of archdata before its used
41
 * @pdev: platform device
42 43 44 45 46
 *
 * This is called before platform_device_add() such that any pdev_archdata may
 * be setup before the platform_notifier is called.  So if a user needs to
 * manipulate any relevant information in the pdev_archdata they can do:
 *
47
 *	platform_device_alloc()
48 49 50 51 52 53 54 55 56 57
 * 	... manipulate ...
 * 	platform_device_add()
 *
 * And if they don't care they can just call platform_device_register() and
 * everything will just work out.
 */
void __weak arch_setup_pdev_archdata(struct platform_device *pdev)
{
}

L
Linus Torvalds 已提交
58
/**
59 60 61 62
 * platform_get_resource - get a resource for a device
 * @dev: platform device
 * @type: resource type
 * @num: resource index
L
Linus Torvalds 已提交
63
 */
64 65
struct resource *platform_get_resource(struct platform_device *dev,
				       unsigned int type, unsigned int num)
L
Linus Torvalds 已提交
66 67 68 69 70 71
{
	int i;

	for (i = 0; i < dev->num_resources; i++) {
		struct resource *r = &dev->resource[i];

72 73
		if (type == resource_type(r) && num-- == 0)
			return r;
L
Linus Torvalds 已提交
74 75 76
	}
	return NULL;
}
77
EXPORT_SYMBOL_GPL(platform_get_resource);
L
Linus Torvalds 已提交
78 79

/**
80 81 82
 * platform_get_irq - get an IRQ for a device
 * @dev: platform device
 * @num: IRQ number index
L
Linus Torvalds 已提交
83 84 85
 */
int platform_get_irq(struct platform_device *dev, unsigned int num)
{
86 87 88 89 90 91
#ifdef CONFIG_SPARC
	/* sparc does not have irqs represented as IORESOURCE_IRQ resources */
	if (!dev || num >= dev->archdata.num_irqs)
		return -ENXIO;
	return dev->archdata.irqs[num];
#else
L
Linus Torvalds 已提交
92 93
	struct resource *r = platform_get_resource(dev, IORESOURCE_IRQ, num);

94
	return r ? r->start : -ENXIO;
95
#endif
L
Linus Torvalds 已提交
96
}
97
EXPORT_SYMBOL_GPL(platform_get_irq);
L
Linus Torvalds 已提交
98 99

/**
100 101 102 103
 * platform_get_resource_byname - get a resource for a device by name
 * @dev: platform device
 * @type: resource type
 * @name: resource name
L
Linus Torvalds 已提交
104
 */
105
struct resource *platform_get_resource_byname(struct platform_device *dev,
106 107
					      unsigned int type,
					      const char *name)
L
Linus Torvalds 已提交
108 109 110 111 112 113
{
	int i;

	for (i = 0; i < dev->num_resources; i++) {
		struct resource *r = &dev->resource[i];

114 115 116
		if (unlikely(!r->name))
			continue;

117 118
		if (type == resource_type(r) && !strcmp(r->name, name))
			return r;
L
Linus Torvalds 已提交
119 120 121
	}
	return NULL;
}
122
EXPORT_SYMBOL_GPL(platform_get_resource_byname);
L
Linus Torvalds 已提交
123 124

/**
125 126 127
 * platform_get_irq - get an IRQ for a device
 * @dev: platform device
 * @name: IRQ name
L
Linus Torvalds 已提交
128
 */
129
int platform_get_irq_byname(struct platform_device *dev, const char *name)
L
Linus Torvalds 已提交
130
{
131 132
	struct resource *r = platform_get_resource_byname(dev, IORESOURCE_IRQ,
							  name);
L
Linus Torvalds 已提交
133

134
	return r ? r->start : -ENXIO;
L
Linus Torvalds 已提交
135
}
136
EXPORT_SYMBOL_GPL(platform_get_irq_byname);
L
Linus Torvalds 已提交
137 138

/**
139 140 141
 * platform_add_devices - add a numbers of platform devices
 * @devs: array of platform devices to add
 * @num: number of platform devices in array
L
Linus Torvalds 已提交
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
 */
int platform_add_devices(struct platform_device **devs, int num)
{
	int i, ret = 0;

	for (i = 0; i < num; i++) {
		ret = platform_device_register(devs[i]);
		if (ret) {
			while (--i >= 0)
				platform_device_unregister(devs[i]);
			break;
		}
	}

	return ret;
}
158
EXPORT_SYMBOL_GPL(platform_add_devices);
L
Linus Torvalds 已提交
159

160 161 162 163 164
struct platform_object {
	struct platform_device pdev;
	char name[1];
};

L
Linus Torvalds 已提交
165
/**
166
 * platform_device_put - destroy a platform device
167
 * @pdev: platform device to free
168
 *
169 170
 * Free all memory associated with a platform device.  This function must
 * _only_ be externally called in error cases.  All other usage is a bug.
171 172 173 174 175 176 177 178 179 180
 */
void platform_device_put(struct platform_device *pdev)
{
	if (pdev)
		put_device(&pdev->dev);
}
EXPORT_SYMBOL_GPL(platform_device_put);

static void platform_device_release(struct device *dev)
{
181 182
	struct platform_object *pa = container_of(dev, struct platform_object,
						  pdev.dev);
183

184
	of_device_node_put(&pa->pdev.dev);
185
	kfree(pa->pdev.dev.platform_data);
186
	kfree(pa->pdev.mfd_cell);
187 188 189 190 191
	kfree(pa->pdev.resource);
	kfree(pa);
}

/**
192
 * platform_device_alloc - create a platform device
193 194
 * @name: base name of the device we're adding
 * @id: instance id
195
 *
196 197
 * Create a platform device object which can have other objects attached
 * to it, and which will have attached objects freed when it is released.
198
 */
199
struct platform_device *platform_device_alloc(const char *name, int id)
200 201 202 203 204 205 206 207 208 209
{
	struct platform_object *pa;

	pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
	if (pa) {
		strcpy(pa->name, name);
		pa->pdev.name = pa->name;
		pa->pdev.id = id;
		device_initialize(&pa->pdev.dev);
		pa->pdev.dev.release = platform_device_release;
210
		arch_setup_pdev_archdata(&pa->pdev);
211 212
	}

213
	return pa ? &pa->pdev : NULL;
214 215 216 217
}
EXPORT_SYMBOL_GPL(platform_device_alloc);

/**
218
 * platform_device_add_resources - add resources to a platform device
219 220 221
 * @pdev: platform device allocated by platform_device_alloc to add resources to
 * @res: set of resources that needs to be allocated for the device
 * @num: number of resources
222
 *
223 224 225
 * Add a copy of the resources to the platform device.  The memory
 * associated with the resources will be freed when the platform device is
 * released.
226
 */
227
int platform_device_add_resources(struct platform_device *pdev,
228
				  const struct resource *res, unsigned int num)
229
{
230
	struct resource *r = NULL;
231

232 233 234 235
	if (res) {
		r = kmemdup(res, sizeof(struct resource) * num, GFP_KERNEL);
		if (!r)
			return -ENOMEM;
236
	}
237

238
	kfree(pdev->resource);
239 240 241
	pdev->resource = r;
	pdev->num_resources = num;
	return 0;
242 243 244 245
}
EXPORT_SYMBOL_GPL(platform_device_add_resources);

/**
246
 * platform_device_add_data - add platform-specific data to a platform device
247 248 249
 * @pdev: platform device allocated by platform_device_alloc to add resources to
 * @data: platform specific data for this platform device
 * @size: size of platform specific data
250
 *
251 252 253
 * Add a copy of platform specific data to the platform device's
 * platform_data pointer.  The memory associated with the platform data
 * will be freed when the platform device is released.
254
 */
255 256
int platform_device_add_data(struct platform_device *pdev, const void *data,
			     size_t size)
257
{
258
	void *d = NULL;
259

260 261 262 263
	if (data) {
		d = kmemdup(data, size, GFP_KERNEL);
		if (!d)
			return -ENOMEM;
264
	}
265

266
	kfree(pdev->dev.platform_data);
267 268
	pdev->dev.platform_data = d;
	return 0;
269 270 271 272
}
EXPORT_SYMBOL_GPL(platform_device_add_data);

/**
273 274
 * platform_device_add - add a platform device to device hierarchy
 * @pdev: platform device we're adding
L
Linus Torvalds 已提交
275
 *
276 277
 * This is part 2 of platform_device_register(), though may be called
 * separately _iff_ pdev was allocated by platform_device_alloc().
L
Linus Torvalds 已提交
278
 */
279
int platform_device_add(struct platform_device *pdev)
L
Linus Torvalds 已提交
280
{
281
	int i, ret;
L
Linus Torvalds 已提交
282 283 284 285 286 287 288 289 290

	if (!pdev)
		return -EINVAL;

	if (!pdev->dev.parent)
		pdev->dev.parent = &platform_bus;

	pdev->dev.bus = &platform_bus_type;

291 292
	switch (pdev->id) {
	default:
293
		dev_set_name(&pdev->dev, "%s.%d", pdev->name,  pdev->id);
294 295
		break;
	case PLATFORM_DEVID_NONE:
296
		dev_set_name(&pdev->dev, "%s", pdev->name);
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
		break;
	case PLATFORM_DEVID_AUTO:
		/*
		 * Automatically allocated device ID. We mark it as such so
		 * that we remember it must be freed, and we append a suffix
		 * to avoid namespace collision with explicit IDs.
		 */
		ret = ida_simple_get(&platform_devid_ida, 0, 0, GFP_KERNEL);
		if (ret < 0)
			goto err_out;
		pdev->id = ret;
		pdev->id_auto = true;
		dev_set_name(&pdev->dev, "%s.%d.auto", pdev->name, pdev->id);
		break;
	}
L
Linus Torvalds 已提交
312 313 314 315 316

	for (i = 0; i < pdev->num_resources; i++) {
		struct resource *p, *r = &pdev->resource[i];

		if (r->name == NULL)
317
			r->name = dev_name(&pdev->dev);
L
Linus Torvalds 已提交
318 319 320

		p = r->parent;
		if (!p) {
321
			if (resource_type(r) == IORESOURCE_MEM)
L
Linus Torvalds 已提交
322
				p = &iomem_resource;
323
			else if (resource_type(r) == IORESOURCE_IO)
L
Linus Torvalds 已提交
324 325 326
				p = &ioport_resource;
		}

327
		if (p && insert_resource(p, r)) {
L
Linus Torvalds 已提交
328 329
			printk(KERN_ERR
			       "%s: failed to claim resource %d\n",
330
			       dev_name(&pdev->dev), i);
L
Linus Torvalds 已提交
331 332 333 334 335 336
			ret = -EBUSY;
			goto failed;
		}
	}

	pr_debug("Registering platform device '%s'. Parent at %s\n",
337
		 dev_name(&pdev->dev), dev_name(pdev->dev.parent));
L
Linus Torvalds 已提交
338

339
	ret = device_add(&pdev->dev);
L
Linus Torvalds 已提交
340 341 342 343
	if (ret == 0)
		return ret;

 failed:
344 345 346 347 348
	if (pdev->id_auto) {
		ida_simple_remove(&platform_devid_ida, pdev->id);
		pdev->id = PLATFORM_DEVID_AUTO;
	}

349 350 351 352 353 354 355 356
	while (--i >= 0) {
		struct resource *r = &pdev->resource[i];
		unsigned long type = resource_type(r);

		if (type == IORESOURCE_MEM || type == IORESOURCE_IO)
			release_resource(r);
	}

357
 err_out:
L
Linus Torvalds 已提交
358 359
	return ret;
}
360 361 362
EXPORT_SYMBOL_GPL(platform_device_add);

/**
363 364
 * platform_device_del - remove a platform-level device
 * @pdev: platform device we're removing
L
Linus Torvalds 已提交
365
 *
366 367 368
 * Note that this function will also release all memory- and port-based
 * resources owned by the device (@dev->resource).  This function must
 * _only_ be externally called in error cases.  All other usage is a bug.
L
Linus Torvalds 已提交
369
 */
370
void platform_device_del(struct platform_device *pdev)
L
Linus Torvalds 已提交
371 372 373 374
{
	int i;

	if (pdev) {
375 376
		device_del(&pdev->dev);

377 378 379 380 381
		if (pdev->id_auto) {
			ida_simple_remove(&platform_devid_ida, pdev->id);
			pdev->id = PLATFORM_DEVID_AUTO;
		}

L
Linus Torvalds 已提交
382 383
		for (i = 0; i < pdev->num_resources; i++) {
			struct resource *r = &pdev->resource[i];
384 385 386
			unsigned long type = resource_type(r);

			if (type == IORESOURCE_MEM || type == IORESOURCE_IO)
L
Linus Torvalds 已提交
387 388 389 390
				release_resource(r);
		}
	}
}
391 392 393
EXPORT_SYMBOL_GPL(platform_device_del);

/**
394 395
 * platform_device_register - add a platform-level device
 * @pdev: platform device we're adding
396
 */
397
int platform_device_register(struct platform_device *pdev)
398 399
{
	device_initialize(&pdev->dev);
400
	arch_setup_pdev_archdata(pdev);
401 402
	return platform_device_add(pdev);
}
403
EXPORT_SYMBOL_GPL(platform_device_register);
404 405

/**
406 407
 * platform_device_unregister - unregister a platform-level device
 * @pdev: platform device we're unregistering
408
 *
409 410 411
 * Unregistration is done in 2 steps. First we release all resources
 * and remove it from the subsystem, then we drop reference count by
 * calling platform_device_put().
412
 */
413
void platform_device_unregister(struct platform_device *pdev)
414 415 416 417
{
	platform_device_del(pdev);
	platform_device_put(pdev);
}
418
EXPORT_SYMBOL_GPL(platform_device_unregister);
L
Linus Torvalds 已提交
419 420

/**
421
 * platform_device_register_full - add a platform-level device with
422
 * resources and platform-specific data
423
 *
424
 * @pdevinfo: data used to create device
425
 *
426
 * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
427
 */
428
struct platform_device *platform_device_register_full(
429
		const struct platform_device_info *pdevinfo)
430
{
431
	int ret = -ENOMEM;
432 433
	struct platform_device *pdev;

434
	pdev = platform_device_alloc(pdevinfo->name, pdevinfo->id);
435
	if (!pdev)
436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454
		goto err_alloc;

	pdev->dev.parent = pdevinfo->parent;

	if (pdevinfo->dma_mask) {
		/*
		 * This memory isn't freed when the device is put,
		 * I don't have a nice idea for that though.  Conceptually
		 * dma_mask in struct device should not be a pointer.
		 * See http://thread.gmane.org/gmane.linux.kernel.pci/9081
		 */
		pdev->dev.dma_mask =
			kmalloc(sizeof(*pdev->dev.dma_mask), GFP_KERNEL);
		if (!pdev->dev.dma_mask)
			goto err;

		*pdev->dev.dma_mask = pdevinfo->dma_mask;
		pdev->dev.coherent_dma_mask = pdevinfo->dma_mask;
	}
455

456 457
	ret = platform_device_add_resources(pdev,
			pdevinfo->res, pdevinfo->num_res);
458 459
	if (ret)
		goto err;
460

461 462
	ret = platform_device_add_data(pdev,
			pdevinfo->data, pdevinfo->size_data);
463 464
	if (ret)
		goto err;
465

466 467 468
	ret = platform_device_add(pdev);
	if (ret) {
err:
469 470 471
		kfree(pdev->dev.dma_mask);

err_alloc:
472 473 474
		platform_device_put(pdev);
		return ERR_PTR(ret);
	}
475 476 477

	return pdev;
}
478
EXPORT_SYMBOL_GPL(platform_device_register_full);
479

R
Russell King 已提交
480 481 482 483 484 485 486 487
static int platform_drv_probe(struct device *_dev)
{
	struct platform_driver *drv = to_platform_driver(_dev->driver);
	struct platform_device *dev = to_platform_device(_dev);

	return drv->probe(dev);
}

488 489 490 491 492
static int platform_drv_probe_fail(struct device *_dev)
{
	return -ENXIO;
}

R
Russell King 已提交
493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509
static int platform_drv_remove(struct device *_dev)
{
	struct platform_driver *drv = to_platform_driver(_dev->driver);
	struct platform_device *dev = to_platform_device(_dev);

	return drv->remove(dev);
}

static void platform_drv_shutdown(struct device *_dev)
{
	struct platform_driver *drv = to_platform_driver(_dev->driver);
	struct platform_device *dev = to_platform_device(_dev);

	drv->shutdown(dev);
}

/**
510
 * platform_driver_register - register a driver for platform-level devices
511
 * @drv: platform driver structure
R
Russell King 已提交
512 513 514 515 516 517 518 519 520 521
 */
int platform_driver_register(struct platform_driver *drv)
{
	drv->driver.bus = &platform_bus_type;
	if (drv->probe)
		drv->driver.probe = platform_drv_probe;
	if (drv->remove)
		drv->driver.remove = platform_drv_remove;
	if (drv->shutdown)
		drv->driver.shutdown = platform_drv_shutdown;
522

R
Russell King 已提交
523 524 525 526 527
	return driver_register(&drv->driver);
}
EXPORT_SYMBOL_GPL(platform_driver_register);

/**
528
 * platform_driver_unregister - unregister a driver for platform-level devices
529
 * @drv: platform driver structure
R
Russell King 已提交
530 531 532 533 534 535 536
 */
void platform_driver_unregister(struct platform_driver *drv)
{
	driver_unregister(&drv->driver);
}
EXPORT_SYMBOL_GPL(platform_driver_unregister);

537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553
/**
 * platform_driver_probe - register driver for non-hotpluggable device
 * @drv: platform driver structure
 * @probe: the driver probe routine, probably from an __init section
 *
 * Use this instead of platform_driver_register() when you know the device
 * is not hotpluggable and has already been registered, and you want to
 * remove its run-once probe() infrastructure from memory after the driver
 * has bound to the device.
 *
 * One typical use for this would be with drivers for controllers integrated
 * into system-on-chip processors, where the controller devices have been
 * configured as part of board setup.
 *
 * Returns zero if the driver registered and bound to a device, else returns
 * a negative error code and with the driver not registered.
 */
554
int __init_or_module platform_driver_probe(struct platform_driver *drv,
555 556 557 558
		int (*probe)(struct platform_device *))
{
	int retval, code;

559 560 561
	/* make sure driver won't have bind/unbind attributes */
	drv->driver.suppress_bind_attrs = true;

562 563 564 565
	/* temporary section violation during probe() */
	drv->probe = probe;
	retval = code = platform_driver_register(drv);

566 567
	/*
	 * Fixup that section violation, being paranoid about code scanning
568 569 570 571
	 * the list of drivers in order to probe new devices.  Check to see
	 * if the probe was successful, and make sure any forced probes of
	 * new devices fail.
	 */
572
	spin_lock(&drv->driver.bus->p->klist_drivers.k_lock);
573
	drv->probe = NULL;
574
	if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
575 576
		retval = -ENODEV;
	drv->driver.probe = platform_drv_probe_fail;
577
	spin_unlock(&drv->driver.bus->p->klist_drivers.k_lock);
578 579 580 581 582 583

	if (code != retval)
		platform_driver_unregister(drv);
	return retval;
}
EXPORT_SYMBOL_GPL(platform_driver_probe);
L
Linus Torvalds 已提交
584

585 586 587 588 589 590 591 592 593 594 595
/**
 * platform_create_bundle - register driver and create corresponding device
 * @driver: platform driver structure
 * @probe: the driver probe routine, probably from an __init section
 * @res: set of resources that needs to be allocated for the device
 * @n_res: number of resources
 * @data: platform specific data for this platform device
 * @size: size of platform specific data
 *
 * Use this in legacy-style modules that probe hardware directly and
 * register a single platform device and corresponding platform driver.
596 597
 *
 * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613
 */
struct platform_device * __init_or_module platform_create_bundle(
			struct platform_driver *driver,
			int (*probe)(struct platform_device *),
			struct resource *res, unsigned int n_res,
			const void *data, size_t size)
{
	struct platform_device *pdev;
	int error;

	pdev = platform_device_alloc(driver->driver.name, -1);
	if (!pdev) {
		error = -ENOMEM;
		goto err_out;
	}

614 615 616
	error = platform_device_add_resources(pdev, res, n_res);
	if (error)
		goto err_pdev_put;
617

618 619 620
	error = platform_device_add_data(pdev, data, size);
	if (error)
		goto err_pdev_put;
621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640

	error = platform_device_add(pdev);
	if (error)
		goto err_pdev_put;

	error = platform_driver_probe(driver, probe);
	if (error)
		goto err_pdev_del;

	return pdev;

err_pdev_del:
	platform_device_del(pdev);
err_pdev_put:
	platform_device_put(pdev);
err_out:
	return ERR_PTR(error);
}
EXPORT_SYMBOL_GPL(platform_create_bundle);

641 642 643 644 645 646
/* modalias support enables more hands-off userspace setup:
 * (a) environment variable lets new-style hotplug events work once system is
 *     fully running:  "modprobe $MODALIAS"
 * (b) sysfs attribute lets new-style coldplug recover from hotplug events
 *     mishandled before system is fully running:  "modprobe $(cat modalias)"
 */
647 648
static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
			     char *buf)
649 650
{
	struct platform_device	*pdev = to_platform_device(dev);
651
	int len = snprintf(buf, PAGE_SIZE, "platform:%s\n", pdev->name);
652 653 654 655 656 657 658 659 660

	return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
}

static struct device_attribute platform_dev_attrs[] = {
	__ATTR_RO(modalias),
	__ATTR_NULL,
};

661
static int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
662 663
{
	struct platform_device	*pdev = to_platform_device(dev);
664 665 666
	int rc;

	/* Some devices have extra OF data and an OF-style MODALIAS */
667
	rc = of_device_uevent_modalias(dev,env);
668 669
	if (rc != -ENODEV)
		return rc;
670

671
	add_uevent_var(env, "MODALIAS=%s%s", PLATFORM_MODULE_PREFIX,
672
			pdev->name);
673 674 675
	return 0;
}

676
static const struct platform_device_id *platform_match_id(
677
			const struct platform_device_id *id,
678 679 680 681 682 683 684 685 686 687 688 689
			struct platform_device *pdev)
{
	while (id->name[0]) {
		if (strcmp(pdev->name, id->name) == 0) {
			pdev->id_entry = id;
			return id;
		}
		id++;
	}
	return NULL;
}

L
Linus Torvalds 已提交
690
/**
691 692 693
 * platform_match - bind platform device to platform driver.
 * @dev: device.
 * @drv: driver.
L
Linus Torvalds 已提交
694
 *
695 696 697 698 699 700 701
 * Platform device IDs are assumed to be encoded like this:
 * "<name><instance>", where <name> is a short description of the type of
 * device, like "pci" or "floppy", and <instance> is the enumerated
 * instance of the device, like '0' or '42'.  Driver IDs are simply
 * "<name>".  So, extract the <name> from the platform_device structure,
 * and compare it against the name of the driver. Return whether they match
 * or not.
L
Linus Torvalds 已提交
702
 */
703
static int platform_match(struct device *dev, struct device_driver *drv)
L
Linus Torvalds 已提交
704
{
705
	struct platform_device *pdev = to_platform_device(dev);
706 707
	struct platform_driver *pdrv = to_platform_driver(drv);

708 709 710 711 712
	/* Attempt an OF style match first */
	if (of_driver_match_device(dev, drv))
		return 1;

	/* Then try to match against the id table */
713 714
	if (pdrv->id_table)
		return platform_match_id(pdrv->id_table, pdev) != NULL;
L
Linus Torvalds 已提交
715

716
	/* fall-back to driver name match */
717
	return (strcmp(pdev->name, drv->name) == 0);
L
Linus Torvalds 已提交
718 719
}

720 721 722
#ifdef CONFIG_PM_SLEEP

static int platform_legacy_suspend(struct device *dev, pm_message_t mesg)
L
Linus Torvalds 已提交
723
{
724 725
	struct platform_driver *pdrv = to_platform_driver(dev->driver);
	struct platform_device *pdev = to_platform_device(dev);
L
Linus Torvalds 已提交
726 727
	int ret = 0;

728 729
	if (dev->driver && pdrv->suspend)
		ret = pdrv->suspend(pdev, mesg);
730 731 732 733

	return ret;
}

734
static int platform_legacy_resume(struct device *dev)
L
Linus Torvalds 已提交
735
{
736 737
	struct platform_driver *pdrv = to_platform_driver(dev->driver);
	struct platform_device *pdev = to_platform_device(dev);
L
Linus Torvalds 已提交
738 739
	int ret = 0;

740 741
	if (dev->driver && pdrv->resume)
		ret = pdrv->resume(pdev);
742

L
Linus Torvalds 已提交
743 744 745
	return ret;
}

746
#endif /* CONFIG_PM_SLEEP */
747

748 749
#ifdef CONFIG_SUSPEND

750
int platform_pm_suspend(struct device *dev)
751 752 753 754
{
	struct device_driver *drv = dev->driver;
	int ret = 0;

755 756 757 758
	if (!drv)
		return 0;

	if (drv->pm) {
759 760 761 762 763 764 765 766 767
		if (drv->pm->suspend)
			ret = drv->pm->suspend(dev);
	} else {
		ret = platform_legacy_suspend(dev, PMSG_SUSPEND);
	}

	return ret;
}

768
int platform_pm_resume(struct device *dev)
769 770 771 772
{
	struct device_driver *drv = dev->driver;
	int ret = 0;

773 774 775 776
	if (!drv)
		return 0;

	if (drv->pm) {
777 778 779 780 781 782 783 784 785
		if (drv->pm->resume)
			ret = drv->pm->resume(dev);
	} else {
		ret = platform_legacy_resume(dev);
	}

	return ret;
}

786
#endif /* CONFIG_SUSPEND */
787

788
#ifdef CONFIG_HIBERNATE_CALLBACKS
789

790
int platform_pm_freeze(struct device *dev)
791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807
{
	struct device_driver *drv = dev->driver;
	int ret = 0;

	if (!drv)
		return 0;

	if (drv->pm) {
		if (drv->pm->freeze)
			ret = drv->pm->freeze(dev);
	} else {
		ret = platform_legacy_suspend(dev, PMSG_FREEZE);
	}

	return ret;
}

808
int platform_pm_thaw(struct device *dev)
809 810 811 812
{
	struct device_driver *drv = dev->driver;
	int ret = 0;

813 814 815 816
	if (!drv)
		return 0;

	if (drv->pm) {
817 818 819 820 821 822 823 824 825
		if (drv->pm->thaw)
			ret = drv->pm->thaw(dev);
	} else {
		ret = platform_legacy_resume(dev);
	}

	return ret;
}

826
int platform_pm_poweroff(struct device *dev)
827 828 829 830
{
	struct device_driver *drv = dev->driver;
	int ret = 0;

831 832 833 834
	if (!drv)
		return 0;

	if (drv->pm) {
835 836 837 838 839 840 841 842 843
		if (drv->pm->poweroff)
			ret = drv->pm->poweroff(dev);
	} else {
		ret = platform_legacy_suspend(dev, PMSG_HIBERNATE);
	}

	return ret;
}

844
int platform_pm_restore(struct device *dev)
845 846 847 848
{
	struct device_driver *drv = dev->driver;
	int ret = 0;

849 850 851 852
	if (!drv)
		return 0;

	if (drv->pm) {
853 854 855 856 857 858 859 860 861
		if (drv->pm->restore)
			ret = drv->pm->restore(dev);
	} else {
		ret = platform_legacy_resume(dev);
	}

	return ret;
}

862
#endif /* CONFIG_HIBERNATE_CALLBACKS */
863

864
static const struct dev_pm_ops platform_dev_pm_ops = {
865 866 867
	.runtime_suspend = pm_generic_runtime_suspend,
	.runtime_resume = pm_generic_runtime_resume,
	.runtime_idle = pm_generic_runtime_idle,
868
	USE_PLATFORM_PM_SLEEP_OPS
869 870
};

L
Linus Torvalds 已提交
871 872
struct bus_type platform_bus_type = {
	.name		= "platform",
873
	.dev_attrs	= platform_dev_attrs,
L
Linus Torvalds 已提交
874
	.match		= platform_match,
875
	.uevent		= platform_uevent,
876
	.pm		= &platform_dev_pm_ops,
L
Linus Torvalds 已提交
877
};
878
EXPORT_SYMBOL_GPL(platform_bus_type);
L
Linus Torvalds 已提交
879 880 881

int __init platform_bus_init(void)
{
882 883
	int error;

M
Magnus Damm 已提交
884 885
	early_platform_cleanup();

886 887 888 889 890 891 892
	error = device_register(&platform_bus);
	if (error)
		return error;
	error =  bus_register(&platform_bus_type);
	if (error)
		device_unregister(&platform_bus);
	return error;
L
Linus Torvalds 已提交
893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911
}

#ifndef ARCH_HAS_DMA_GET_REQUIRED_MASK
u64 dma_get_required_mask(struct device *dev)
{
	u32 low_totalram = ((max_pfn - 1) << PAGE_SHIFT);
	u32 high_totalram = ((max_pfn - 1) >> (32 - PAGE_SHIFT));
	u64 mask;

	if (!high_totalram) {
		/* convert to mask just covering totalram */
		low_totalram = (1 << (fls(low_totalram) - 1));
		low_totalram += low_totalram - 1;
		mask = low_totalram;
	} else {
		high_totalram = (1 << (fls(high_totalram) - 1));
		high_totalram += high_totalram - 1;
		mask = (((u64)high_totalram) << 32) + 0xffffffff;
	}
912
	return mask;
L
Linus Torvalds 已提交
913 914 915
}
EXPORT_SYMBOL_GPL(dma_get_required_mask);
#endif
M
Magnus Damm 已提交
916 917 918 919 920

static __initdata LIST_HEAD(early_platform_driver_list);
static __initdata LIST_HEAD(early_platform_device_list);

/**
921
 * early_platform_driver_register - register early platform driver
922
 * @epdrv: early_platform driver structure
M
Magnus Damm 已提交
923
 * @buf: string passed from early_param()
924 925
 *
 * Helper function for early_platform_init() / early_platform_init_buffer()
M
Magnus Damm 已提交
926 927 928 929
 */
int __init early_platform_driver_register(struct early_platform_driver *epdrv,
					  char *buf)
{
930
	char *tmp;
M
Magnus Damm 已提交
931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948
	int n;

	/* Simply add the driver to the end of the global list.
	 * Drivers will by default be put on the list in compiled-in order.
	 */
	if (!epdrv->list.next) {
		INIT_LIST_HEAD(&epdrv->list);
		list_add_tail(&epdrv->list, &early_platform_driver_list);
	}

	/* If the user has specified device then make sure the driver
	 * gets prioritized. The driver of the last device specified on
	 * command line will be put first on the list.
	 */
	n = strlen(epdrv->pdrv->driver.name);
	if (buf && !strncmp(buf, epdrv->pdrv->driver.name, n)) {
		list_move(&epdrv->list, &early_platform_driver_list);

949 950
		/* Allow passing parameters after device name */
		if (buf[n] == '\0' || buf[n] == ',')
M
Magnus Damm 已提交
951
			epdrv->requested_id = -1;
952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
		else {
			epdrv->requested_id = simple_strtoul(&buf[n + 1],
							     &tmp, 10);

			if (buf[n] != '.' || (tmp == &buf[n + 1])) {
				epdrv->requested_id = EARLY_PLATFORM_ID_ERROR;
				n = 0;
			} else
				n += strcspn(&buf[n + 1], ",") + 1;
		}

		if (buf[n] == ',')
			n++;

		if (epdrv->bufsize) {
			memcpy(epdrv->buffer, &buf[n],
			       min_t(int, epdrv->bufsize, strlen(&buf[n]) + 1));
			epdrv->buffer[epdrv->bufsize - 1] = '\0';
		}
M
Magnus Damm 已提交
971 972 973 974 975 976
	}

	return 0;
}

/**
977
 * early_platform_add_devices - adds a number of early platform devices
M
Magnus Damm 已提交
978 979
 * @devs: array of early platform devices to add
 * @num: number of early platform devices in array
980 981 982
 *
 * Used by early architecture code to register early platform devices and
 * their platform data.
M
Magnus Damm 已提交
983 984 985 986 987 988 989 990 991 992 993
 */
void __init early_platform_add_devices(struct platform_device **devs, int num)
{
	struct device *dev;
	int i;

	/* simply add the devices to list */
	for (i = 0; i < num; i++) {
		dev = &devs[i]->dev;

		if (!dev->devres_head.next) {
994
			pm_runtime_early_init(dev);
M
Magnus Damm 已提交
995 996 997 998 999 1000 1001 1002
			INIT_LIST_HEAD(&dev->devres_head);
			list_add_tail(&dev->devres_head,
				      &early_platform_device_list);
		}
	}
}

/**
1003
 * early_platform_driver_register_all - register early platform drivers
M
Magnus Damm 已提交
1004
 * @class_str: string to identify early platform driver class
1005 1006 1007 1008
 *
 * Used by architecture code to register all early platform drivers
 * for a certain class. If omitted then only early platform drivers
 * with matching kernel command line class parameters will be registered.
M
Magnus Damm 已提交
1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
 */
void __init early_platform_driver_register_all(char *class_str)
{
	/* The "class_str" parameter may or may not be present on the kernel
	 * command line. If it is present then there may be more than one
	 * matching parameter.
	 *
	 * Since we register our early platform drivers using early_param()
	 * we need to make sure that they also get registered in the case
	 * when the parameter is missing from the kernel command line.
	 *
	 * We use parse_early_options() to make sure the early_param() gets
	 * called at least once. The early_param() may be called more than
	 * once since the name of the preferred device may be specified on
	 * the kernel command line. early_platform_driver_register() handles
	 * this case for us.
	 */
	parse_early_options(class_str);
}

/**
1030
 * early_platform_match - find early platform device matching driver
1031
 * @epdrv: early platform driver structure
M
Magnus Damm 已提交
1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047
 * @id: id to match against
 */
static  __init struct platform_device *
early_platform_match(struct early_platform_driver *epdrv, int id)
{
	struct platform_device *pd;

	list_for_each_entry(pd, &early_platform_device_list, dev.devres_head)
		if (platform_match(&pd->dev, &epdrv->pdrv->driver))
			if (pd->id == id)
				return pd;

	return NULL;
}

/**
1048
 * early_platform_left - check if early platform driver has matching devices
1049
 * @epdrv: early platform driver structure
M
Magnus Damm 已提交
1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
 * @id: return true if id or above exists
 */
static  __init int early_platform_left(struct early_platform_driver *epdrv,
				       int id)
{
	struct platform_device *pd;

	list_for_each_entry(pd, &early_platform_device_list, dev.devres_head)
		if (platform_match(&pd->dev, &epdrv->pdrv->driver))
			if (pd->id >= id)
				return 1;

	return 0;
}

/**
1066
 * early_platform_driver_probe_id - probe drivers matching class_str and id
M
Magnus Damm 已提交
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117
 * @class_str: string to identify early platform driver class
 * @id: id to match against
 * @nr_probe: number of platform devices to successfully probe before exiting
 */
static int __init early_platform_driver_probe_id(char *class_str,
						 int id,
						 int nr_probe)
{
	struct early_platform_driver *epdrv;
	struct platform_device *match;
	int match_id;
	int n = 0;
	int left = 0;

	list_for_each_entry(epdrv, &early_platform_driver_list, list) {
		/* only use drivers matching our class_str */
		if (strcmp(class_str, epdrv->class_str))
			continue;

		if (id == -2) {
			match_id = epdrv->requested_id;
			left = 1;

		} else {
			match_id = id;
			left += early_platform_left(epdrv, id);

			/* skip requested id */
			switch (epdrv->requested_id) {
			case EARLY_PLATFORM_ID_ERROR:
			case EARLY_PLATFORM_ID_UNSET:
				break;
			default:
				if (epdrv->requested_id == id)
					match_id = EARLY_PLATFORM_ID_UNSET;
			}
		}

		switch (match_id) {
		case EARLY_PLATFORM_ID_ERROR:
			pr_warning("%s: unable to parse %s parameter\n",
				   class_str, epdrv->pdrv->driver.name);
			/* fall-through */
		case EARLY_PLATFORM_ID_UNSET:
			match = NULL;
			break;
		default:
			match = early_platform_match(epdrv, match_id);
		}

		if (match) {
1118 1119 1120 1121 1122
			/*
			 * Set up a sensible init_name to enable
			 * dev_name() and others to be used before the
			 * rest of the driver core is initialized.
			 */
1123
			if (!match->dev.init_name && slab_is_available()) {
1124
				if (match->id != -1)
1125 1126 1127 1128
					match->dev.init_name =
						kasprintf(GFP_KERNEL, "%s.%d",
							  match->name,
							  match->id);
1129
				else
1130 1131 1132
					match->dev.init_name =
						kasprintf(GFP_KERNEL, "%s",
							  match->name);
1133 1134 1135 1136

				if (!match->dev.init_name)
					return -ENOMEM;
			}
1137

M
Magnus Damm 已提交
1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155
			if (epdrv->pdrv->probe(match))
				pr_warning("%s: unable to probe %s early.\n",
					   class_str, match->name);
			else
				n++;
		}

		if (n >= nr_probe)
			break;
	}

	if (left)
		return n;
	else
		return -ENODEV;
}

/**
1156
 * early_platform_driver_probe - probe a class of registered drivers
M
Magnus Damm 已提交
1157 1158 1159
 * @class_str: string to identify early platform driver class
 * @nr_probe: number of platform devices to successfully probe before exiting
 * @user_only: only probe user specified early platform devices
1160 1161 1162 1163
 *
 * Used by architecture code to probe registered early platform drivers
 * within a certain class. For probe to happen a registered early platform
 * device matching a registered early platform driver is needed.
M
Magnus Damm 已提交
1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201
 */
int __init early_platform_driver_probe(char *class_str,
				       int nr_probe,
				       int user_only)
{
	int k, n, i;

	n = 0;
	for (i = -2; n < nr_probe; i++) {
		k = early_platform_driver_probe_id(class_str, i, nr_probe - n);

		if (k < 0)
			break;

		n += k;

		if (user_only)
			break;
	}

	return n;
}

/**
 * early_platform_cleanup - clean up early platform code
 */
void __init early_platform_cleanup(void)
{
	struct platform_device *pd, *pd2;

	/* clean up the devres list used to chain devices */
	list_for_each_entry_safe(pd, pd2, &early_platform_device_list,
				 dev.devres_head) {
		list_del(&pd->dev.devres_head);
		memset(&pd->dev.devres_head, 0, sizeof(pd->dev.devres_head));
	}
}