aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/platform.c47
1 files changed, 47 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}
392EXPORT_SYMBOL_GPL(platform_device_register_simple); 392EXPORT_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 */
408struct 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
436error:
437 platform_device_put(pdev);
438 return ERR_PTR(retval);
439}
440
394static int platform_drv_probe(struct device *_dev) 441static 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);