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
					
				
			
		
					 3 changed files with 6 additions and 13 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue