[media] m5mols: Add auto and preset white balance control
Replace the V4L2_CID_AUTO_WHITE_BALANCE control with its extended version - V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE so the white balance presets feature is exposed to user land. Acked-by: HeungJun Kim <riverful.kim@samsung.com> 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>
This commit is contained in:
parent
44b153ca63
commit
d7a87e4cc3
2 changed files with 39 additions and 12 deletions
|
@ -164,7 +164,7 @@ struct m5mols_version {
|
||||||
* @exposure: manual exposure control
|
* @exposure: manual exposure control
|
||||||
* @auto_iso: auto/manual ISO sensitivity control
|
* @auto_iso: auto/manual ISO sensitivity control
|
||||||
* @iso: manual ISO sensitivity control
|
* @iso: manual ISO sensitivity control
|
||||||
* @autowb: Auto White Balance control
|
* @auto_wb: auto white balance control
|
||||||
* @colorfx: color effect control
|
* @colorfx: color effect control
|
||||||
* @saturation: saturation control
|
* @saturation: saturation control
|
||||||
* @zoom: zoom control
|
* @zoom: zoom control
|
||||||
|
@ -200,8 +200,8 @@ struct m5mols_info {
|
||||||
struct v4l2_ctrl *auto_iso;
|
struct v4l2_ctrl *auto_iso;
|
||||||
struct v4l2_ctrl *iso;
|
struct v4l2_ctrl *iso;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct v4l2_ctrl *auto_wb;
|
struct v4l2_ctrl *auto_wb;
|
||||||
|
|
||||||
struct v4l2_ctrl *colorfx;
|
struct v4l2_ctrl *colorfx;
|
||||||
struct v4l2_ctrl *saturation;
|
struct v4l2_ctrl *saturation;
|
||||||
struct v4l2_ctrl *zoom;
|
struct v4l2_ctrl *zoom;
|
||||||
|
|
|
@ -256,16 +256,42 @@ static int m5mols_set_exposure(struct m5mols_info *info, int exposure)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int m5mols_set_white_balance(struct m5mols_info *info, int awb)
|
static int m5mols_set_white_balance(struct m5mols_info *info, int val)
|
||||||
{
|
{
|
||||||
int ret;
|
static const unsigned short wb[][2] = {
|
||||||
|
{ V4L2_WHITE_BALANCE_INCANDESCENT, REG_AWB_INCANDESCENT },
|
||||||
|
{ V4L2_WHITE_BALANCE_FLUORESCENT, REG_AWB_FLUORESCENT_1 },
|
||||||
|
{ V4L2_WHITE_BALANCE_FLUORESCENT_H, REG_AWB_FLUORESCENT_2 },
|
||||||
|
{ V4L2_WHITE_BALANCE_HORIZON, REG_AWB_HORIZON },
|
||||||
|
{ V4L2_WHITE_BALANCE_DAYLIGHT, REG_AWB_DAYLIGHT },
|
||||||
|
{ V4L2_WHITE_BALANCE_FLASH, REG_AWB_LEDLIGHT },
|
||||||
|
{ V4L2_WHITE_BALANCE_CLOUDY, REG_AWB_CLOUDY },
|
||||||
|
{ V4L2_WHITE_BALANCE_SHADE, REG_AWB_SHADE },
|
||||||
|
{ V4L2_WHITE_BALANCE_AUTO, REG_AWB_AUTO },
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
struct v4l2_subdev *sd = &info->sd;
|
||||||
|
int ret = -EINVAL;
|
||||||
|
|
||||||
ret = m5mols_lock_awb(info, !awb);
|
for (i = 0; i < ARRAY_SIZE(wb); i++) {
|
||||||
if (ret < 0)
|
int awb;
|
||||||
return ret;
|
if (wb[i][0] != val)
|
||||||
|
continue;
|
||||||
|
|
||||||
return m5mols_write(&info->sd, AWB_MODE, awb ? REG_AWB_AUTO :
|
v4l2_dbg(1, m5mols_debug, sd,
|
||||||
REG_AWB_PRESET);
|
"Setting white balance to: %#x\n", wb[i][0]);
|
||||||
|
|
||||||
|
awb = wb[i][0] == V4L2_WHITE_BALANCE_AUTO;
|
||||||
|
ret = m5mols_write(sd, AWB_MODE, awb ? REG_AWB_AUTO :
|
||||||
|
REG_AWB_PRESET);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (!awb)
|
||||||
|
ret = m5mols_write(sd, AWB_MANUAL, wb[i][1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int m5mols_set_saturation(struct m5mols_info *info, int val)
|
static int m5mols_set_saturation(struct m5mols_info *info, int val)
|
||||||
|
@ -391,7 +417,7 @@ static int m5mols_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||||
ret = m5mols_set_iso(info, ctrl->val);
|
ret = m5mols_set_iso(info, ctrl->val);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case V4L2_CID_AUTO_WHITE_BALANCE:
|
case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
|
||||||
ret = m5mols_set_white_balance(info, ctrl->val);
|
ret = m5mols_set_white_balance(info, ctrl->val);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -437,8 +463,9 @@ int m5mols_init_controls(struct v4l2_subdev *sd)
|
||||||
|
|
||||||
v4l2_ctrl_handler_init(&info->handle, 6);
|
v4l2_ctrl_handler_init(&info->handle, 6);
|
||||||
|
|
||||||
info->auto_wb = v4l2_ctrl_new_std(&info->handle, &m5mols_ctrl_ops,
|
info->auto_wb = v4l2_ctrl_new_std_menu(&info->handle,
|
||||||
V4L2_CID_AUTO_WHITE_BALANCE, 0, 1, 1, 1);
|
&m5mols_ctrl_ops, V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE,
|
||||||
|
9, ~0x3fe, V4L2_WHITE_BALANCE_AUTO);
|
||||||
|
|
||||||
info->auto_exposure = v4l2_ctrl_new_std_menu(&info->handle,
|
info->auto_exposure = v4l2_ctrl_new_std_menu(&info->handle,
|
||||||
&m5mols_ctrl_ops, V4L2_CID_EXPOSURE_AUTO,
|
&m5mols_ctrl_ops, V4L2_CID_EXPOSURE_AUTO,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue