[media] pwc: Read new preset values when changing awb control to a preset

So that events get generated for the new red + blue bal values when switching
to a preset. This allows apps to solely rely on events instead of needing
to do a query + g_ctrl on all controls when a control with the update flag
set is gets set or gets an event.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Hans de Goede 2011-10-09 17:22:00 -03:00 committed by Mauro Carvalho Chehab
parent c20d78cde3
commit 6807cfcb9d
1 changed files with 23 additions and 8 deletions

View File

@ -575,18 +575,14 @@ static int pwc_s_input(struct file *file, void *fh, unsigned int i)
return i ? -EINVAL : 0; return i ? -EINVAL : 0;
} }
static int pwc_g_volatile_ctrl(struct v4l2_ctrl *ctrl) static int pwc_g_volatile_ctrl_unlocked(struct v4l2_ctrl *ctrl)
{ {
struct pwc_device *pdev = struct pwc_device *pdev =
container_of(ctrl->handler, struct pwc_device, ctrl_handler); container_of(ctrl->handler, struct pwc_device, ctrl_handler);
int ret = 0; int ret = 0;
mutex_lock(&pdev->udevlock); if (!pdev->udev)
return -ENODEV;
if (!pdev->udev) {
ret = -ENODEV;
goto leave;
}
switch (ctrl->id) { switch (ctrl->id) {
case V4L2_CID_AUTO_WHITE_BALANCE: case V4L2_CID_AUTO_WHITE_BALANCE:
@ -651,7 +647,17 @@ static int pwc_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
if (ret) if (ret)
PWC_ERROR("g_ctrl %s error %d\n", ctrl->name, ret); PWC_ERROR("g_ctrl %s error %d\n", ctrl->name, ret);
leave: return ret;
}
static int pwc_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
{
struct pwc_device *pdev =
container_of(ctrl->handler, struct pwc_device, ctrl_handler);
int ret;
mutex_lock(&pdev->udevlock);
ret = pwc_g_volatile_ctrl_unlocked(ctrl);
mutex_unlock(&pdev->udevlock); mutex_unlock(&pdev->udevlock);
return ret; return ret;
} }
@ -669,6 +675,15 @@ static int pwc_set_awb(struct pwc_device *pdev)
if (pdev->auto_white_balance->val != awb_manual) if (pdev->auto_white_balance->val != awb_manual)
pdev->color_bal_valid = false; /* Force cache update */ pdev->color_bal_valid = false; /* Force cache update */
/*
* If this is a preset, update our red / blue balance values
* so that events get generated for the new preset values
*/
if (pdev->auto_white_balance->val == awb_indoor ||
pdev->auto_white_balance->val == awb_outdoor ||
pdev->auto_white_balance->val == awb_fl)
pwc_g_volatile_ctrl_unlocked(pdev->auto_white_balance);
} }
if (pdev->auto_white_balance->val != awb_manual) if (pdev->auto_white_balance->val != awb_manual)
return 0; return 0;