Driver core: reduce duplicated code for platform_device creation
Uwe Kleine-König [Mon, 21 Jun 2010 14:11:44 +0000 (16:11 +0200)]
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>

Documentation/DocBook/device-drivers.tmpl
drivers/base/platform.c
include/linux/platform_device.h

index 1b2dd4f..ecd35e9 100644 (file)
@@ -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>
index 26eb69d..ffcfd73 100644 (file)
@@ -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
- * @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.
+ * platform_device_register_resndata - add a platform-level device with
+ * resources and platform-specific data
  *
- * 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
+ * @res: set of resources that needs to be allocated for the device
+ * @num: number of resources
  * @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;
+       }
 
-       return pdev;
+       ret = platform_device_add(pdev);
+       if (ret) {
+err:
+               platform_device_put(pdev);
+               return ERR_PTR(ret);
+       }
 
-error:
-       platform_device_put(pdev);
-       return ERR_PTR(retval);
+       return pdev;
 }
-EXPORT_SYMBOL_GPL(platform_device_register_data);
+EXPORT_SYMBOL_GPL(platform_device_register_resndata);
 
 static int platform_drv_probe(struct device *_dev)
 {
index 5417944..d7ecad0 100644 (file)
@@ -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,