diff options
-rw-r--r-- | drivers/base/platform.c | 47 | ||||
-rw-r--r-- | include/linux/platform_device.h | 2 |
2 files changed, 49 insertions, 0 deletions
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index e621dade7eaa..9e60f7c739c6 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
@@ -391,6 +391,53 @@ error: | |||
391 | } | 391 | } |
392 | EXPORT_SYMBOL_GPL(platform_device_register_simple); | 392 | EXPORT_SYMBOL_GPL(platform_device_register_simple); |
393 | 393 | ||
394 | /** | ||
395 | * platform_device_register_data | ||
396 | * @parent: parent device for the device we're adding | ||
397 | * @name: base name of the device we're adding | ||
398 | * @id: instance id | ||
399 | * @data: platform specific data for this platform device | ||
400 | * @size: size of platform specific data | ||
401 | * | ||
402 | * This function creates a simple platform device that requires minimal | ||
403 | * resource and memory management. Canned release function freeing memory | ||
404 | * allocated for the device allows drivers using such devices to be | ||
405 | * unloaded without waiting for the last reference to the device to be | ||
406 | * dropped. | ||
407 | */ | ||
408 | struct platform_device *platform_device_register_data( | ||
409 | struct device *parent, | ||
410 | const char *name, int id, | ||
411 | const void *data, size_t size) | ||
412 | { | ||
413 | struct platform_device *pdev; | ||
414 | int retval; | ||
415 | |||
416 | pdev = platform_device_alloc(name, id); | ||
417 | if (!pdev) { | ||
418 | retval = -ENOMEM; | ||
419 | goto error; | ||
420 | } | ||
421 | |||
422 | pdev->dev.parent = parent; | ||
423 | |||
424 | if (size) { | ||
425 | retval = platform_device_add_data(pdev, data, size); | ||
426 | if (retval) | ||
427 | goto error; | ||
428 | } | ||
429 | |||
430 | retval = platform_device_add(pdev); | ||
431 | if (retval) | ||
432 | goto error; | ||
433 | |||
434 | return pdev; | ||
435 | |||
436 | error: | ||
437 | platform_device_put(pdev); | ||
438 | return ERR_PTR(retval); | ||
439 | } | ||
440 | |||
394 | static int platform_drv_probe(struct device *_dev) | 441 | static int platform_drv_probe(struct device *_dev) |
395 | { | 442 | { |
396 | struct platform_driver *drv = to_platform_driver(_dev->driver); | 443 | struct platform_driver *drv = to_platform_driver(_dev->driver); |
diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 95ac21ab3a09..4b8cc6a32479 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h | |||
@@ -37,6 +37,8 @@ extern int platform_add_devices(struct platform_device **, int); | |||
37 | 37 | ||
38 | extern struct platform_device *platform_device_register_simple(const char *, int id, | 38 | extern struct platform_device *platform_device_register_simple(const char *, int id, |
39 | struct resource *, unsigned int); | 39 | struct resource *, unsigned int); |
40 | extern struct platform_device *platform_device_register_data(struct device *, | ||
41 | const char *, int, const void *, size_t); | ||
40 | 42 | ||
41 | extern struct platform_device *platform_device_alloc(const char *name, int id); | 43 | extern struct platform_device *platform_device_alloc(const char *name, int id); |
42 | extern int platform_device_add_resources(struct platform_device *pdev, struct resource *res, unsigned int num); | 44 | extern int platform_device_add_resources(struct platform_device *pdev, struct resource *res, unsigned int num); |