diff options
Diffstat (limited to 'drivers/i2c/i2c-core.c')
| -rw-r--r-- | drivers/i2c/i2c-core.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 8d80fceca6a4..296504355142 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -762,6 +762,7 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
| 762 | { | 762 | { |
| 763 | int res = 0; | 763 | int res = 0; |
| 764 | struct i2c_adapter *found; | 764 | struct i2c_adapter *found; |
| 765 | struct i2c_client *client, *next; | ||
| 765 | 766 | ||
| 766 | /* First make sure that this adapter was ever added */ | 767 | /* First make sure that this adapter was ever added */ |
| 767 | mutex_lock(&core_lock); | 768 | mutex_lock(&core_lock); |
| @@ -781,6 +782,16 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
| 781 | if (res) | 782 | if (res) |
| 782 | return res; | 783 | return res; |
| 783 | 784 | ||
| 785 | /* Remove devices instantiated from sysfs */ | ||
| 786 | list_for_each_entry_safe(client, next, &userspace_devices, detected) { | ||
| 787 | if (client->adapter == adap) { | ||
| 788 | dev_dbg(&adap->dev, "Removing %s at 0x%x\n", | ||
| 789 | client->name, client->addr); | ||
| 790 | list_del(&client->detected); | ||
| 791 | i2c_unregister_device(client); | ||
| 792 | } | ||
| 793 | } | ||
| 794 | |||
| 784 | /* Detach any active clients. This can't fail, thus we do not | 795 | /* Detach any active clients. This can't fail, thus we do not |
| 785 | checking the returned value. */ | 796 | checking the returned value. */ |
| 786 | res = device_for_each_child(&adap->dev, NULL, __unregister_client); | 797 | res = device_for_each_child(&adap->dev, NULL, __unregister_client); |
