media: i2c: sc3336 fix gain table error

Change-Id: I3f1c16a37d00321f3f740fc2816db1c9f9d5d98a
Signed-off-by: Jieyao Hu <toxicant.bane@rock-chips.com>
This commit is contained in:
Jieyao Hu
2022-08-11 11:24:36 +08:00
committed by Tao Huang
parent 6ae6cdd235
commit 8f4ffda867

View File

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