aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorErik Andr?n <erik.andren@gmail.com>2009-01-13 14:40:28 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-06-16 17:20:33 -0400
commit3290d40206ce122058a1f1f56dfce3d2000107b3 (patch)
tree1d299f900470fc1a28ad3caf7a4ff30125f00b76 /drivers
parent71c6e59d474ed8608b4e5aa998bec47b46c44a93 (diff)
V4L/DVB (11529): gspca - m5602-s5k4aa: Add noise suppression ctrl
Signed-off-by: Erik Andr?n <erik.andren@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/gspca/m5602/m5602_s5k4aa.c54
-rw-r--r--drivers/media/video/gspca/m5602/m5602_s5k4aa.h1
-rw-r--r--drivers/media/video/gspca/m5602/m5602_sensor.h1
3 files changed, 52 insertions, 4 deletions
diff --git a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c
index 3a3df102637f..4ecba9b2a5a4 100644
--- a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c
+++ b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c
@@ -26,6 +26,8 @@ static int s5k4aa_get_hflip(struct gspca_dev *gspca_dev, __s32 *val);
26static int s5k4aa_set_hflip(struct gspca_dev *gspca_dev, __s32 val); 26static int s5k4aa_set_hflip(struct gspca_dev *gspca_dev, __s32 val);
27static int s5k4aa_get_gain(struct gspca_dev *gspca_dev, __s32 *val); 27static 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);
30static int s5k4aa_set_noise(struct gspca_dev *gspca_dev, __s32 val);
29 31
30static 32static
31 const 33 const
@@ -131,7 +133,21 @@ const static struct ctrl s5k4aa_ctrls[] = {
131 }, 133 },
132 .set = s5k4aa_set_exposure, 134 .set = s5k4aa_set_exposure,
133 .get = s5k4aa_get_exposure 135 .get = s5k4aa_get_exposure
134 } 136 },
137#define NOISE_SUPP_IDX 4
138 {
139 {
140 .id = V4L2_CID_PRIVATE_BASE,
141 .type = V4L2_CTRL_TYPE_BOOLEAN,
142 .name = "Noise suppression (smoothing)",
143 .minimum = 0,
144 .maximum = 1,
145 .step = 1,
146 .default_value = 1,
147 },
148 .set = s5k4aa_set_noise,
149 .get = s5k4aa_get_noise
150 },
135}; 151};
136 152
137static void s5k4aa_dump_registers(struct sd *sd); 153static void s5k4aa_dump_registers(struct sd *sd);
@@ -304,13 +320,15 @@ int s5k4aa_init(struct sd *sd)
304 if (err < 0) 320 if (err < 0)
305 return err; 321 return err;
306 322
307 err = s5k4aa_set_vflip(&sd->gspca_dev, sensor_settings[VFLIP_IDX]); 323 err = s5k4aa_set_noise(&sd->gspca_dev, sensor_settings[NOISE_SUPP_IDX]);
308 if (err < 0) 324 if (err < 0)
309 return err; 325 return err;
310 326
311 err = s5k4aa_set_hflip(&sd->gspca_dev, sensor_settings[HFLIP_IDX]); 327 err = s5k4aa_set_vflip(&sd->gspca_dev, sensor_settings[VFLIP_IDX]);
328 if (err < 0)
329 return err;
312 330
313 return err; 331 return s5k4aa_set_hflip(&sd->gspca_dev, sensor_settings[HFLIP_IDX]);
314} 332}
315 333
316static int s5k4aa_get_exposure(struct gspca_dev *gspca_dev, __s32 *val) 334static int s5k4aa_get_exposure(struct gspca_dev *gspca_dev, __s32 *val)
@@ -495,6 +513,34 @@ static int s5k4aa_set_gain(struct gspca_dev *gspca_dev, __s32 val)
495 return err; 513 return err;
496} 514}
497 515
516static int s5k4aa_get_noise(struct gspca_dev *gspca_dev, __s32 *val)
517{
518 struct sd *sd = (struct sd *) gspca_dev;
519 s32 *sensor_settings = sd->sensor_priv;
520
521 *val = sensor_settings[NOISE_SUPP_IDX];
522 PDEBUG(D_V4L2, "Read noise %d", *val);
523 return 0;
524}
525
526static int s5k4aa_set_noise(struct gspca_dev *gspca_dev, __s32 val)
527{
528 struct sd *sd = (struct sd *) gspca_dev;
529 s32 *sensor_settings = sd->sensor_priv;
530 u8 data = S5K4AA_PAGE_MAP_2;
531 int err;
532
533 sensor_settings[NOISE_SUPP_IDX] = val;
534
535 PDEBUG(D_V4L2, "Set noise to %d", val);
536 err = m5602_write_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
537 if (err < 0)
538 return err;
539
540 data = val & 0x01;
541 return m5602_write_sensor(sd, S5K4AA_NOISE_SUPP, &data, 1);
542}
543
498void s5k4aa_disconnect(struct sd *sd) 544void s5k4aa_disconnect(struct sd *sd)
499{ 545{
500 sd->sensor = NULL; 546 sd->sensor = NULL;
diff --git a/drivers/media/video/gspca/m5602/m5602_s5k4aa.h b/drivers/media/video/gspca/m5602/m5602_s5k4aa.h
index fbcb9c1e8c9d..8299f216c20d 100644
--- a/drivers/media/video/gspca/m5602/m5602_s5k4aa.h
+++ b/drivers/media/video/gspca/m5602/m5602_s5k4aa.h
@@ -49,6 +49,7 @@
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_GAIN_1 0x1f /* (digital?) gain : 5 bits */
51#define S5K4AA_GAIN_2 0x20 /* (analogue?) gain : 7 bits */ 51#define S5K4AA_GAIN_2 0x20 /* (analogue?) gain : 7 bits */
52#define S5K4AA_NOISE_SUPP 0x37
52 53
53#define S5K4AA_RM_ROW_SKIP_4X 0x08 54#define S5K4AA_RM_ROW_SKIP_4X 0x08
54#define S5K4AA_RM_ROW_SKIP_2X 0x04 55#define S5K4AA_RM_ROW_SKIP_2X 0x04
diff --git a/drivers/media/video/gspca/m5602/m5602_sensor.h b/drivers/media/video/gspca/m5602/m5602_sensor.h
index 5b76b6b62152..c3a72117b39c 100644
--- a/drivers/media/video/gspca/m5602/m5602_sensor.h
+++ b/drivers/media/video/gspca/m5602/m5602_sensor.h
@@ -22,6 +22,7 @@
22#include "m5602_bridge.h" 22#include "m5602_bridge.h"
23 23
24#define M5602_V4L2_CID_GREEN_BALANCE (V4L2_CID_PRIVATE_BASE + 0) 24#define M5602_V4L2_CID_GREEN_BALANCE (V4L2_CID_PRIVATE_BASE + 0)
25#define M5602_V4L2_CID_NOISE_SUPPRESION (V4L2_CID_PRIVATE_BASE + 1)
25 26
26/* Enumerates all supported sensors */ 27/* Enumerates all supported sensors */
27enum sensors { 28enum sensors {