From 8f4ffda867a13a5b53f4218c8f52e9829d39f40d Mon Sep 17 00:00:00 2001 From: Jieyao Hu Date: Thu, 11 Aug 2022 11:24:36 +0800 Subject: [PATCH] media: i2c: sc3336 fix gain table error Change-Id: I3f1c16a37d00321f3f740fc2816db1c9f9d5d98a Signed-off-by: Jieyao Hu --- drivers/media/i2c/sc3336.c | 71 +++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/drivers/media/i2c/sc3336.c b/drivers/media/i2c/sc3336.c index 7d986dc2d781..46a9e367c40f 100644 --- a/drivers/media/i2c/sc3336.c +++ b/drivers/media/i2c/sc3336.c @@ -588,8 +588,8 @@ static int sc3336_read_reg(struct i2c_client *client, u16 reg, unsigned int len, static int sc3336_set_gain_reg(struct sc3336 *sc3336, u32 gain) { - u32 coarse_again = 0, coarse_dgian = 0, fine_dgian = 0; - u32 gain_factor; + struct i2c_client *client = sc3336->client; + u32 coarse_again = 0, coarse_dgain = 0, fine_dgain = 0; int ret = 0; if (gain < 128) @@ -597,58 +597,59 @@ static int sc3336_set_gain_reg(struct sc3336 *sc3336, u32 gain) else if (gain > SC3336_GAIN_MAX) gain = SC3336_GAIN_MAX; - gain_factor = gain * 1000 / 128; - if (gain_factor < 1520) { + if (gain < 1520) { coarse_again = 0x00; - coarse_dgian = 0x00; - fine_dgian = gain_factor * 128 / 1000; - } else if (gain_factor < 3040) { + coarse_dgain = 0x00; + fine_dgain = gain * 128 / 1000; + } else if (gain < 3040) { coarse_again = 0x40; - coarse_dgian = 0x00; - fine_dgian = gain_factor * 128 / 1520; - } else if (gain_factor < 6080) { + coarse_dgain = 0x00; + fine_dgain = gain * 128 / 1520; + } else if (gain < 6080) { coarse_again = 0x48; - coarse_dgian = 0x00; - fine_dgian = gain_factor * 128 / 3040; - } else if (gain_factor < 12160) { + coarse_dgain = 0x00; + fine_dgain = gain * 128 / 3040; + } else if (gain < 12160) { coarse_again = 0x49; - coarse_dgian = 0x00; - fine_dgian = gain_factor * 128 / 6080; - } else if (gain_factor < 24320) { + coarse_dgain = 0x00; + fine_dgain = gain * 128 / 6080; + } else if (gain < 24320) { coarse_again = 0x4b; - coarse_dgian = 0x00; - fine_dgian = gain_factor * 128 / 12160; - } else if (gain_factor < 48640) { + coarse_dgain = 0x00; + fine_dgain = gain * 128 / 12160; + } else if (gain < 48640) { coarse_again = 0x4f; - coarse_dgian = 0x00; - fine_dgian = gain_factor * 128 / 24320; - } else if (gain_factor < 48640 * 2) { + coarse_dgain = 0x00; + fine_dgain = gain * 128 / 24320; + } else if (gain < 48640 * 2) { //open dgain begin max digital gain 4X coarse_again = 0x5f; - coarse_dgian = 0x00; - fine_dgian = gain_factor * 128 / 48640; - } else if (gain_factor < 48640 * 4) { + coarse_dgain = 0x00; + fine_dgain = gain * 128 / 48640; + } else if (gain < 48640 * 4) { coarse_again = 0x5f; - coarse_dgian = 0x01; - fine_dgian = gain_factor * 128 / 48640 / 2; - } else if (gain_factor < 48640 * 8) { + coarse_dgain = 0x01; + fine_dgain = gain * 128 / 48640 / 2; + } else if (gain < 48640 * 8) { coarse_again = 0x5f; - coarse_dgian = 0x03; - fine_dgian = gain_factor * 128 / 48640 / 4; - } else if (gain_factor < 48640 * 16) { + coarse_dgain = 0x03; + fine_dgain = gain * 128 / 48640 / 4; + } else if (gain < 48640 * 16) { coarse_again = 0x5f; - coarse_dgian = 0x07; - fine_dgian = gain_factor * 128 / 48640 / 8; + coarse_dgain = 0x07; + fine_dgain = gain * 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); ret = sc3336_write_reg(sc3336->client, SC3336_REG_DIG_GAIN, SC3336_REG_VALUE_08BIT, - coarse_dgian); + coarse_dgain); ret |= sc3336_write_reg(sc3336->client, SC3336_REG_DIG_FINE_GAIN, SC3336_REG_VALUE_08BIT, - fine_dgian); + fine_dgain); ret |= sc3336_write_reg(sc3336->client, SC3336_REG_ANA_GAIN, SC3336_REG_VALUE_08BIT,