driver core: Move driver_data back to struct device
authorJean Delvare <jdelvare@suse.de>
Mon, 14 Apr 2014 10:54:47 +0000 (12:54 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 27 May 2014 19:37:18 +0000 (12:37 -0700)
Having to allocate memory as part of dev_set_drvdata() is a problem
because that memory may never get freed if the device itself is not
created. So move driver_data back to struct device.

This is a partial revert of commit b4028437.

Signed-off-by: Jean Delvare <jdelvare@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/base/base.h
drivers/base/dd.c
include/linux/device.h

index 24f424249d9b517089b82c2436042751eec3aa42..251c5d30f963060d3fec65b61205ae0225f141a5 100644 (file)
@@ -63,8 +63,6 @@ struct driver_private {
  *     binding of drivers which were unable to get all the resources needed by
  *     the device; typically because it depends on another driver getting
  *     probed first.
- * @driver_data - private pointer for driver specific info.  Will turn into a
- * list soon.
  * @device - pointer back to the struct class that this structure is
  * associated with.
  *
@@ -76,7 +74,6 @@ struct device_private {
        struct klist_node knode_driver;
        struct klist_node knode_bus;
        struct list_head deferred_probe;
-       void *driver_data;
        struct device *device;
 };
 #define to_device_private_parent(obj)  \
index 62ec61e8f84ac90d7c4e433ccc4ead67ff96fbd3..d14b6e89589661f1f6ce638377b96bb968241438 100644 (file)
@@ -594,22 +594,15 @@ void driver_detach(struct device_driver *drv)
  */
 void *dev_get_drvdata(const struct device *dev)
 {
-       if (dev && dev->p)
-               return dev->p->driver_data;
+       if (dev)
+               return dev->driver_data;
        return NULL;
 }
 EXPORT_SYMBOL(dev_get_drvdata);
 
 int dev_set_drvdata(struct device *dev, void *data)
 {
-       int error;
-
-       if (!dev->p) {
-               error = device_private_init(dev);
-               if (error)
-                       return error;
-       }
-       dev->p->driver_data = data;
+       dev->driver_data = data;
        return 0;
 }
 EXPORT_SYMBOL(dev_set_drvdata);
index d1d1c055b48e2efa8bbdc692b185eaa16f9619cf..5c94ac3e7972f9acad86fe97da0ba7d6b34fdf67 100644 (file)
@@ -673,6 +673,7 @@ struct acpi_dev_node {
  *             variants, which GPIO pins act in what additional roles, and so
  *             on.  This shrinks the "Board Support Packages" (BSPs) and
  *             minimizes board-specific #ifdefs in drivers.
+ * @driver_data: Private pointer for driver specific info.
  * @power:     For device power management.
  *             See Documentation/power/devices.txt for details.
  * @pm_domain: Provide callbacks that are executed during system suspend,
@@ -734,6 +735,8 @@ struct device {
                                           device */
        void            *platform_data; /* Platform specific data, device
                                           core doesn't touch it */
+       void            *driver_data;   /* Driver data, set and get with
+                                          dev_set/get_drvdata */
        struct dev_pm_info      power;
        struct dev_pm_domain    *pm_domain;