Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6807cfcb authored by Hans de Goede's avatar Hans de Goede Committed by Mauro Carvalho Chehab
Browse files

[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: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent c20d78cd
Loading
Loading
Loading
Loading
+23 −8
Original line number Diff line number Diff line
@@ -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;