media: i2c: sc3338 fix gain table error

Signed-off-by: Su Yuefu <yuefu.su@rock-chips.com>
Change-Id: Ibe35b1c74224723cf2be128ca45eeab12c6f05a9
This commit is contained in:
Su Yuefu
2022-08-08 20:08:53 +08:00
committed by Tao Huang
parent 356dbfbc92
commit 685eb49e76

View File

@@ -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,