Commit bfced6d1 authored by Chiranjeevi Rapolu's avatar Chiranjeevi Rapolu Committed by Mauro Carvalho Chehab

media: ov13858: Increase digital gain granularity, range

Previously, possible digital gains were just 1x, 2x and 4x. These
coarse gains were not sufficient in fine-tuning the image capture.

Now, digital gain range is [0, 16x] with each step 1/1024, default 1x.
This is achieved through OV13858 MWB R/G/B gain controls.
Signed-off-by: default avatarChiranjeevi Rapolu <chiranjeevi.rapolu@intel.com>
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 89d8b615
...@@ -77,13 +77,13 @@ ...@@ -77,13 +77,13 @@
#define OV13858_ANA_GAIN_DEFAULT 0x80 #define OV13858_ANA_GAIN_DEFAULT 0x80
/* Digital gain control */ /* Digital gain control */
#define OV13858_REG_DIGITAL_GAIN 0x350a #define OV13858_REG_B_MWB_GAIN 0x5100
#define OV13858_DGTL_GAIN_MASK 0xf3 #define OV13858_REG_G_MWB_GAIN 0x5102
#define OV13858_DGTL_GAIN_SHIFT 2 #define OV13858_REG_R_MWB_GAIN 0x5104
#define OV13858_DGTL_GAIN_MIN 1 #define OV13858_DGTL_GAIN_MIN 0
#define OV13858_DGTL_GAIN_MAX 4 #define OV13858_DGTL_GAIN_MAX 16384 /* Max = 16 X */
#define OV13858_DGTL_GAIN_STEP 1 #define OV13858_DGTL_GAIN_DEFAULT 1024 /* Default gain = 1 X */
#define OV13858_DGTL_GAIN_DEFAULT 1 #define OV13858_DGTL_GAIN_STEP 1 /* Each step = 1/1024 */
/* Test Pattern Control */ /* Test Pattern Control */
#define OV13858_REG_TEST_PATTERN 0x4503 #define OV13858_REG_TEST_PATTERN 0x4503
...@@ -1162,21 +1162,21 @@ static int ov13858_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) ...@@ -1162,21 +1162,21 @@ static int ov13858_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
static int ov13858_update_digital_gain(struct ov13858 *ov13858, u32 d_gain) static int ov13858_update_digital_gain(struct ov13858 *ov13858, u32 d_gain)
{ {
int ret; int ret;
u32 val;
if (d_gain == 3) ret = ov13858_write_reg(ov13858, OV13858_REG_B_MWB_GAIN,
return -EINVAL; OV13858_REG_VALUE_16BIT, d_gain);
if (ret)
return ret;
ret = ov13858_read_reg(ov13858, OV13858_REG_DIGITAL_GAIN, ret = ov13858_write_reg(ov13858, OV13858_REG_G_MWB_GAIN,
OV13858_REG_VALUE_08BIT, &val); OV13858_REG_VALUE_16BIT, d_gain);
if (ret) if (ret)
return ret; return ret;
val &= OV13858_DGTL_GAIN_MASK; ret = ov13858_write_reg(ov13858, OV13858_REG_R_MWB_GAIN,
val |= (d_gain - 1) << OV13858_DGTL_GAIN_SHIFT; OV13858_REG_VALUE_16BIT, d_gain);
return ov13858_write_reg(ov13858, OV13858_REG_DIGITAL_GAIN, return ret;
OV13858_REG_VALUE_08BIT, val);
} }
static int ov13858_enable_test_pattern(struct ov13858 *ov13858, u32 pattern) static int ov13858_enable_test_pattern(struct ov13858 *ov13858, u32 pattern)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment