From b77efbebd44a28b3356f9dab35eaf834be1b49a5 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Tue, 24 Aug 2021 18:23:53 +0800 Subject: [PATCH] media: i2c: imx335 increase hdr exposure restrictions Signed-off-by: Zefa Chen Change-Id: Ia097778ddd050a566801cede46f575f6954b01d7 --- drivers/media/i2c/imx335.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c index 6d5596e43ee9..dc0be277848c 100644 --- a/drivers/media/i2c/imx335.c +++ b/drivers/media/i2c/imx335.c @@ -10,6 +10,7 @@ * V0.0X01.0X03 add hdr_mode in enum frame interval * V0.0X01.0X04 fix hdr ae error * V0.0X01.0X05 add quick stream on/off + * V0.0X01.0X06 Increase hdr exposure restrictions */ #define DEBUG @@ -32,7 +33,7 @@ #include #include -#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x05) +#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x06) #ifndef V4L2_CID_DIGITAL_GAIN #define V4L2_CID_DIGITAL_GAIN V4L2_CID_GAIN @@ -924,7 +925,14 @@ static int imx335_set_hdrae(struct imx335 *imx335, rhs1_max = min(RHS1_MAX, shr0 - SHR1_MIN); rhs1_max = (rhs1_max & ~0x7) + 2; - rhs1_min = (SHR1_MIN + 4u + 7u) / 8 * 8 + 2; + rhs1_min = max(SHR1_MIN + 4u, rhs1_old + 2 * BRL - fsc + 2); + rhs1_min = (rhs1_min + 7u) / 8 * 8 + 2; + if (rhs1_max < rhs1_min) { + dev_err(&client->dev, + "The total exposure limit makes rhs1 max is %d,but old rhs1 limit makes rhs1 min is %d\n", + rhs1_max, rhs1_min); + return -EINVAL; + } rhs1 = SHR1_MIN + s_exp_time; rhs1 = (rhs1 & ~0x7) + 2; /* shall be 8n + 2 */ @@ -932,7 +940,6 @@ static int imx335_set_hdrae(struct imx335 *imx335, rhs1 = rhs1_max; if (rhs1 < rhs1_min) rhs1 = rhs1_min; - dev_dbg(&client->dev, "line(%d) rhs1 %d, short time %d rhs1_old %d, rhs1_new %d, rhs1_min %d rhs1_max %d\n", __LINE__, rhs1, s_exp_time, rhs1_old, rhs1, rhs1_min, rhs1_max); @@ -1106,6 +1113,12 @@ static int imx335_set_hdrae_3frame(struct imx335 *imx335, rhs1_change_limit = rhs1_old + 3 * BRL - fsc + 3; rhs1_change_limit = (rhs1_change_limit < 32) ? 32 : rhs1_change_limit; rhs1_change_limit = (rhs1_change_limit + 11) / 12 * 12 + 2; + if (rhs1_max < rhs1_change_limit) { + dev_err(&client->dev, + "The total exposure limit makes rhs1 max is %d,but old rhs1 limit makes rhs1 min is %d\n", + rhs1_max, rhs1_change_limit); + return -EINVAL; + } if (rhs1 < rhs1_change_limit) rhs1 = rhs1_change_limit; @@ -1137,6 +1150,12 @@ static int imx335_set_hdrae_3frame(struct imx335 *imx335, rhs2_change_limit = rhs2_old + 3 * BRL - fsc + 3; rhs2_change_limit = (rhs2_change_limit < 64) ? 64 : rhs2_change_limit; rhs2_change_limit = (rhs2_change_limit + 11) / 12 * 12 + 4; + if ((shr0 - 26) < rhs2_change_limit) { + dev_err(&client->dev, + "The total exposure limit makes rhs2 max is %d,but old rhs1 limit makes rhs2 min is %d\n", + shr0 - 26, rhs2_change_limit); + return -EINVAL; + } if (rhs2 < rhs2_change_limit) rhs2 = rhs2_change_limit;