From 1a5d2a8da4236bbde41b68749af0c28ac290a999 Mon Sep 17 00:00:00 2001 From: Su Yuefu Date: Thu, 8 Sep 2022 14:22:02 +0800 Subject: [PATCH] media: i2c: change sc3338 gain times from 1000 to 128 Signed-off-by: Su Yuefu Change-Id: I7bc0aa6bea913a4d5c64aec5a595d9c0960b83cf --- drivers/media/i2c/sc3338.c | 43 +++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/drivers/media/i2c/sc3338.c b/drivers/media/i2c/sc3338.c index 3cec60ed2490..b63e4bcbfaea 100644 --- a/drivers/media/i2c/sc3338.c +++ b/drivers/media/i2c/sc3338.c @@ -417,54 +417,55 @@ static int sc3338_set_gain_reg(struct sc3338 *sc3338, u32 gain) { struct i2c_client *client = sc3338->client; u32 coarse_again = 0, coarse_dgain = 0, fine_dgain = 0; - int ret = 0; + int ret = 0, gain_factor; if (gain < 128) gain = 128; else if (gain > SC3338_GAIN_MAX) gain = SC3338_GAIN_MAX; - if (gain < 1520) { + gain_factor = gain * 1000 / 128; + if (gain_factor < 1520) { coarse_again = 0x00; coarse_dgain = 0x00; - fine_dgain = gain * 128 / 1000; - } else if (gain < 3040) { + fine_dgain = gain_factor * 128 / 1000; + } else if (gain_factor < 3040) { coarse_again = 0x40; coarse_dgain = 0x00; - fine_dgain = gain * 128 / 1520; - } else if (gain < 6080) { + fine_dgain = gain_factor * 128 / 1520; + } else if (gain_factor < 6080) { coarse_again = 0x48; coarse_dgain = 0x00; - fine_dgain = gain * 128 / 3040; - } else if (gain < 12160) { + fine_dgain = gain_factor * 128 / 3040; + } else if (gain_factor < 12160) { coarse_again = 0x49; coarse_dgain = 0x00; - fine_dgain = gain * 128 / 6080; - } else if (gain < 24320) { + fine_dgain = gain_factor * 128 / 6080; + } else if (gain_factor < 24320) { coarse_again = 0x4b; coarse_dgain = 0x00; - fine_dgain = gain * 128 / 12160; - } else if (gain < 48640) { + fine_dgain = gain_factor * 128 / 12160; + } else if (gain_factor < 48640) { coarse_again = 0x4f; coarse_dgain = 0x00; - fine_dgain = gain * 128 / 24320; - } else if (gain < 48640 * 2) { + fine_dgain = gain_factor * 128 / 24320; + } else if (gain_factor < 48640 * 2) { //open dgain begin max digital gain 4X coarse_again = 0x5f; coarse_dgain = 0x00; - fine_dgain = gain * 128 / 48640; - } else if (gain < 48640 * 4) { + fine_dgain = gain_factor * 128 / 48640; + } else if (gain_factor < 48640 * 4) { coarse_again = 0x5f; coarse_dgain = 0x01; - fine_dgain = gain * 128 / 48640 / 2; - } else if (gain < 48640 * 8) { + fine_dgain = gain_factor * 128 / 48640 / 2; + } else if (gain_factor < 48640 * 8) { coarse_again = 0x5f; coarse_dgain = 0x03; - fine_dgain = gain * 128 / 48640 / 4; - } else if (gain < 48640 * 16) { + fine_dgain = gain_factor * 128 / 48640 / 4; + } else if (gain_factor < 48640 * 16) { coarse_again = 0x5f; coarse_dgain = 0x07; - fine_dgain = gain * 128 / 48640 / 8; + fine_dgain = gain_factor * 128 / 48640 / 8; } dev_dbg(&client->dev, "c_again: 0x%x, c_dgain: 0x%x, f_dgain: 0x%0x\n", coarse_again, coarse_dgain, fine_dgain);