diff options
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, 47 insertions, 1 deletions
diff --git a/drivers/media/video/gspca/m5602/m5602_mt9m111.c b/drivers/media/video/gspca/m5602/m5602_mt9m111.c index c1ff4770e3a..8bdd29c7d8f 100644 --- a/drivers/media/video/gspca/m5602/m5602_mt9m111.c +++ b/drivers/media/video/gspca/m5602/m5602_mt9m111.c | |||
@@ -30,6 +30,8 @@ static int mt9m111_get_auto_white_balance(struct gspca_dev *gspca_dev, | |||
30 | __s32 *val); | 30 | __s32 *val); |
31 | static int mt9m111_get_green_balance(struct gspca_dev *gspca_dev, __s32 *val); | 31 | 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); | ||
34 | static int mt9m111_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val); | ||
33 | 35 | ||
34 | static struct v4l2_pix_format mt9m111_modes[] = { | 36 | static struct v4l2_pix_format mt9m111_modes[] = { |
35 | { | 37 | { |
@@ -117,7 +119,21 @@ const static struct ctrl mt9m111_ctrls[] = { | |||
117 | .set = mt9m111_set_green_balance, | 119 | .set = mt9m111_set_green_balance, |
118 | .get = mt9m111_get_green_balance | 120 | .get = mt9m111_get_green_balance |
119 | }, | 121 | }, |
120 | 122 | #define BLUE_BALANCE_IDX 5 | |
123 | { | ||
124 | { | ||
125 | .id = V4L2_CID_BLUE_BALANCE, | ||
126 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
127 | .name = "blue balance", | ||
128 | .minimum = 0x00, | ||
129 | .maximum = 0x7ff, | ||
130 | .step = 0x1, | ||
131 | .default_value = MT9M111_BLUE_GAIN_DEFAULT, | ||
132 | .flags = V4L2_CTRL_FLAG_SLIDER | ||
133 | }, | ||
134 | .set = mt9m111_set_blue_balance, | ||
135 | .get = mt9m111_get_blue_balance | ||
136 | }, | ||
121 | }; | 137 | }; |
122 | 138 | ||
123 | static void mt9m111_dump_registers(struct sd *sd); | 139 | static void mt9m111_dump_registers(struct sd *sd); |
@@ -219,6 +235,11 @@ int mt9m111_init(struct sd *sd) | |||
219 | if (err < 0) | 235 | if (err < 0) |
220 | return err; | 236 | return err; |
221 | 237 | ||
238 | err = mt9m111_set_blue_balance(&sd->gspca_dev, | ||
239 | sensor_settings[BLUE_BALANCE_IDX]); | ||
240 | if (err < 0) | ||
241 | return err; | ||
242 | |||
222 | return mt9m111_set_gain(&sd->gspca_dev, sensor_settings[GAIN_IDX]); | 243 | return mt9m111_set_gain(&sd->gspca_dev, sensor_settings[GAIN_IDX]); |
223 | } | 244 | } |
224 | 245 | ||
@@ -415,6 +436,31 @@ static int mt9m111_get_green_balance(struct gspca_dev *gspca_dev, __s32 *val) | |||
415 | return 0; | 436 | return 0; |
416 | } | 437 | } |
417 | 438 | ||
439 | static int mt9m111_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val) | ||
440 | { | ||
441 | u8 data[2]; | ||
442 | struct sd *sd = (struct sd *) gspca_dev; | ||
443 | s32 *sensor_settings = sd->sensor_priv; | ||
444 | |||
445 | sensor_settings[BLUE_BALANCE_IDX] = val; | ||
446 | data[0] = (val & 0xff); | ||
447 | data[1] = (val & 0xff00) >> 8; | ||
448 | |||
449 | PDEBUG(D_V4L2, "Set blue balance %d", val); | ||
450 | |||
451 | return m5602_write_sensor(sd, MT9M111_SC_BLUE_GAIN, | ||
452 | data, 2); | ||
453 | } | ||
454 | |||
455 | static int mt9m111_get_blue_balance(struct gspca_dev *gspca_dev, __s32 *val) | ||
456 | { | ||
457 | struct sd *sd = (struct sd *) gspca_dev; | ||
458 | s32 *sensor_settings = sd->sensor_priv; | ||
459 | |||
460 | *val = sensor_settings[BLUE_BALANCE_IDX]; | ||
461 | PDEBUG(D_V4L2, "Read blue balance %d", *val); | ||
462 | return 0; | ||
463 | } | ||
418 | 464 | ||
419 | static void mt9m111_dump_registers(struct sd *sd) | 465 | static void mt9m111_dump_registers(struct sd *sd) |
420 | { | 466 | { |