Commit 1bb6c08a authored by Jean Delvare's avatar Jean Delvare Committed by Greg Kroah-Hartman

driver core: Move driver_data back to struct device

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: default avatarJean Delvare <jdelvare@suse.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5cbb00cc
...@@ -63,8 +63,6 @@ struct driver_private { ...@@ -63,8 +63,6 @@ struct driver_private {
* binding of drivers which were unable to get all the resources needed by * binding of drivers which were unable to get all the resources needed by
* the device; typically because it depends on another driver getting * the device; typically because it depends on another driver getting
* probed first. * 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 * @device - pointer back to the struct class that this structure is
* associated with. * associated with.
* *
...@@ -76,7 +74,6 @@ struct device_private { ...@@ -76,7 +74,6 @@ struct device_private {
struct klist_node knode_driver; struct klist_node knode_driver;
struct klist_node knode_bus; struct klist_node knode_bus;
struct list_head deferred_probe; struct list_head deferred_probe;
void *driver_data;
struct device *device; struct device *device;
}; };
#define to_device_private_parent(obj) \ #define to_device_private_parent(obj) \
......
...@@ -594,22 +594,15 @@ void driver_detach(struct device_driver *drv) ...@@ -594,22 +594,15 @@ void driver_detach(struct device_driver *drv)
*/ */
void *dev_get_drvdata(const struct device *dev) void *dev_get_drvdata(const struct device *dev)
{ {
if (dev && dev->p) if (dev)
return dev->p->driver_data; return dev->driver_data;
return NULL; return NULL;
} }
EXPORT_SYMBOL(dev_get_drvdata); EXPORT_SYMBOL(dev_get_drvdata);
int dev_set_drvdata(struct device *dev, void *data) int dev_set_drvdata(struct device *dev, void *data)
{ {
int error; dev->driver_data = data;
if (!dev->p) {
error = device_private_init(dev);
if (error)
return error;
}
dev->p->driver_data = data;
return 0; return 0;
} }
EXPORT_SYMBOL(dev_set_drvdata); EXPORT_SYMBOL(dev_set_drvdata);
...@@ -673,6 +673,7 @@ struct acpi_dev_node { ...@@ -673,6 +673,7 @@ struct acpi_dev_node {
* variants, which GPIO pins act in what additional roles, and so * variants, which GPIO pins act in what additional roles, and so
* on. This shrinks the "Board Support Packages" (BSPs) and * on. This shrinks the "Board Support Packages" (BSPs) and
* minimizes board-specific #ifdefs in drivers. * minimizes board-specific #ifdefs in drivers.
* @driver_data: Private pointer for driver specific info.
* @power: For device power management. * @power: For device power management.
* See Documentation/power/devices.txt for details. * See Documentation/power/devices.txt for details.
* @pm_domain: Provide callbacks that are executed during system suspend, * @pm_domain: Provide callbacks that are executed during system suspend,
...@@ -734,6 +735,8 @@ struct device { ...@@ -734,6 +735,8 @@ struct device {
device */ device */
void *platform_data; /* Platform specific data, device void *platform_data; /* Platform specific data, device
core doesn't touch it */ 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_info power;
struct dev_pm_domain *pm_domain; struct dev_pm_domain *pm_domain;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment