diff options
author | Erik Andr?n <erik.andren@gmail.com> | 2009-01-08 01:53:50 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-06-16 17:20:25 -0400 |
commit | 3b9ae658ec77180d13152913a1f63b6f1b2756c2 (patch) | |
tree | ef8c4539b1df606cfa7649f0796fcb426f45845b /drivers/media/video/gspca | |
parent | cb29e691977ac7677ca62c13cc9aa1eab2463075 (diff) |
V4L/DVB (11459): gspca - m5602-po1030: Add auto white balancing control
Add a po1030 auto white balancing control that's disabled by default
Signed-off-by: Erik Andr?n <erik.andren@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca')
-rw-r--r-- | drivers/media/video/gspca/m5602/m5602_po1030.c | 51 | ||||
-rw-r--r-- | drivers/media/video/gspca/m5602/m5602_po1030.h | 2 |
2 files changed, 53 insertions, 0 deletions
diff --git a/drivers/media/video/gspca/m5602/m5602_po1030.c b/drivers/media/video/gspca/m5602/m5602_po1030.c index 7ec3fbffc4be..7eec6e8ca72e 100644 --- a/drivers/media/video/gspca/m5602/m5602_po1030.c +++ b/drivers/media/video/gspca/m5602/m5602_po1030.c | |||
@@ -119,6 +119,20 @@ const static struct ctrl po1030_ctrls[] = { | |||
119 | }, | 119 | }, |
120 | .set = po1030_set_vflip, | 120 | .set = po1030_set_vflip, |
121 | .get = po1030_get_vflip | 121 | .get = po1030_get_vflip |
122 | }, | ||
123 | #define AUTO_WHITE_BALANCE_IDX 6 | ||
124 | { | ||
125 | { | ||
126 | .id = V4L2_CID_AUTO_WHITE_BALANCE, | ||
127 | .type = V4L2_CTRL_TYPE_BOOLEAN, | ||
128 | .name = "auto white balance", | ||
129 | .minimum = 0, | ||
130 | .maximum = 1, | ||
131 | .step = 1, | ||
132 | .default_value = 0, | ||
133 | }, | ||
134 | .set = po1030_set_auto_white_balance, | ||
135 | .get = po1030_get_auto_white_balance | ||
122 | } | 136 | } |
123 | }; | 137 | }; |
124 | 138 | ||
@@ -238,6 +252,14 @@ int po1030_init(struct sd *sd) | |||
238 | 252 | ||
239 | err = po1030_set_red_balance(&sd->gspca_dev, | 253 | err = po1030_set_red_balance(&sd->gspca_dev, |
240 | sensor_settings[BLUE_BALANCE_IDX]); | 254 | sensor_settings[BLUE_BALANCE_IDX]); |
255 | if (err < 0) | ||
256 | return err; | ||
257 | |||
258 | err = po1030_set_auto_white_balance(&sd->gspca_dev, | ||
259 | sensor_settings[AUTO_WHITE_BALANCE_IDX]); | ||
260 | if (err < 0) | ||
261 | return err; | ||
262 | |||
241 | return err; | 263 | return err; |
242 | } | 264 | } |
243 | 265 | ||
@@ -425,6 +447,35 @@ int po1030_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val) | |||
425 | return err; | 447 | return err; |
426 | } | 448 | } |
427 | 449 | ||
450 | int po1030_get_auto_white_balance(struct gspca_dev *gspca_dev, __s32 *val) | ||
451 | { | ||
452 | struct sd *sd = (struct sd *) gspca_dev; | ||
453 | s32 *sensor_settings = sd->sensor_priv; | ||
454 | |||
455 | *val = sensor_settings[AUTO_WHITE_BALANCE_IDX]; | ||
456 | PDEBUG(D_V4L2, "Auto white balancing is %d", *val); | ||
457 | |||
458 | return 0; | ||
459 | } | ||
460 | |||
461 | int po1030_set_auto_white_balance(struct gspca_dev *gspca_dev, __s32 val) | ||
462 | { | ||
463 | struct sd *sd = (struct sd *) gspca_dev; | ||
464 | s32 *sensor_settings = sd->sensor_priv; | ||
465 | u8 i2c_data; | ||
466 | int err; | ||
467 | |||
468 | sensor_settings[AUTO_WHITE_BALANCE_IDX] = val; | ||
469 | |||
470 | err = m5602_read_sensor(sd, PO1030_AUTOCTRL1, &i2c_data, 1); | ||
471 | if (err < 0) | ||
472 | return err; | ||
473 | |||
474 | i2c_data = (i2c_data & 0xfe) | (val & 0x01); | ||
475 | err = m5602_write_sensor(sd, PO1030_AUTOCTRL1, &i2c_data, 1); | ||
476 | return err; | ||
477 | } | ||
478 | |||
428 | void po1030_disconnect(struct sd *sd) | 479 | void po1030_disconnect(struct sd *sd) |
429 | { | 480 | { |
430 | sd->sensor = NULL; | 481 | sd->sensor = NULL; |
diff --git a/drivers/media/video/gspca/m5602/m5602_po1030.h b/drivers/media/video/gspca/m5602/m5602_po1030.h index 013be33d1b20..1260cfa6e4ef 100644 --- a/drivers/media/video/gspca/m5602/m5602_po1030.h +++ b/drivers/media/video/gspca/m5602/m5602_po1030.h | |||
@@ -162,6 +162,8 @@ int po1030_get_hflip(struct gspca_dev *gspca_dev, __s32 *val); | |||
162 | int po1030_set_hflip(struct gspca_dev *gspca_dev, __s32 val); | 162 | int po1030_set_hflip(struct gspca_dev *gspca_dev, __s32 val); |
163 | int po1030_get_vflip(struct gspca_dev *gspca_dev, __s32 *val); | 163 | int po1030_get_vflip(struct gspca_dev *gspca_dev, __s32 *val); |
164 | int po1030_set_vflip(struct gspca_dev *gspca_dev, __s32 val); | 164 | int po1030_set_vflip(struct gspca_dev *gspca_dev, __s32 val); |
165 | int po1030_set_auto_white_balance(struct gspca_dev *gspca_dev, __s32 val); | ||
166 | int po1030_get_auto_white_balance(struct gspca_dev *gspca_dev, __s32 *val); | ||
165 | 167 | ||
166 | static const struct m5602_sensor po1030 = { | 168 | static const struct m5602_sensor po1030 = { |
167 | .name = "PO1030", | 169 | .name = "PO1030", |