diff options
| -rw-r--r-- | drivers/i2c/i2c-core.c | 13 | ||||
| -rw-r--r-- | include/linux/i2c.h | 1 | 
2 files changed, 8 insertions, 6 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index ba86af63f5c..97f96b66653 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -662,9 +662,9 @@ i2c_sysfs_new_device(struct device *dev, struct device_attribute *attr,  		return -EINVAL;  	/* Keep track of the added device */ -	i2c_lock_adapter(adap); +	mutex_lock(&adap->userspace_clients_lock);  	list_add_tail(&client->detected, &adap->userspace_clients); -	i2c_unlock_adapter(adap); +	mutex_unlock(&adap->userspace_clients_lock);  	dev_info(dev, "%s: Instantiated device %s at 0x%02hx\n", "new_device",  		 info.type, info.addr); @@ -703,7 +703,7 @@ i2c_sysfs_delete_device(struct device *dev, struct device_attribute *attr,  	/* Make sure the device was added through sysfs */  	res = -ENOENT; -	i2c_lock_adapter(adap); +	mutex_lock(&adap->userspace_clients_lock);  	list_for_each_entry_safe(client, next, &adap->userspace_clients,  				 detected) {  		if (client->addr == addr) { @@ -716,7 +716,7 @@ i2c_sysfs_delete_device(struct device *dev, struct device_attribute *attr,  			break;  		}  	} -	i2c_unlock_adapter(adap); +	mutex_unlock(&adap->userspace_clients_lock);  	if (res < 0)  		dev_err(dev, "%s: Can't find device in list\n", @@ -798,6 +798,7 @@ static int i2c_register_adapter(struct i2c_adapter *adap)  	}  	rt_mutex_init(&adap->bus_lock); +	mutex_init(&adap->userspace_clients_lock);  	INIT_LIST_HEAD(&adap->userspace_clients);  	/* Set default timeout to 1 second if not already set */ @@ -1003,7 +1004,7 @@ int i2c_del_adapter(struct i2c_adapter *adap)  		return res;  	/* Remove devices instantiated from sysfs */ -	i2c_lock_adapter(adap); +	mutex_lock(&adap->userspace_clients_lock);  	list_for_each_entry_safe(client, next, &adap->userspace_clients,  				 detected) {  		dev_dbg(&adap->dev, "Removing %s at 0x%x\n", client->name, @@ -1011,7 +1012,7 @@ int i2c_del_adapter(struct i2c_adapter *adap)  		list_del(&client->detected);  		i2c_unregister_device(client);  	} -	i2c_unlock_adapter(adap); +	mutex_unlock(&adap->userspace_clients_lock);  	/* Detach any active clients. This can't fail, thus we do not  	   checking the returned value. */ diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 5bf0f4beea3..798bad8741e 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -368,6 +368,7 @@ struct i2c_adapter {  	char name[48];  	struct completion dev_released; +	struct mutex userspace_clients_lock;  	struct list_head userspace_clients;  };  #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)  |