diff --git a/drivers/media/i2c/sc3338.c b/drivers/media/i2c/sc3338.c index 8f522d9a9bb9..df631a84670b 100644 --- a/drivers/media/i2c/sc3338.c +++ b/drivers/media/i2c/sc3338.c @@ -416,8 +416,8 @@ static int sc3338_read_reg(struct i2c_client *client, u16 reg, unsigned int len, static int sc3338_set_gain_reg(struct sc3338 *sc3338, u32 gain) { - u32 coarse_again = 0, coarse_dgian = 0, fine_dgian = 0; - u32 gain_factor; + struct i2c_client *client = sc3338->client; + u32 coarse_again = 0, coarse_dgain = 0, fine_dgain = 0; int ret = 0; if (gain < 128) @@ -425,58 +425,59 @@ static int sc3338_set_gain_reg(struct sc3338 *sc3338, u32 gain) else if (gain > SC3338_GAIN_MAX) gain = SC3338_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 = sc3338_write_reg(sc3338->client, SC3338_REG_DIG_GAIN, SC3338_REG_VALUE_08BIT, - coarse_dgian); + coarse_dgain); ret |= sc3338_write_reg(sc3338->client, SC3338_REG_DIG_FINE_GAIN, SC3338_REG_VALUE_08BIT, - fine_dgian); + fine_dgain); ret |= sc3338_write_reg(sc3338->client, SC3338_REG_ANA_GAIN, SC3338_REG_VALUE_08BIT,