]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: i2c: ov5647: Fix runtime PM refcount leak in s_ctrl
authorXiaolei Wang <xiaolei.wang@windriver.com>
Wed, 25 Feb 2026 08:56:21 +0000 (16:56 +0800)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 11 Mar 2026 00:05:35 +0000 (01:05 +0100)
Three control cases (AUTOGAIN, EXPOSURE_AUTO, ANALOGUE_GAIN) directly
return without calling pm_runtime_put(), causing runtime PM reference
count leaks.

Change these cases from 'return' to 'ret = ... break' pattern to ensure
pm_runtime_put() is always called before function exit.

Fixes: 4f66f36388d5 ("media: i2c: ov5647: Convert to CCI register access helpers")
Cc: stable@vger.kernel.org
Signed-off-by: Xiaolei Wang <xiaolei.wang@windriver.com>
Reviewed-by: Tarang Raval <tarang.raval@siliconsignals.io>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/i2c/ov5647.c

index 6a46ef7233ac3f3e60ed044a3f3d5d118f12afdf..db9bd2892140de23948670366ed1d44e661bae9b 100644 (file)
@@ -967,21 +967,21 @@ static int ov5647_s_ctrl(struct v4l2_ctrl *ctrl)
                break;
        case V4L2_CID_AUTOGAIN:
                /* Non-zero turns on AGC by clearing bit 1.*/
-               return cci_update_bits(sensor->regmap, OV5647_REG_AEC_AGC, BIT(1),
-                                      ctrl->val ? 0 : BIT(1), NULL);
+               ret = cci_update_bits(sensor->regmap, OV5647_REG_AEC_AGC, BIT(1),
+                                     ctrl->val ? 0 : BIT(1), NULL);
                break;
        case V4L2_CID_EXPOSURE_AUTO:
                /*
                 * Everything except V4L2_EXPOSURE_MANUAL turns on AEC by
                 * clearing bit 0.
                 */
-               return cci_update_bits(sensor->regmap, OV5647_REG_AEC_AGC, BIT(0),
-                                      ctrl->val == V4L2_EXPOSURE_MANUAL ? BIT(0) : 0, NULL);
+               ret = cci_update_bits(sensor->regmap, OV5647_REG_AEC_AGC, BIT(0),
+                                     ctrl->val == V4L2_EXPOSURE_MANUAL ? BIT(0) : 0, NULL);
                break;
        case V4L2_CID_ANALOGUE_GAIN:
                /* 10 bits of gain, 2 in the high register. */
-               return cci_write(sensor->regmap, OV5647_REG_GAIN,
-                                ctrl->val & 0x3ff, NULL);
+               ret = cci_write(sensor->regmap, OV5647_REG_GAIN,
+                               ctrl->val & 0x3ff, NULL);
                break;
        case V4L2_CID_EXPOSURE:
                /*