The smatch logic gets confused with the syntax used to check if the ov9650x_read() reads succedded: drivers/media/i2c/ov9650.c:895 __g_volatile_ctrl() error: uninitialized symbol 'reg2'. drivers/media/i2c/ov9650.c:895 __g_volatile_ctrl() error: uninitialized symbol 'reg1'. There's nothing wrong with the original logic, except that it is a little more harder to review. So, let's stick with the syntax that won't cause read issues. Signed-off-by: Mauro Carvalho Chehab <mchehab@xxxxxxxxxxxxxxxx> --- drivers/media/i2c/ov9650.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/media/i2c/ov9650.c b/drivers/media/i2c/ov9650.c index 69433e1e2533..e519f278d5f9 100644 --- a/drivers/media/i2c/ov9650.c +++ b/drivers/media/i2c/ov9650.c @@ -886,10 +886,12 @@ static int __g_volatile_ctrl(struct ov965x *ov965x, struct v4l2_ctrl *ctrl) if (ctrl->val == V4L2_EXPOSURE_MANUAL) return 0; ret = ov965x_read(client, REG_COM1, ®0); - if (!ret) - ret = ov965x_read(client, REG_AECH, ®1); - if (!ret) - ret = ov965x_read(client, REG_AECHM, ®2); + if (ret < 0) + return ret; + ret = ov965x_read(client, REG_AECH, ®1); + if (ret < 0) + return ret; + ret = ov965x_read(client, REG_AECHM, ®2); if (ret < 0) return ret; exposure = ((reg2 & 0x3f) << 10) | (reg1 << 2) | -- 2.13.6