diff options
Diffstat (limited to 'drivers/i2c/i2c-core.c')
| -rw-r--r-- | drivers/i2c/i2c-core.c | 16 | 
1 files changed, 12 insertions, 4 deletions
| diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 1cca2631e5b..df937df845e 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -30,6 +30,8 @@  #include <linux/init.h>  #include <linux/idr.h>  #include <linux/mutex.h> +#include <linux/of_i2c.h> +#include <linux/of_device.h>  #include <linux/completion.h>  #include <linux/hardirq.h>  #include <linux/irqflags.h> @@ -70,6 +72,10 @@ static int i2c_device_match(struct device *dev, struct device_driver *drv)  	if (!client)  		return 0; +	/* Attempt an OF style match */ +	if (of_driver_match_device(dev, drv)) +		return 1; +  	driver = to_i2c_driver(drv);  	/* match on an id table if there is one */  	if (driver->id_table) @@ -790,6 +796,9 @@ static int i2c_register_adapter(struct i2c_adapter *adap)  	if (adap->nr < __i2c_first_dynamic_bus_num)  		i2c_scan_static_board_info(adap); +	/* Register devices from the device tree */ +	of_i2c_register_devices(adap); +  	/* Notify drivers */  	mutex_lock(&core_lock);  	dummy = bus_for_each_drv(&i2c_bus_type, NULL, adap, @@ -1428,13 +1437,12 @@ static int i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver)  	if (!(adapter->class & driver->class))  		goto exit_free; -	/* Stop here if we can't use SMBUS_QUICK */ -	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) { +	/* Stop here if the bus doesn't support probing */ +	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE)) {  		if (address_list[0] == I2C_CLIENT_END)  			goto exit_free; -		dev_warn(&adapter->dev, "SMBus Quick command not supported, " -			 "can't probe for chips\n"); +		dev_warn(&adapter->dev, "Probing not supported\n");  		err = -EOPNOTSUPP;  		goto exit_free;  	} | 
