@@ -1300,28 +1300,21 @@ new_device_store(struct device *dev, struct device_attribute *attr,
1300
1300
info .flags |= I2C_CLIENT_SLAVE ;
1301
1301
}
1302
1302
1303
- info .flags |= I2C_CLIENT_USER ;
1304
-
1305
1303
client = i2c_new_client_device (adap , & info );
1306
1304
if (IS_ERR (client ))
1307
1305
return PTR_ERR (client );
1308
1306
1307
+ /* Keep track of the added device */
1308
+ mutex_lock (& adap -> userspace_clients_lock );
1309
+ list_add_tail (& client -> detected , & adap -> userspace_clients );
1310
+ mutex_unlock (& adap -> userspace_clients_lock );
1309
1311
dev_info (dev , "%s: Instantiated device %s at 0x%02hx\n" , "new_device" ,
1310
1312
info .type , info .addr );
1311
1313
1312
1314
return count ;
1313
1315
}
1314
1316
static DEVICE_ATTR_WO (new_device );
1315
1317
1316
- static int __i2c_find_user_addr (struct device * dev , const void * addrp )
1317
- {
1318
- struct i2c_client * client = i2c_verify_client (dev );
1319
- unsigned short addr = * (unsigned short * )addrp ;
1320
-
1321
- return client && client -> flags & I2C_CLIENT_USER &&
1322
- i2c_encode_flags_to_addr (client ) == addr ;
1323
- }
1324
-
1325
1318
/*
1326
1319
* And of course let the users delete the devices they instantiated, if
1327
1320
* they got it wrong. This interface can only be used to delete devices
@@ -1336,7 +1329,7 @@ delete_device_store(struct device *dev, struct device_attribute *attr,
1336
1329
const char * buf , size_t count )
1337
1330
{
1338
1331
struct i2c_adapter * adap = to_i2c_adapter (dev );
1339
- struct device * child_dev ;
1332
+ struct i2c_client * client , * next ;
1340
1333
unsigned short addr ;
1341
1334
char end ;
1342
1335
int res ;
@@ -1352,19 +1345,28 @@ delete_device_store(struct device *dev, struct device_attribute *attr,
1352
1345
return - EINVAL ;
1353
1346
}
1354
1347
1355
- mutex_lock (& core_lock );
1356
1348
/* Make sure the device was added through sysfs */
1357
- child_dev = device_find_child (& adap -> dev , & addr , __i2c_find_user_addr );
1358
- if (child_dev ) {
1359
- i2c_unregister_device (i2c_verify_client (child_dev ));
1360
- put_device (child_dev );
1361
- } else {
1362
- dev_err (dev , "Can't find userspace-created device at %#x\n" , addr );
1363
- count = - ENOENT ;
1349
+ res = - ENOENT ;
1350
+ mutex_lock_nested (& adap -> userspace_clients_lock ,
1351
+ i2c_adapter_depth (adap ));
1352
+ list_for_each_entry_safe (client , next , & adap -> userspace_clients ,
1353
+ detected ) {
1354
+ if (i2c_encode_flags_to_addr (client ) == addr ) {
1355
+ dev_info (dev , "%s: Deleting device %s at 0x%02hx\n" ,
1356
+ "delete_device" , client -> name , client -> addr );
1357
+
1358
+ list_del (& client -> detected );
1359
+ i2c_unregister_device (client );
1360
+ res = count ;
1361
+ break ;
1362
+ }
1364
1363
}
1365
- mutex_unlock (& core_lock );
1364
+ mutex_unlock (& adap -> userspace_clients_lock );
1366
1365
1367
- return count ;
1366
+ if (res < 0 )
1367
+ dev_err (dev , "%s: Can't find device in list\n" ,
1368
+ "delete_device" );
1369
+ return res ;
1368
1370
}
1369
1371
static DEVICE_ATTR_IGNORE_LOCKDEP (delete_device , S_IWUSR , NULL,
1370
1372
delete_device_store ) ;
@@ -1535,6 +1537,8 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
1535
1537
adap -> locked_flags = 0 ;
1536
1538
rt_mutex_init (& adap -> bus_lock );
1537
1539
rt_mutex_init (& adap -> mux_lock );
1540
+ mutex_init (& adap -> userspace_clients_lock );
1541
+ INIT_LIST_HEAD (& adap -> userspace_clients );
1538
1542
1539
1543
/* Set default timeout to 1 second if not already set */
1540
1544
if (adap -> timeout == 0 )
@@ -1726,6 +1730,7 @@ static int __unregister_dummy(struct device *dev, void *dummy)
1726
1730
void i2c_del_adapter (struct i2c_adapter * adap )
1727
1731
{
1728
1732
struct i2c_adapter * found ;
1733
+ struct i2c_client * client , * next ;
1729
1734
1730
1735
/* First make sure that this adapter was ever added */
1731
1736
mutex_lock (& core_lock );
@@ -1738,6 +1743,18 @@ void i2c_del_adapter(struct i2c_adapter *adap)
1738
1743
1739
1744
i2c_acpi_remove_space_handler (adap );
1740
1745
1746
+ /* Remove devices instantiated from sysfs */
1747
+ mutex_lock_nested (& adap -> userspace_clients_lock ,
1748
+ i2c_adapter_depth (adap ));
1749
+ list_for_each_entry_safe (client , next , & adap -> userspace_clients ,
1750
+ detected ) {
1751
+ dev_dbg (& adap -> dev , "Removing %s at 0x%x\n" , client -> name ,
1752
+ client -> addr );
1753
+ list_del (& client -> detected );
1754
+ i2c_unregister_device (client );
1755
+ }
1756
+ mutex_unlock (& adap -> userspace_clients_lock );
1757
+
1741
1758
/* Detach any active clients. This can't fail, thus we do not
1742
1759
* check the returned value. This is a two-pass process, because
1743
1760
* we can't remove the dummy devices during the first pass: they
0 commit comments