media: ov5647: Fix return codes from ov5647_write/ov5647_read functions.
authorDavid Plowman <david.plowman@raspberrypi.org>
Wed, 15 Jan 2020 13:40:38 +0000 (13:40 +0000)
committerDom Cobley <popcornmix@gmail.com>
Mon, 19 Feb 2024 11:33:09 +0000 (11:33 +0000)
Previously they were returning positive non-zero codes for success,
which were getting passed up the call stack. Since release 4.19,
do_dentry_open (fs/open.c) has been catching these and flagging an
error. (So this driver has been broken since that date.)

Fixes: 3c2472a [media] media: i2c: Add support for OV5647 sensor
Signed-off-by: David Plowman <david.plowman@raspberrypi.org>
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
drivers/media/i2c/ov5647.c

index 8de3984..f1e6543 100644 (file)
@@ -602,7 +602,13 @@ static int ov5647_write16(struct v4l2_subdev *sd, u16 reg, u16 val)
        int ret;
 
        ret = i2c_master_send(client, data, 4);
-       if (ret < 0) {
+       /*
+        * Writing the wrong number of bytes also needs to be flagged as an
+        * error. Success needs to produce a 0 return code.
+        */
+       if (ret == 4) {
+               ret = 0;
+       } else {
                dev_dbg(&client->dev, "%s: i2c write error, reg: %x\n",
                        __func__, reg);
                return ret;
@@ -618,10 +624,17 @@ static int ov5647_write(struct v4l2_subdev *sd, u16 reg, u8 val)
        int ret;
 
        ret = i2c_master_send(client, data, 3);
-       if (ret < 0) {
+       /*
+        * Writing the wrong number of bytes also needs to be flagged as an
+        * error. Success needs to produce a 0 return code.
+        */
+       if (ret == 3) {
+               ret = 0;
+       } else {
                dev_dbg(&client->dev, "%s: i2c write error, reg: %x\n",
                                __func__, reg);
-               return ret;
+               if (ret >= 0)
+                       ret = -EINVAL;
        }
 
        return 0;