summaryrefslogtreecommitdiffstats
path: root/drivers/i2c/i2c-core.c
diff options
context:
space:
mode:
authorRodolfo Giometti2009-06-19 16:58:20 +0200
committerJean Delvare2009-06-19 16:58:20 +0200
commitf18c41daea14baee11252da268cdf5dcd57c7c10 (patch)
treeec42ed7000fa64925db3cd596737bd54d9fa71ca /drivers/i2c/i2c-core.c
parenti2c: Add a sysfs interface to instantiate devices (diff)
downloadkernel-qcow2-linux-f18c41daea14baee11252da268cdf5dcd57c7c10.tar.gz
kernel-qcow2-linux-f18c41daea14baee11252da268cdf5dcd57c7c10.tar.xz
kernel-qcow2-linux-f18c41daea14baee11252da268cdf5dcd57c7c10.zip
i2c: Use rwsem instead of mutex for board info
By using rwsem we can easily manage recursive calls of i2c_scan_static_board_info() function without breaking the locking. Signed-off-by: Rodolfo Giometti <giometti@linux.it> Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/i2c/i2c-core.c')
-rw-r--r--drivers/i2c/i2c-core.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index eb084fa0df83..0e45c296d3d2 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -33,6 +33,7 @@
#include <linux/completion.h>
#include <linux/hardirq.h>
#include <linux/irqflags.h>
+#include <linux/rwsem.h>
#include <asm/uaccess.h>
#include "i2c-core.h"
@@ -509,7 +510,7 @@ static void i2c_scan_static_board_info(struct i2c_adapter *adapter)
{
struct i2c_devinfo *devinfo;
- mutex_lock(&__i2c_board_lock);
+ down_read(&__i2c_board_lock);
list_for_each_entry(devinfo, &__i2c_board_list, list) {
if (devinfo->busnum == adapter->nr
&& !i2c_new_device(adapter,
@@ -518,7 +519,7 @@ static void i2c_scan_static_board_info(struct i2c_adapter *adapter)
"Can't create device at 0x%02x\n",
devinfo->board_info.addr);
}
- mutex_unlock(&__i2c_board_lock);
+ up_read(&__i2c_board_lock);
}
static int i2c_do_add_adapter(struct device_driver *d, void *data)