[i2c] [PATCH] i2c-dev: Unbound new-style i2c clients aren't busy

Jean Delvare khali at linux-fr.org
Mon Oct 15 23:10:46 CEST 2007


Let i2c-dev deal properly with new-style i2c clients. Instead of
considering them always busy, it needs to check wether a driver is
bound to them or not.

This is still not completely correct, as the client could become
busy later, but the same problem already existed before new-style
clients were introduced. We'll want to fix it someday.

Signed-off-by: Jean Delvare <khali at linux-fr.org>
---
David, can you please test and confirm that i2c-dev behaves as it
should with new-styled drivers? Thanks.

 drivers/i2c/i2c-dev.c |   26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

--- linux-2.6.23-rc0.orig/drivers/i2c/i2c-dev.c	2007-10-13 15:15:44.000000000 +0200
+++ linux-2.6.23-rc0/drivers/i2c/i2c-dev.c	2007-10-13 20:11:41.000000000 +0200
@@ -182,6 +182,29 @@ static ssize_t i2cdev_write (struct file
 	return ret;
 }
 
+/* This address checking function differs from the one in i2c-core
+   in that it considers an address with a registered device, but no
+   bounded driver, as NOT busy. */
+static int i2cdev_check_addr(struct i2c_adapter *adapter, unsigned int addr)
+{
+	struct list_head *item;
+	struct i2c_client *client;
+	int res = 0;
+
+	mutex_lock(&adapter->clist_lock);
+	list_for_each(item, &adapter->clients) {
+		client = list_entry(item, struct i2c_client, list);
+		if (client->addr == addr) {
+			if (client->driver)
+				res = -EBUSY;
+			break;
+		}
+	}
+	mutex_unlock(&adapter->clist_lock);
+
+	return res;
+}
+
 static int i2cdev_ioctl(struct inode *inode, struct file *file,
 		unsigned int cmd, unsigned long arg)
 {
@@ -213,8 +236,9 @@ static int i2cdev_ioctl(struct inode *in
 		if ((arg > 0x3ff) ||
 		    (((client->flags & I2C_M_TEN) == 0) && arg > 0x7f))
 			return -EINVAL;
-		if ((cmd == I2C_SLAVE) && i2c_check_addr(client->adapter,arg))
+		if (cmd == I2C_SLAVE && i2cdev_check_addr(client->adapter, arg))
 			return -EBUSY;
+		/* REVISIT: address could become busy later */
 		client->addr = arg;
 		return 0;
 	case I2C_TENBIT:


-- 
Jean Delvare



More information about the i2c mailing list