#include <linux/kernel.h>
#include <linux/i2c.h>
+#include <linux/rwsem.h>
#include "i2c-core.h"
/* These symbols are exported ONLY FOR the i2c core.
* No other users will be supported.
*/
-DEFINE_MUTEX(__i2c_board_lock);
+DECLARE_RWSEM(__i2c_board_lock);
EXPORT_SYMBOL_GPL(__i2c_board_lock);
LIST_HEAD(__i2c_board_list);
{
int status;
- mutex_lock(&__i2c_board_lock);
+ down_write(&__i2c_board_lock);
/* dynamic bus numbers will be assigned after the last static one */
if (busnum >= __i2c_first_dynamic_bus_num)
list_add_tail(&devinfo->list, &__i2c_board_list);
}
- mutex_unlock(&__i2c_board_lock);
+ up_write(&__i2c_board_lock);
return status;
}
#include <linux/completion.h>
#include <linux/hardirq.h>
#include <linux/irqflags.h>
+#include <linux/rwsem.h>
#include <asm/uaccess.h>
#include "i2c-core.h"
{
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,
"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)
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <linux/rwsem.h>
+
struct i2c_devinfo {
struct list_head list;
int busnum;
/* board_lock protects board_list and first_dynamic_bus_num.
* only i2c core components are allowed to use these symbols.
*/
-extern struct mutex __i2c_board_lock;
+extern struct rw_semaphore __i2c_board_lock;
extern struct list_head __i2c_board_list;
extern int __i2c_first_dynamic_bus_num;