OSDN Git Service

[media] pwc: Read new preset values when changing awb control to a preset
authorHans de Goede <hdegoede@redhat.com>
Sun, 9 Oct 2011 20:22:00 +0000 (17:22 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 6 Jan 2012 12:44:42 +0000 (10:44 -0200)
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>
drivers/media/video/pwc/pwc-v4l.c

index 97e8d62..566b09c 100644 (file)
@@ -575,18 +575,14 @@ static int pwc_s_input(struct file *file, void *fh, unsigned int i)
        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 =
                container_of(ctrl->handler, struct pwc_device, ctrl_handler);
        int ret = 0;
 
-       mutex_lock(&pdev->udevlock);
-
-       if (!pdev->udev) {
-               ret = -ENODEV;
-               goto leave;
-       }
+       if (!pdev->udev)
+               return -ENODEV;
 
        switch (ctrl->id) {
        case V4L2_CID_AUTO_WHITE_BALANCE:
@@ -651,7 +647,17 @@ static int pwc_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
        if (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);
        return ret;
 }
@@ -669,6 +675,15 @@ static int pwc_set_awb(struct pwc_device *pdev)
 
                if (pdev->auto_white_balance->val != awb_manual)
                        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)
                return 0;