mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user