diff options
author | Erik Andr?n <erik.andren@gmail.com> | 2009-01-13 14:40:28 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-06-16 17:20:33 -0400 |
commit | 3290d40206ce122058a1f1f56dfce3d2000107b3 (patch) | |
tree | 1d299f900470fc1a28ad3caf7a4ff30125f00b76 | |
parent | 71c6e59d474ed8608b4e5aa998bec47b46c44a93 (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>
-rw-r--r-- | drivers/media/video/gspca/m5602/m5602_s5k4aa.c | 54 | ||||
-rw-r--r-- | drivers/media/video/gspca/m5602/m5602_s5k4aa.h | 1 | ||||
-rw-r--r-- | drivers/media/video/gspca/m5602/m5602_sensor.h | 1 |
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 3a3df102637..4ecba9b2a5a 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); | |||
26 | static int s5k4aa_set_hflip(struct gspca_dev *gspca_dev, __s32 val); | 26 | static int s5k4aa_set_hflip(struct gspca_dev *gspca_dev, __s32 val); |
27 | static int s5k4aa_get_gain(struct gspca_dev *gspca_dev, __s32 *val); | 27 | static int s5k4aa_get_gain(struct gspca_dev *gspca_dev, __s32 *val); |
28 | static int s5k4aa_set_gain(struct gspca_dev *gspca_dev, __s32 val); | 28 | static int s5k4aa_set_gain(struct gspca_dev *gspca_dev, __s32 val); |
29 | static int s5k4aa_get_noise(struct gspca_dev *gspca_dev, __s32 *val); | ||
30 | static int s5k4aa_set_noise(struct gspca_dev *gspca_dev, __s32 val); | ||
29 | 31 | ||
30 | static | 32 | static |
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 | ||
137 | static void s5k4aa_dump_registers(struct sd *sd); | 153 | static 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 | ||
316 | static int s5k4aa_get_exposure(struct gspca_dev *gspca_dev, __s32 *val) | 334 | static 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 | ||
516 | static 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 | |||
526 | static 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 | |||
498 | void s5k4aa_disconnect(struct sd *sd) | 544 | void 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 fbcb9c1e8c9..8299f216c20 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 5b76b6b6215..c3a72117b39 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 */ |
27 | enum sensors { | 28 | enum sensors { |