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: Jean Delvare <jdelvare@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5cbb00cc4a
commit
1bb6c08abf
@ -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 {
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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 {
|
|||||||
* 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 {
|
|||||||
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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user