Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

platform: add new device registration helper

Add a helper that registers simple platform_device w/o resources but with
parent and device data.

This is usefull to cleanup platform code from code that registers such
simple devices as leds-gpio, generic-bl, etc.

Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
Cc: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Dmitry Baryshkov and committed by
Greg Kroah-Hartman
d8bf2540 45c076c5

+49
+47
drivers/base/platform.c
··· 391 391 } 392 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 441 static int platform_drv_probe(struct device *_dev) 395 442 { 396 443 struct platform_driver *drv = to_platform_driver(_dev->driver);
+2
include/linux/platform_device.h
··· 37 37 38 38 extern struct platform_device *platform_device_register_simple(const char *, int id, 39 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 43 extern struct platform_device *platform_device_alloc(const char *name, int id); 42 44 extern int platform_device_add_resources(struct platform_device *pdev, struct resource *res, unsigned int num);