From 4346e71373adf03df155da69e0e7dab95749f708 Mon Sep 17 00:00:00 2001 From: Wang Panzhenzhuan Date: Mon, 31 May 2021 17:47:23 +0800 Subject: [PATCH] media: i2c: sc200ai: fix set exposue bug ctrl->val = ctrl->val * 2 will return ctrl->val to v4l2 framework, and if next time set ctrl->val is 2 * previous ctrl->val, will not actually set; so fix it. Signed-off-by: Wang Panzhenzhuan Change-Id: I965f33f2e592a88ab2b8f6e362ca399260fe98ab --- drivers/media/i2c/sc200ai.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/media/i2c/sc200ai.c b/drivers/media/i2c/sc200ai.c index 9f5e098aaba2..8b9dd82ada0b 100644 --- a/drivers/media/i2c/sc200ai.c +++ b/drivers/media/i2c/sc200ai.c @@ -10,6 +10,9 @@ * V0.0X01.0X04 add enum_frame_interval function. * V0.0X01.0X05 add quick stream on/off. * V0.0X01.0X06 fix set vflip/hflip failed bug. + * V0.0X01.0X07 + * 1. fix set double times exposue value failed issue. + * 2. add some debug info. */ #include @@ -31,7 +34,7 @@ #include #include -#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x06) +#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x07) #ifndef V4L2_CID_DIGITAL_GAIN #define V4L2_CID_DIGITAL_GAIN V4L2_CID_GAIN @@ -1471,6 +1474,7 @@ static int sc200ai_set_ctrl(struct v4l2_ctrl *ctrl) s64 max; int ret = 0; u32 val = 0; + s32 temp = 0; /* Propagate change of current control to all related controls */ switch (ctrl->id) { @@ -1489,28 +1493,31 @@ static int sc200ai_set_ctrl(struct v4l2_ctrl *ctrl) switch (ctrl->id) { case V4L2_CID_EXPOSURE: + dev_dbg(&client->dev, "set exposure value 0x%x\n", ctrl->val); if (sc200ai->cur_mode->hdr_mode == NO_HDR) { - ctrl->val = ctrl->val * 2; + temp = ctrl->val * 2; /* 4 least significant bits of expsoure are fractional part */ ret = sc200ai_write_reg(sc200ai->client, SC200AI_REG_EXPOSURE_H, SC200AI_REG_VALUE_08BIT, - SC200AI_FETCH_EXP_H(ctrl->val)); + SC200AI_FETCH_EXP_H(temp)); ret |= sc200ai_write_reg(sc200ai->client, SC200AI_REG_EXPOSURE_M, SC200AI_REG_VALUE_08BIT, - SC200AI_FETCH_EXP_M(ctrl->val)); + SC200AI_FETCH_EXP_M(temp)); ret |= sc200ai_write_reg(sc200ai->client, SC200AI_REG_EXPOSURE_L, SC200AI_REG_VALUE_08BIT, - SC200AI_FETCH_EXP_L(ctrl->val)); + SC200AI_FETCH_EXP_L(temp)); } break; case V4L2_CID_ANALOGUE_GAIN: + dev_dbg(&client->dev, "set gain value 0x%x\n", ctrl->val); if (sc200ai->cur_mode->hdr_mode == NO_HDR) ret = sc200ai_set_gain_reg(sc200ai, ctrl->val, SC200AI_LGAIN); break; case V4L2_CID_VBLANK: + dev_dbg(&client->dev, "set blank value 0x%x\n", ctrl->val); ret = sc200ai_write_reg(sc200ai->client, SC200AI_REG_VTS_H, SC200AI_REG_VALUE_08BIT,