aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/i2c-core.c
diff options
context:
space:
mode:
authorVladimir Zapolskiy <vladimir_zapolskiy@mentor.com>2015-07-27 10:30:49 -0400
committerWolfram Sang <wsa@the-dreams.de>2015-08-10 02:37:35 -0400
commit611e12ea0f121a31d9e9c4ce2a18a77abc2f28d6 (patch)
tree21ecc5c1663e948017d947026fe071e1f0906f50 /drivers/i2c/i2c-core.c
parent141124e6e0db645396321aabed01c5e0b12cccc1 (diff)
i2c: core: manage i2c bus device refcount in i2c_[get|put]_adapter
In addition to module_get()/module_put() add get_device()/put_device() calls into i2c_get_adapter()/i2c_put_adapter() exported interfaces. This is done to lock I2C bus device, if it is in use by a client. Signed-off-by: Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Diffstat (limited to 'drivers/i2c/i2c-core.c')
-rw-r--r--drivers/i2c/i2c-core.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index c83e4d13cfc5..f80992d0a608 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -2413,9 +2413,15 @@ struct i2c_adapter *i2c_get_adapter(int nr)
2413 2413
2414 mutex_lock(&core_lock); 2414 mutex_lock(&core_lock);
2415 adapter = idr_find(&i2c_adapter_idr, nr); 2415 adapter = idr_find(&i2c_adapter_idr, nr);
2416 if (adapter && !try_module_get(adapter->owner)) 2416 if (!adapter)
2417 goto exit;
2418
2419 if (try_module_get(adapter->owner))
2420 get_device(&adapter->dev);
2421 else
2417 adapter = NULL; 2422 adapter = NULL;
2418 2423
2424 exit:
2419 mutex_unlock(&core_lock); 2425 mutex_unlock(&core_lock);
2420 return adapter; 2426 return adapter;
2421} 2427}
@@ -2423,8 +2429,11 @@ EXPORT_SYMBOL(i2c_get_adapter);
2423 2429
2424void i2c_put_adapter(struct i2c_adapter *adap) 2430void i2c_put_adapter(struct i2c_adapter *adap)
2425{ 2431{
2426 if (adap) 2432 if (!adap)
2427 module_put(adap->owner); 2433 return;
2434
2435 put_device(&adap->dev);
2436 module_put(adap->owner);
2428} 2437}
2429EXPORT_SYMBOL(i2c_put_adapter); 2438EXPORT_SYMBOL(i2c_put_adapter);
2430 2439