diff options
author | Erik Andr?n <erik.andren@gmail.com> | 2009-01-13 12:18:53 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-06-16 17:20:32 -0400 |
commit | 0746673d21ea53d4bd710b47ad67c413e9510a5a (patch) | |
tree | aa53d0e68b3041ab8d1f1161e0ce8941865d2421 /drivers/media/video/gspca/m5602/m5602_mt9m111.c | |
parent | 74b123cf7ac638ede605e483cde0f534951f5266 (diff) |
V4L/DVB (11526): gspca - m5602-mt9m111: Add red balance 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/video/gspca/m5602/m5602_mt9m111.c')
-rw-r--r-- | drivers/media/video/gspca/m5602/m5602_mt9m111.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/drivers/media/video/gspca/m5602/m5602_mt9m111.c b/drivers/media/video/gspca/m5602/m5602_mt9m111.c index 8bdd29c7d8ff..95b6e95aa088 100644 --- a/drivers/media/video/gspca/m5602/m5602_mt9m111.c +++ b/drivers/media/video/gspca/m5602/m5602_mt9m111.c | |||
@@ -32,6 +32,8 @@ static int mt9m111_get_green_balance(struct gspca_dev *gspca_dev, __s32 *val); | |||
32 | static int mt9m111_set_green_balance(struct gspca_dev *gspca_dev, __s32 val); | 32 | static int mt9m111_set_green_balance(struct gspca_dev *gspca_dev, __s32 val); |
33 | static int mt9m111_get_blue_balance(struct gspca_dev *gspca_dev, __s32 *val); | 33 | static int mt9m111_get_blue_balance(struct gspca_dev *gspca_dev, __s32 *val); |
34 | static int mt9m111_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val); | 34 | static int mt9m111_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val); |
35 | static int mt9m111_get_red_balance(struct gspca_dev *gspca_dev, __s32 *val); | ||
36 | static int mt9m111_set_red_balance(struct gspca_dev *gspca_dev, __s32 val); | ||
35 | 37 | ||
36 | static struct v4l2_pix_format mt9m111_modes[] = { | 38 | static struct v4l2_pix_format mt9m111_modes[] = { |
37 | { | 39 | { |
@@ -134,6 +136,21 @@ const static struct ctrl mt9m111_ctrls[] = { | |||
134 | .set = mt9m111_set_blue_balance, | 136 | .set = mt9m111_set_blue_balance, |
135 | .get = mt9m111_get_blue_balance | 137 | .get = mt9m111_get_blue_balance |
136 | }, | 138 | }, |
139 | #define RED_BALANCE_IDX 5 | ||
140 | { | ||
141 | { | ||
142 | .id = V4L2_CID_RED_BALANCE, | ||
143 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
144 | .name = "red balance", | ||
145 | .minimum = 0x00, | ||
146 | .maximum = 0x7ff, | ||
147 | .step = 0x1, | ||
148 | .default_value = MT9M111_RED_GAIN_DEFAULT, | ||
149 | .flags = V4L2_CTRL_FLAG_SLIDER | ||
150 | }, | ||
151 | .set = mt9m111_set_red_balance, | ||
152 | .get = mt9m111_get_red_balance | ||
153 | }, | ||
137 | }; | 154 | }; |
138 | 155 | ||
139 | static void mt9m111_dump_registers(struct sd *sd); | 156 | static void mt9m111_dump_registers(struct sd *sd); |
@@ -240,6 +257,11 @@ int mt9m111_init(struct sd *sd) | |||
240 | if (err < 0) | 257 | if (err < 0) |
241 | return err; | 258 | return err; |
242 | 259 | ||
260 | err = mt9m111_set_red_balance(&sd->gspca_dev, | ||
261 | sensor_settings[RED_BALANCE_IDX]); | ||
262 | if (err < 0) | ||
263 | return err; | ||
264 | |||
243 | return mt9m111_set_gain(&sd->gspca_dev, sensor_settings[GAIN_IDX]); | 265 | return mt9m111_set_gain(&sd->gspca_dev, sensor_settings[GAIN_IDX]); |
244 | } | 266 | } |
245 | 267 | ||
@@ -462,6 +484,32 @@ static int mt9m111_get_blue_balance(struct gspca_dev *gspca_dev, __s32 *val) | |||
462 | return 0; | 484 | return 0; |
463 | } | 485 | } |
464 | 486 | ||
487 | static int mt9m111_set_red_balance(struct gspca_dev *gspca_dev, __s32 val) | ||
488 | { | ||
489 | u8 data[2]; | ||
490 | struct sd *sd = (struct sd *) gspca_dev; | ||
491 | s32 *sensor_settings = sd->sensor_priv; | ||
492 | |||
493 | sensor_settings[RED_BALANCE_IDX] = val; | ||
494 | data[0] = (val & 0xff); | ||
495 | data[1] = (val & 0xff00) >> 8; | ||
496 | |||
497 | PDEBUG(D_V4L2, "Set red balance %d", val); | ||
498 | |||
499 | return m5602_write_sensor(sd, MT9M111_SC_RED_GAIN, | ||
500 | data, 2); | ||
501 | } | ||
502 | |||
503 | static int mt9m111_get_red_balance(struct gspca_dev *gspca_dev, __s32 *val) | ||
504 | { | ||
505 | struct sd *sd = (struct sd *) gspca_dev; | ||
506 | s32 *sensor_settings = sd->sensor_priv; | ||
507 | |||
508 | *val = sensor_settings[RED_BALANCE_IDX]; | ||
509 | PDEBUG(D_V4L2, "Read red balance %d", *val); | ||
510 | return 0; | ||
511 | } | ||
512 | |||
465 | static void mt9m111_dump_registers(struct sd *sd) | 513 | static void mt9m111_dump_registers(struct sd *sd) |
466 | { | 514 | { |
467 | u8 address, value[2] = {0x00, 0x00}; | 515 | u8 address, value[2] = {0x00, 0x00}; |