Commit 7ee46290 authored by Erik Andr?n's avatar Erik Andr?n Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (11530): gspca - m5602-s5k4aa: Add brightness v4l2 ctrl

parent 3290d402
Loading
Loading
Loading
Loading
+52 −2
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ static int s5k4aa_get_gain(struct gspca_dev *gspca_dev, __s32 *val);
static int s5k4aa_set_gain(struct gspca_dev *gspca_dev, __s32 val);
static int s5k4aa_get_noise(struct gspca_dev *gspca_dev, __s32 *val);
static int s5k4aa_set_noise(struct gspca_dev *gspca_dev, __s32 val);
static int s5k4aa_get_brightness(struct gspca_dev *gspca_dev, __s32 *val);
static int s5k4aa_set_brightness(struct gspca_dev *gspca_dev, __s32 val);

static
    const
@@ -113,7 +115,7 @@ const static struct ctrl s5k4aa_ctrls[] = {
			.minimum	= 0,
			.maximum	= 127,
			.step		= 1,
			.default_value	= DEFAULT_GAIN_2,
			.default_value	= S5K4AA_DEFAULT_GAIN,
			.flags		= V4L2_CTRL_FLAG_SLIDER
		},
		.set = s5k4aa_set_gain,
@@ -148,6 +150,21 @@ const static struct ctrl s5k4aa_ctrls[] = {
			.set = s5k4aa_set_noise,
			.get = s5k4aa_get_noise
	},
#define BRIGHTNESS_IDX 5
	{
		{
			.id		= V4L2_CID_BRIGHTNESS,
			.type		= V4L2_CTRL_TYPE_INTEGER,
			.name		= "Brightness",
			.minimum	= 0,
			.maximum	= 0x1f,
			.step		= 1,
			.default_value	= S5K4AA_DEFAULT_BRIGHTNESS,
		},
			.set = s5k4aa_set_brightness,
			.get = s5k4aa_get_brightness
	},

};

static void s5k4aa_dump_registers(struct sd *sd);
@@ -320,6 +337,11 @@ int s5k4aa_init(struct sd *sd)
	if (err < 0)
		return err;

	err = s5k4aa_set_brightness(&sd->gspca_dev,
				     sensor_settings[BRIGHTNESS_IDX]);
	if (err < 0)
		return err;

	err = s5k4aa_set_noise(&sd->gspca_dev, sensor_settings[NOISE_SUPP_IDX]);
	if (err < 0)
		return err;
@@ -508,9 +530,37 @@ static int s5k4aa_set_gain(struct gspca_dev *gspca_dev, __s32 val)
		return err;

	data = val & 0xff;
	err = m5602_write_sensor(sd, S5K4AA_GAIN_2, &data, 1);
	err = m5602_write_sensor(sd, S5K4AA_GAIN, &data, 1);

	return err;
}

static int s5k4aa_get_brightness(struct gspca_dev *gspca_dev, __s32 *val)
{
	struct sd *sd = (struct sd *) gspca_dev;
	s32 *sensor_settings = sd->sensor_priv;

	*val = sensor_settings[BRIGHTNESS_IDX];
	PDEBUG(D_V4L2, "Read brightness %d", *val);
	return 0;
}

static int s5k4aa_set_brightness(struct gspca_dev *gspca_dev, __s32 val)
{
	struct sd *sd = (struct sd *) gspca_dev;
	s32 *sensor_settings = sd->sensor_priv;
	u8 data = S5K4AA_PAGE_MAP_2;
	int err;

	sensor_settings[BRIGHTNESS_IDX] = val;

	PDEBUG(D_V4L2, "Set brightness to %d", val);
	err = m5602_write_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
	if (err < 0)
		return err;

	data = val & 0xff;
	return m5602_write_sensor(sd, S5K4AA_BRIGHTNESS, &data, 1);
}

static int s5k4aa_get_noise(struct gspca_dev *gspca_dev, __s32 *val)
+4 −4
Original line number Diff line number Diff line
@@ -47,8 +47,8 @@
#define S5K4AA_H_BLANK_LO__		0x1e
#define S5K4AA_EXPOSURE_HI		0x17
#define S5K4AA_EXPOSURE_LO		0x18
#define S5K4AA_GAIN_1			0x1f /* (digital?) gain : 5 bits */
#define S5K4AA_GAIN_2			0x20 /* (analogue?) gain : 7 bits */
#define S5K4AA_BRIGHTNESS		0x1f /* (digital?) gain : 5 bits */
#define S5K4AA_GAIN			0x20 /* (analogue?) gain : 7 bits */
#define S5K4AA_NOISE_SUPP		0x37

#define S5K4AA_RM_ROW_SKIP_4X		0x08
@@ -58,7 +58,8 @@
#define S5K4AA_RM_H_FLIP		0x40
#define S5K4AA_RM_V_FLIP		0x80

#define DEFAULT_GAIN_2			0x5f
#define S5K4AA_DEFAULT_GAIN		0x5f
#define S5K4AA_DEFAULT_BRIGHTNESS	0x10

/*****************************************************************************/

@@ -303,7 +304,6 @@ static const unsigned char VGA_s5k4aa[][4] =
	{SENSOR, 0x12, 0xc3, 0x00},
	{SENSOR, S5K4AA_PAGE_MAP, 0x02, 0x00},
	{SENSOR, 0x02, 0x0e, 0x00},
	{SENSOR, S5K4AA_GAIN_1, 0x10, 0x00},
};

#endif