diff mbox series

i2c: dev: Check for I2C_FUNC_I2C before calling i2c_transfer

Message ID 20240531113407.4df71f5a@endymion.delvare
State New
Headers show
Series i2c: dev: Check for I2C_FUNC_I2C before calling i2c_transfer | expand

Commit Message

Jean Delvare May 31, 2024, 9:34 a.m. UTC
It is good practice to check that the underlying adapter supports
I2C transfers before attempting them. The i2c core would eventually
return an error, but it's more efficient to fail early.

Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
Not sure about that one, opinions welcome.

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

Comments

Wolfram Sang June 26, 2024, 10:39 a.m. UTC | #1
On Fri, May 31, 2024 at 11:34:07AM GMT, Jean Delvare wrote:
> It is good practice to check that the underlying adapter supports
> I2C transfers before attempting them. The i2c core would eventually
> return an error, but it's more efficient to fail early.
> 
> Signed-off-by: Jean Delvare <jdelvare@suse.de>

Applied to for-next, thanks!
diff mbox series

Patch

--- linux-6.9.orig/drivers/i2c/i2c-dev.c
+++ linux-6.9/drivers/i2c/i2c-dev.c
@@ -139,6 +139,10 @@  static ssize_t i2cdev_read(struct file *
 
 	struct i2c_client *client = file->private_data;
 
+	/* Adapter must support I2C transfers */
+	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
+		return -EOPNOTSUPP;
+
 	if (count > 8192)
 		count = 8192;
 
@@ -163,6 +167,10 @@  static ssize_t i2cdev_write(struct file
 	char *tmp;
 	struct i2c_client *client = file->private_data;
 
+	/* Adapter must support I2C transfers */
+	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
+		return -EOPNOTSUPP;
+
 	if (count > 8192)
 		count = 8192;
 
@@ -238,6 +246,10 @@  static noinline int i2cdev_ioctl_rdwr(st
 	u8 __user **data_ptrs;
 	int i, res;
 
+	/* Adapter must support I2C transfers */
+	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
+		return -EOPNOTSUPP;
+
 	data_ptrs = kmalloc_array(nmsgs, sizeof(u8 __user *), GFP_KERNEL);
 	if (data_ptrs == NULL) {
 		kfree(msgs);