aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/m5mols/m5mols_controls.c
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2012-03-06 05:10:00 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-05-14 13:33:38 -0400
commit48311db6768040970d4a28faab17583b5177af84 (patch)
tree264b2b4a5e3a3851e85ed3b01cbe896b4c4d6269 /drivers/media/video/m5mols/m5mols_controls.c
parentd7a87e4cc39f7ee4f6d1a1a8b8fffc10a7b0c1e9 (diff)
[media] m5mols: Add exposure bias control
Add integer menu control for exposure bias. The control value range is -2.0 EV to +2.0 EV, in 0.5 EV steps. Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/m5mols/m5mols_controls.c')
-rw-r--r--drivers/media/video/m5mols/m5mols_controls.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/media/video/m5mols/m5mols_controls.c b/drivers/media/video/m5mols/m5mols_controls.c
index 1ab21f0afa8a..797836315225 100644
--- a/drivers/media/video/m5mols/m5mols_controls.c
+++ b/drivers/media/video/m5mols/m5mols_controls.c
@@ -241,6 +241,11 @@ static int m5mols_set_exposure(struct m5mols_info *info, int exposure)
241 ret = m5mols_write(sd, AE_MODE, REG_AE_ALL); 241 ret = m5mols_write(sd, AE_MODE, REG_AE_ALL);
242 if (ret < 0) 242 if (ret < 0)
243 return ret; 243 return ret;
244
245 v4l2_dbg(1, m5mols_debug, sd, "%s: exposure bias: %#x\n",
246 __func__, info->exposure_bias->val);
247
248 return m5mols_write(sd, AE_INDEX, info->exposure_bias->val);
244 } 249 }
245 250
246 if (exposure == V4L2_EXPOSURE_MANUAL) { 251 if (exposure == V4L2_EXPOSURE_MANUAL) {
@@ -251,6 +256,9 @@ static int m5mols_set_exposure(struct m5mols_info *info, int exposure)
251 if (ret == 0) 256 if (ret == 0)
252 ret = m5mols_write(sd, AE_MAN_GAIN_CAP, 257 ret = m5mols_write(sd, AE_MAN_GAIN_CAP,
253 info->exposure->val); 258 info->exposure->val);
259
260 v4l2_dbg(1, m5mols_debug, sd, "%s: exposure: %#x\n",
261 __func__, info->exposure->val);
254 } 262 }
255 263
256 return ret; 264 return ret;
@@ -447,6 +455,12 @@ static const s64 iso_qmenu[] = {
447 50, 100, 200, 400, 800, 1600, 3200 455 50, 100, 200, 400, 800, 1600, 3200
448}; 456};
449 457
458/* Supported Exposure Bias values, -2.0EV...+2.0EV */
459static const s64 ev_bias_qmenu[] = {
460 /* AE_INDEX: 0x00...0x08 */
461 -2000, -1500, -1000, -500, 0, 500, 1000, 1500, 2000
462};
463
450int m5mols_init_controls(struct v4l2_subdev *sd) 464int m5mols_init_controls(struct v4l2_subdev *sd)
451{ 465{
452 struct m5mols_info *info = to_m5mols(sd); 466 struct m5mols_info *info = to_m5mols(sd);
@@ -467,6 +481,7 @@ int m5mols_init_controls(struct v4l2_subdev *sd)
467 &m5mols_ctrl_ops, V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE, 481 &m5mols_ctrl_ops, V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE,
468 9, ~0x3fe, V4L2_WHITE_BALANCE_AUTO); 482 9, ~0x3fe, V4L2_WHITE_BALANCE_AUTO);
469 483
484 /* Exposure control cluster */
470 info->auto_exposure = v4l2_ctrl_new_std_menu(&info->handle, 485 info->auto_exposure = v4l2_ctrl_new_std_menu(&info->handle,
471 &m5mols_ctrl_ops, V4L2_CID_EXPOSURE_AUTO, 486 &m5mols_ctrl_ops, V4L2_CID_EXPOSURE_AUTO,
472 1, ~0x03, V4L2_EXPOSURE_AUTO); 487 1, ~0x03, V4L2_EXPOSURE_AUTO);
@@ -475,6 +490,12 @@ int m5mols_init_controls(struct v4l2_subdev *sd)
475 &m5mols_ctrl_ops, V4L2_CID_EXPOSURE, 490 &m5mols_ctrl_ops, V4L2_CID_EXPOSURE,
476 0, exposure_max, 1, exposure_max / 2); 491 0, exposure_max, 1, exposure_max / 2);
477 492
493 info->exposure_bias = v4l2_ctrl_new_int_menu(&info->handle,
494 &m5mols_ctrl_ops, V4L2_CID_AUTO_EXPOSURE_BIAS,
495 ARRAY_SIZE(ev_bias_qmenu) - 1,
496 ARRAY_SIZE(ev_bias_qmenu)/2 - 1,
497 ev_bias_qmenu);
498
478 /* ISO control cluster */ 499 /* ISO control cluster */
479 info->auto_iso = v4l2_ctrl_new_std_menu(&info->handle, &m5mols_ctrl_ops, 500 info->auto_iso = v4l2_ctrl_new_std_menu(&info->handle, &m5mols_ctrl_ops,
480 V4L2_CID_ISO_SENSITIVITY_AUTO, 1, ~0x03, 1); 501 V4L2_CID_ISO_SENSITIVITY_AUTO, 1, ~0x03, 1);
@@ -499,8 +520,7 @@ int m5mols_init_controls(struct v4l2_subdev *sd)
499 return ret; 520 return ret;
500 } 521 }
501 522
502 v4l2_ctrl_auto_cluster(2, &info->auto_exposure, 1, false); 523 v4l2_ctrl_auto_cluster(3, &info->auto_exposure, 1, false);
503
504 info->auto_iso->flags |= V4L2_CTRL_FLAG_VOLATILE | 524 info->auto_iso->flags |= V4L2_CTRL_FLAG_VOLATILE |
505 V4L2_CTRL_FLAG_UPDATE; 525 V4L2_CTRL_FLAG_UPDATE;
506 v4l2_ctrl_auto_cluster(2, &info->auto_iso, 0, false); 526 v4l2_ctrl_auto_cluster(2, &info->auto_iso, 0, false);