Driver core: reduce duplicated code for platform_device creation
This makes the two similar functions platform_device_register_simple and platform_device_register_data one line inline functions using a new generic function platform_device_register_resndata. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
3e61dfd850
commit
44f28bdea0
3 changed files with 85 additions and 82 deletions
|
@ -111,6 +111,7 @@ X!Edrivers/base/attribute_container.c
|
|||
<!--
|
||||
X!Edrivers/base/interface.c
|
||||
-->
|
||||
!Iinclude/linux/platform_device.h
|
||||
!Edrivers/base/platform.c
|
||||
!Edrivers/base/bus.c
|
||||
</sect1>
|
||||
|
|
|
@ -344,108 +344,56 @@ void platform_device_unregister(struct platform_device *pdev)
|
|||
EXPORT_SYMBOL_GPL(platform_device_unregister);
|
||||
|
||||
/**
|
||||
* platform_device_register_simple - add a platform-level device and its resources
|
||||
* platform_device_register_resndata - add a platform-level device with
|
||||
* resources and platform-specific data
|
||||
*
|
||||
* @parent: parent device for the device we're adding
|
||||
* @name: base name of the device we're adding
|
||||
* @id: instance id
|
||||
* @res: set of resources that needs to be allocated for the device
|
||||
* @num: number of resources
|
||||
*
|
||||
* This function creates a simple platform device that requires minimal
|
||||
* resource and memory management. Canned release function freeing memory
|
||||
* allocated for the device allows drivers using such devices to be
|
||||
* unloaded without waiting for the last reference to the device to be
|
||||
* dropped.
|
||||
*
|
||||
* This interface is primarily intended for use with legacy drivers which
|
||||
* probe hardware directly. Because such drivers create sysfs device nodes
|
||||
* themselves, rather than letting system infrastructure handle such device
|
||||
* enumeration tasks, they don't fully conform to the Linux driver model.
|
||||
* In particular, when such drivers are built as modules, they can't be
|
||||
* "hotplugged".
|
||||
*
|
||||
* Returns &struct platform_device pointer on success, or ERR_PTR() on error.
|
||||
*/
|
||||
struct platform_device *platform_device_register_simple(const char *name,
|
||||
int id,
|
||||
const struct resource *res,
|
||||
unsigned int num)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
int retval;
|
||||
|
||||
pdev = platform_device_alloc(name, id);
|
||||
if (!pdev) {
|
||||
retval = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (num) {
|
||||
retval = platform_device_add_resources(pdev, res, num);
|
||||
if (retval)
|
||||
goto error;
|
||||
}
|
||||
|
||||
retval = platform_device_add(pdev);
|
||||
if (retval)
|
||||
goto error;
|
||||
|
||||
return pdev;
|
||||
|
||||
error:
|
||||
platform_device_put(pdev);
|
||||
return ERR_PTR(retval);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(platform_device_register_simple);
|
||||
|
||||
/**
|
||||
* platform_device_register_data - add a platform-level device with platform-specific data
|
||||
* @parent: parent device for the device we're adding
|
||||
* @name: base name of the device we're adding
|
||||
* @id: instance id
|
||||
* @data: platform specific data for this platform device
|
||||
* @size: size of platform specific data
|
||||
*
|
||||
* This function creates a simple platform device that requires minimal
|
||||
* resource and memory management. Canned release function freeing memory
|
||||
* allocated for the device allows drivers using such devices to be
|
||||
* unloaded without waiting for the last reference to the device to be
|
||||
* dropped.
|
||||
*
|
||||
* Returns &struct platform_device pointer on success, or ERR_PTR() on error.
|
||||
*/
|
||||
struct platform_device *platform_device_register_data(
|
||||
struct platform_device *platform_device_register_resndata(
|
||||
struct device *parent,
|
||||
const char *name, int id,
|
||||
const struct resource *res, unsigned int num,
|
||||
const void *data, size_t size)
|
||||
{
|
||||
int ret = -ENOMEM;
|
||||
struct platform_device *pdev;
|
||||
int retval;
|
||||
|
||||
pdev = platform_device_alloc(name, id);
|
||||
if (!pdev) {
|
||||
retval = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
if (!pdev)
|
||||
goto err;
|
||||
|
||||
pdev->dev.parent = parent;
|
||||
|
||||
if (size) {
|
||||
retval = platform_device_add_data(pdev, data, size);
|
||||
if (retval)
|
||||
goto error;
|
||||
if (res) {
|
||||
ret = platform_device_add_resources(pdev, res, num);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
retval = platform_device_add(pdev);
|
||||
if (retval)
|
||||
goto error;
|
||||
if (data) {
|
||||
ret = platform_device_add_data(pdev, data, size);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = platform_device_add(pdev);
|
||||
if (ret) {
|
||||
err:
|
||||
platform_device_put(pdev);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
return pdev;
|
||||
|
||||
error:
|
||||
platform_device_put(pdev);
|
||||
return ERR_PTR(retval);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(platform_device_register_data);
|
||||
EXPORT_SYMBOL_GPL(platform_device_register_resndata);
|
||||
|
||||
static int platform_drv_probe(struct device *_dev)
|
||||
{
|
||||
|
|
|
@ -43,10 +43,64 @@ extern struct resource *platform_get_resource_byname(struct platform_device *, u
|
|||
extern int platform_get_irq_byname(struct platform_device *, const char *);
|
||||
extern int platform_add_devices(struct platform_device **, int);
|
||||
|
||||
extern struct platform_device *platform_device_register_simple(const char *, int id,
|
||||
const struct resource *, unsigned int);
|
||||
extern struct platform_device *platform_device_register_data(struct device *,
|
||||
const char *, int, const void *, size_t);
|
||||
extern struct platform_device *platform_device_register_resndata(
|
||||
struct device *parent, const char *name, int id,
|
||||
const struct resource *res, unsigned int num,
|
||||
const void *data, size_t size);
|
||||
|
||||
/**
|
||||
* platform_device_register_simple - add a platform-level device and its resources
|
||||
* @name: base name of the device we're adding
|
||||
* @id: instance id
|
||||
* @res: set of resources that needs to be allocated for the device
|
||||
* @num: number of resources
|
||||
*
|
||||
* This function creates a simple platform device that requires minimal
|
||||
* resource and memory management. Canned release function freeing memory
|
||||
* allocated for the device allows drivers using such devices to be
|
||||
* unloaded without waiting for the last reference to the device to be
|
||||
* dropped.
|
||||
*
|
||||
* This interface is primarily intended for use with legacy drivers which
|
||||
* probe hardware directly. Because such drivers create sysfs device nodes
|
||||
* themselves, rather than letting system infrastructure handle such device
|
||||
* enumeration tasks, they don't fully conform to the Linux driver model.
|
||||
* In particular, when such drivers are built as modules, they can't be
|
||||
* "hotplugged".
|
||||
*
|
||||
* Returns &struct platform_device pointer on success, or ERR_PTR() on error.
|
||||
*/
|
||||
static inline struct platform_device *platform_device_register_simple(
|
||||
const char *name, int id,
|
||||
const struct resource *res, unsigned int num)
|
||||
{
|
||||
return platform_device_register_resndata(NULL, name, id,
|
||||
res, num, NULL, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* platform_device_register_data - add a platform-level device with platform-specific data
|
||||
* @parent: parent device for the device we're adding
|
||||
* @name: base name of the device we're adding
|
||||
* @id: instance id
|
||||
* @data: platform specific data for this platform device
|
||||
* @size: size of platform specific data
|
||||
*
|
||||
* This function creates a simple platform device that requires minimal
|
||||
* resource and memory management. Canned release function freeing memory
|
||||
* allocated for the device allows drivers using such devices to be
|
||||
* unloaded without waiting for the last reference to the device to be
|
||||
* dropped.
|
||||
*
|
||||
* Returns &struct platform_device pointer on success, or ERR_PTR() on error.
|
||||
*/
|
||||
static inline struct platform_device *platform_device_register_data(
|
||||
struct device *parent, const char *name, int id,
|
||||
const void *data, size_t size)
|
||||
{
|
||||
return platform_device_register_resndata(parent, name, id,
|
||||
NULL, 0, data, size);
|
||||
}
|
||||
|
||||
extern struct platform_device *platform_device_alloc(const char *name, int id);
|
||||
extern int platform_device_add_resources(struct platform_device *pdev,
|
||||
|
|
Loading…
Reference in a new issue