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

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
Loading
Loading
Loading
Loading
+16 −16
Original line number Original line Diff line number Diff line
@@ -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)
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)