drivercore: Add of_match_table to the common device drivers
OF-style matching can be available to any device, on any type of bus. This patch allows any driver to provide an OF match table when CONFIG_OF is enabled so that drivers can be bound against devices described in the device tree. Signed-off-by: Grant Likely <grant.likely@secretlab.ca> Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
		
					parent
					
						
							
								173b3a7a05
							
						
					
				
			
			
				commit
				
					
						597b9d1e44
					
				
			
		
					 4 changed files with 14 additions and 7 deletions
				
			
		| 
						 | 
					@ -201,8 +201,11 @@ static int ibmebus_create_devices(const struct of_device_id *matches)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ibmebus_register_driver(struct of_platform_driver *drv)
 | 
					int ibmebus_register_driver(struct of_platform_driver *drv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						if (!drv->driver.of_match_table)
 | 
				
			||||||
 | 
							drv->driver.of_match_table = drv->match_table;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* If the driver uses devices that ibmebus doesn't know, add them */
 | 
						/* If the driver uses devices that ibmebus doesn't know, add them */
 | 
				
			||||||
	ibmebus_create_devices(drv->match_table);
 | 
						ibmebus_create_devices(drv->driver.of_match_table);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return of_register_driver(drv, &ibmebus_bus_type);
 | 
						return of_register_driver(drv, &ibmebus_bus_type);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,8 +40,7 @@ static struct macio_chip      *macio_on_hold;
 | 
				
			||||||
static int macio_bus_match(struct device *dev, struct device_driver *drv) 
 | 
					static int macio_bus_match(struct device *dev, struct device_driver *drv) 
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct macio_dev * macio_dev = to_macio_device(dev);
 | 
						struct macio_dev * macio_dev = to_macio_device(dev);
 | 
				
			||||||
	struct macio_driver * macio_drv = to_macio_driver(drv);
 | 
						const struct of_device_id * matches = drv->of_match_table;
 | 
				
			||||||
	const struct of_device_id * matches = macio_drv->match_table;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!matches) 
 | 
						if (!matches) 
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
| 
						 | 
					@ -84,7 +83,7 @@ static int macio_device_probe(struct device *dev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	macio_dev_get(macio_dev);
 | 
						macio_dev_get(macio_dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	match = of_match_device(drv->match_table, &macio_dev->ofdev);
 | 
						match = of_match_device(drv->driver.of_match_table, &macio_dev->ofdev);
 | 
				
			||||||
	if (match)
 | 
						if (match)
 | 
				
			||||||
		error = drv->probe(macio_dev, match);
 | 
							error = drv->probe(macio_dev, match);
 | 
				
			||||||
	if (error)
 | 
						if (error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,8 +22,7 @@ extern struct device_attribute of_platform_device_attrs[];
 | 
				
			||||||
static int of_platform_bus_match(struct device *dev, struct device_driver *drv)
 | 
					static int of_platform_bus_match(struct device *dev, struct device_driver *drv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct of_device *of_dev = to_of_device(dev);
 | 
						struct of_device *of_dev = to_of_device(dev);
 | 
				
			||||||
	struct of_platform_driver *of_drv = to_of_platform_driver(drv);
 | 
						const struct of_device_id *matches = drv->of_match_table;
 | 
				
			||||||
	const struct of_device_id *matches = of_drv->match_table;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!matches)
 | 
						if (!matches)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
| 
						 | 
					@ -46,7 +45,7 @@ static int of_platform_device_probe(struct device *dev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	of_dev_get(of_dev);
 | 
						of_dev_get(of_dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	match = of_match_device(drv->match_table, of_dev);
 | 
						match = of_match_device(drv->driver.of_match_table, of_dev);
 | 
				
			||||||
	if (match)
 | 
						if (match)
 | 
				
			||||||
		error = drv->probe(of_dev, match);
 | 
							error = drv->probe(of_dev, match);
 | 
				
			||||||
	if (error)
 | 
						if (error)
 | 
				
			||||||
| 
						 | 
					@ -391,6 +390,8 @@ int of_register_driver(struct of_platform_driver *drv, struct bus_type *bus)
 | 
				
			||||||
		drv->driver.name = drv->name;
 | 
							drv->driver.name = drv->name;
 | 
				
			||||||
	if (!drv->driver.owner)
 | 
						if (!drv->driver.owner)
 | 
				
			||||||
		drv->driver.owner = drv->owner;
 | 
							drv->driver.owner = drv->owner;
 | 
				
			||||||
 | 
						if (!drv->driver.of_match_table)
 | 
				
			||||||
 | 
							drv->driver.of_match_table = drv->match_table;
 | 
				
			||||||
	drv->driver.bus = bus;
 | 
						drv->driver.bus = bus;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* register with core */
 | 
						/* register with core */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -129,6 +129,10 @@ struct device_driver {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool suppress_bind_attrs;	/* disables bind/unbind via sysfs */
 | 
						bool suppress_bind_attrs;	/* disables bind/unbind via sysfs */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(CONFIG_OF)
 | 
				
			||||||
 | 
						const struct of_device_id	*of_match_table;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int (*probe) (struct device *dev);
 | 
						int (*probe) (struct device *dev);
 | 
				
			||||||
	int (*remove) (struct device *dev);
 | 
						int (*remove) (struct device *dev);
 | 
				
			||||||
	void (*shutdown) (struct device *dev);
 | 
						void (*shutdown) (struct device *dev);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue