aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorErik Andr?n <erik.andren@gmail.com>2009-01-14 01:37:03 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-06-16 17:20:33 -0400
commit7ee4629092aa2982a3fbb9cfb3691637b55b4a40 (patch)
treee000f06302edc667b0d9555c2617ed9f42b30671 /drivers/media
parent3290d40206ce122058a1f1f56dfce3d2000107b3 (diff)
V4L/DVB (11530): gspca - m5602-s5k4aa: Add brightness v4l2 ctrl
Signed-off-by: Erik Andr?n <erik.andren@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/video/gspca/m5602/m5602_s5k4aa.c54
-rw-r--r--drivers/media/video/gspca/m5602/m5602_s5k4aa.h8
2 files changed, 56 insertions, 6 deletions
diff --git a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c
index 4ecba9b2a5a..404439fa4bb 100644
--- a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c
+++ b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c
@@ -28,6 +28,8 @@ static int s5k4aa_get_gain(struct gspca_dev *gspca_dev, __s32 *val);
28static int s5k4aa_set_gain(struct gspca_dev *gspca_dev, __s32 val); 28static int s5k4aa_set_gain(struct gspca_dev *gspca_dev, __s32 val);
29static int s5k4aa_get_noise(struct gspca_dev *gspca_dev, __s32 *val); 29static int s5k4aa_get_noise(struct gspca_dev *gspca_dev, __s32 *val);
30static int s5k4aa_set_noise(struct gspca_dev *gspca_dev, __s32 val); 30static int s5k4aa_set_noise(struct gspca_dev *gspca_dev, __s32 val);
31static int s5k4aa_get_brightness(struct gspca_dev *gspca_dev, __s32 *val);
32static int s5k4aa_set_brightness(struct gspca_dev *gspca_dev, __s32 val);
31 33
32static 34static
33 const 35 const
@@ -113,7 +115,7 @@ const static struct ctrl s5k4aa_ctrls[] = {
113 .minimum = 0, 115 .minimum = 0,
114 .maximum = 127, 116 .maximum = 127,
115 .step = 1, 117 .step = 1,
116 .default_value = DEFAULT_GAIN_2, 118 .default_value = S5K4AA_DEFAULT_GAIN,
117 .flags = V4L2_CTRL_FLAG_SLIDER 119 .flags = V4L2_CTRL_FLAG_SLIDER
118 }, 120 },
119 .set = s5k4aa_set_gain, 121 .set = s5k4aa_set_gain,
@@ -148,6 +150,21 @@ const static struct ctrl s5k4aa_ctrls[] = {
148 .set = s5k4aa_set_noise, 150 .set = s5k4aa_set_noise,
149 .get = s5k4aa_get_noise 151 .get = s5k4aa_get_noise
150 }, 152 },
153#define BRIGHTNESS_IDX 5
154 {
155 {
156 .id = V4L2_CID_BRIGHTNESS,
157 .type = V4L2_CTRL_TYPE_INTEGER,
158 .name = "Brightness",
159 .minimum = 0,
160 .maximum = 0x1f,
161 .step = 1,
162 .default_value = S5K4AA_DEFAULT_BRIGHTNESS,
163 },
164 .set = s5k4aa_set_brightness,
165 .get = s5k4aa_get_brightness
166 },
167
151}; 168};
152 169
153static void s5k4aa_dump_registers(struct sd *sd); 170static void s5k4aa_dump_registers(struct sd *sd);
@@ -320,6 +337,11 @@ int s5k4aa_init(struct sd *sd)
320 if (err < 0) 337 if (err < 0)
321 return err; 338 return err;
322 339
340 err = s5k4aa_set_brightness(&sd->gspca_dev,
341 sensor_settings[BRIGHTNESS_IDX]);
342 if (err < 0)
343 return err;
344
323 err = s5k4aa_set_noise(&sd->gspca_dev, sensor_settings[NOISE_SUPP_IDX]); 345 err = s5k4aa_set_noise(&sd->gspca_dev, sensor_settings[NOISE_SUPP_IDX]);
324 if (err < 0) 346 if (err < 0)
325 return err; 347 return err;
@@ -508,11 +530,39 @@ static int s5k4aa_set_gain(struct gspca_dev *gspca_dev, __s32 val)
508 return err; 530 return err;
509 531
510 data = val & 0xff; 532 data = val & 0xff;
511 err = m5602_write_sensor(sd, S5K4AA_GAIN_2, &data, 1); 533 err = m5602_write_sensor(sd, S5K4AA_GAIN, &data, 1);
512 534
513 return err; 535 return err;
514} 536}
515 537
538static int s5k4aa_get_brightness(struct gspca_dev *gspca_dev, __s32 *val)
539{
540 struct sd *sd = (struct sd *) gspca_dev;
541 s32 *sensor_settings = sd->sensor_priv;
542
543 *val = sensor_settings[BRIGHTNESS_IDX];
544 PDEBUG(D_V4L2, "Read brightness %d", *val);
545 return 0;
546}
547
548static int s5k4aa_set_brightness(struct gspca_dev *gspca_dev, __s32 val)
549{
550 struct sd *sd = (struct sd *) gspca_dev;
551 s32 *sensor_settings = sd->sensor_priv;
552 u8 data = S5K4AA_PAGE_MAP_2;
553 int err;
554
555 sensor_settings[BRIGHTNESS_IDX] = val;
556
557 PDEBUG(D_V4L2, "Set brightness to %d", val);
558 err = m5602_write_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
559 if (err < 0)
560 return err;
561
562 data = val & 0xff;
563 return m5602_write_sensor(sd, S5K4AA_BRIGHTNESS, &data, 1);
564}
565
516static int s5k4aa_get_noise(struct gspca_dev *gspca_dev, __s32 *val) 566static int s5k4aa_get_noise(struct gspca_dev *gspca_dev, __s32 *val)
517{ 567{
518 struct sd *sd = (struct sd *) gspca_dev; 568 struct sd *sd = (struct sd *) gspca_dev;
diff --git a/drivers/media/video/gspca/m5602/m5602_s5k4aa.h b/drivers/media/video/gspca/m5602/m5602_s5k4aa.h
index 8299f216c20..2349174ad66 100644
--- a/drivers/media/video/gspca/m5602/m5602_s5k4aa.h
+++ b/drivers/media/video/gspca/m5602/m5602_s5k4aa.h
@@ -47,8 +47,8 @@
47#define S5K4AA_H_BLANK_LO__ 0x1e 47#define S5K4AA_H_BLANK_LO__ 0x1e
48#define S5K4AA_EXPOSURE_HI 0x17 48#define S5K4AA_EXPOSURE_HI 0x17
49#define S5K4AA_EXPOSURE_LO 0x18 49#define S5K4AA_EXPOSURE_LO 0x18
50#define S5K4AA_GAIN_1 0x1f /* (digital?) gain : 5 bits */ 50#define S5K4AA_BRIGHTNESS 0x1f /* (digital?) gain : 5 bits */
51#define S5K4AA_GAIN_2 0x20 /* (analogue?) gain : 7 bits */ 51#define S5K4AA_GAIN 0x20 /* (analogue?) gain : 7 bits */
52#define S5K4AA_NOISE_SUPP 0x37 52#define S5K4AA_NOISE_SUPP 0x37
53 53
54#define S5K4AA_RM_ROW_SKIP_4X 0x08 54#define S5K4AA_RM_ROW_SKIP_4X 0x08
@@ -58,7 +58,8 @@
58#define S5K4AA_RM_H_FLIP 0x40 58#define S5K4AA_RM_H_FLIP 0x40
59#define S5K4AA_RM_V_FLIP 0x80 59#define S5K4AA_RM_V_FLIP 0x80
60 60
61#define DEFAULT_GAIN_2 0x5f 61#define S5K4AA_DEFAULT_GAIN 0x5f
62#define S5K4AA_DEFAULT_BRIGHTNESS 0x10
62 63
63/*****************************************************************************/ 64/*****************************************************************************/
64 65
@@ -303,7 +304,6 @@ static const unsigned char VGA_s5k4aa[][4] =
303 {SENSOR, 0x12, 0xc3, 0x00}, 304 {SENSOR, 0x12, 0xc3, 0x00},
304 {SENSOR, S5K4AA_PAGE_MAP, 0x02, 0x00}, 305 {SENSOR, S5K4AA_PAGE_MAP, 0x02, 0x00},
305 {SENSOR, 0x02, 0x0e, 0x00}, 306 {SENSOR, 0x02, 0x0e, 0x00},
306 {SENSOR, S5K4AA_GAIN_1, 0x10, 0x00},
307}; 307};
308 308
309#endif 309#endif