@@ -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 )
@@ -1700,6 +1704,23 @@ int i2c_add_numbered_adapter(struct i2c_adapter *adap)
1700
1704
}
1701
1705
EXPORT_SYMBOL_GPL (i2c_add_numbered_adapter );
1702
1706
1707
+ static void i2c_do_del_adapter (struct i2c_driver * driver ,
1708
+ struct i2c_adapter * adapter )
1709
+ {
1710
+ struct i2c_client * client , * _n ;
1711
+
1712
+ /* Remove the devices we created ourselves as the result of hardware
1713
+ * probing (using a driver's detect method) */
1714
+ list_for_each_entry_safe (client , _n , & driver -> clients , detected ) {
1715
+ if (client -> adapter == adapter ) {
1716
+ dev_dbg (& adapter -> dev , "Removing %s at 0x%x\n" ,
1717
+ client -> name , client -> addr );
1718
+ list_del (& client -> detected );
1719
+ i2c_unregister_device (client );
1720
+ }
1721
+ }
1722
+ }
1723
+
1703
1724
static int __unregister_client (struct device * dev , void * dummy )
1704
1725
{
1705
1726
struct i2c_client * client = i2c_verify_client (dev );
@@ -1715,6 +1736,12 @@ static int __unregister_dummy(struct device *dev, void *dummy)
1715
1736
return 0 ;
1716
1737
}
1717
1738
1739
+ static int __process_removed_adapter (struct device_driver * d , void * data )
1740
+ {
1741
+ i2c_do_del_adapter (to_i2c_driver (d ), data );
1742
+ return 0 ;
1743
+ }
1744
+
1718
1745
/**
1719
1746
* i2c_del_adapter - unregister I2C adapter
1720
1747
* @adap: the adapter being unregistered
@@ -1726,6 +1753,7 @@ static int __unregister_dummy(struct device *dev, void *dummy)
1726
1753
void i2c_del_adapter (struct i2c_adapter * adap )
1727
1754
{
1728
1755
struct i2c_adapter * found ;
1756
+ struct i2c_client * client , * next ;
1729
1757
1730
1758
/* First make sure that this adapter was ever added */
1731
1759
mutex_lock (& core_lock );
@@ -1737,16 +1765,31 @@ void i2c_del_adapter(struct i2c_adapter *adap)
1737
1765
}
1738
1766
1739
1767
i2c_acpi_remove_space_handler (adap );
1768
+ /* Tell drivers about this removal */
1769
+ mutex_lock (& core_lock );
1770
+ bus_for_each_drv (& i2c_bus_type , NULL , adap ,
1771
+ __process_removed_adapter );
1772
+ mutex_unlock (& core_lock );
1773
+
1774
+ /* Remove devices instantiated from sysfs */
1775
+ mutex_lock_nested (& adap -> userspace_clients_lock ,
1776
+ i2c_adapter_depth (adap ));
1777
+ list_for_each_entry_safe (client , next , & adap -> userspace_clients ,
1778
+ detected ) {
1779
+ dev_dbg (& adap -> dev , "Removing %s at 0x%x\n" , client -> name ,
1780
+ client -> addr );
1781
+ list_del (& client -> detected );
1782
+ i2c_unregister_device (client );
1783
+ }
1784
+ mutex_unlock (& adap -> userspace_clients_lock );
1740
1785
1741
1786
/* Detach any active clients. This can't fail, thus we do not
1742
1787
* check the returned value. This is a two-pass process, because
1743
1788
* we can't remove the dummy devices during the first pass: they
1744
1789
* could have been instantiated by real devices wishing to clean
1745
1790
* them up properly, so we give them a chance to do that first. */
1746
- mutex_lock (& core_lock );
1747
1791
device_for_each_child (& adap -> dev , NULL , __unregister_client );
1748
1792
device_for_each_child (& adap -> dev , NULL , __unregister_dummy );
1749
- mutex_unlock (& core_lock );
1750
1793
1751
1794
/* device name is gone after device_unregister */
1752
1795
dev_dbg (& adap -> dev , "adapter [%s] unregistered\n" , adap -> name );
@@ -1966,6 +2009,7 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
1966
2009
/* add the driver to the list of i2c drivers in the driver core */
1967
2010
driver -> driver .owner = owner ;
1968
2011
driver -> driver .bus = & i2c_bus_type ;
2012
+ INIT_LIST_HEAD (& driver -> clients );
1969
2013
1970
2014
/* When registration returns, the driver core
1971
2015
* will have called probe() for all matching-but-unbound devices.
@@ -1983,13 +2027,10 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
1983
2027
}
1984
2028
EXPORT_SYMBOL (i2c_register_driver );
1985
2029
1986
- static int __i2c_unregister_detected_client (struct device * dev , void * argp )
2030
+ static int __process_removed_driver (struct device * dev , void * data )
1987
2031
{
1988
- struct i2c_client * client = i2c_verify_client (dev );
1989
-
1990
- if (client && client -> flags & I2C_CLIENT_AUTO )
1991
- i2c_unregister_device (client );
1992
-
2032
+ if (dev -> type == & i2c_adapter_type )
2033
+ i2c_do_del_adapter (data , to_i2c_adapter (dev ));
1993
2034
return 0 ;
1994
2035
}
1995
2036
@@ -2000,12 +2041,7 @@ static int __i2c_unregister_detected_client(struct device *dev, void *argp)
2000
2041
*/
2001
2042
void i2c_del_driver (struct i2c_driver * driver )
2002
2043
{
2003
- mutex_lock (& core_lock );
2004
- /* Satisfy __must_check, function can't fail */
2005
- if (driver_for_each_device (& driver -> driver , NULL , NULL ,
2006
- __i2c_unregister_detected_client )) {
2007
- }
2008
- mutex_unlock (& core_lock );
2044
+ i2c_for_each_dev (driver , __process_removed_driver );
2009
2045
2010
2046
driver_unregister (& driver -> driver );
2011
2047
pr_debug ("driver [%s] unregistered\n" , driver -> driver .name );
@@ -2432,7 +2468,6 @@ static int i2c_detect_address(struct i2c_client *temp_client,
2432
2468
/* Finally call the custom detection function */
2433
2469
memset (& info , 0 , sizeof (struct i2c_board_info ));
2434
2470
info .addr = addr ;
2435
- info .flags = I2C_CLIENT_AUTO ;
2436
2471
err = driver -> detect (temp_client , & info );
2437
2472
if (err ) {
2438
2473
/* -ENODEV is returned if the detection fails. We catch it
@@ -2459,7 +2494,9 @@ static int i2c_detect_address(struct i2c_client *temp_client,
2459
2494
dev_dbg (& adapter -> dev , "Creating %s at 0x%02x\n" ,
2460
2495
info .type , info .addr );
2461
2496
client = i2c_new_client_device (adapter , & info );
2462
- if (IS_ERR (client ))
2497
+ if (!IS_ERR (client ))
2498
+ list_add_tail (& client -> detected , & driver -> clients );
2499
+ else
2463
2500
dev_err (& adapter -> dev , "Failed creating %s at 0x%02x\n" ,
2464
2501
info .type , info .addr );
2465
2502
}
0 commit comments