Skip to content

Commit

Permalink
V4L/DVB (9036): uvcvideo: Fix control cache access when setting compo…
Browse files Browse the repository at this point in the history
…site auto-update controls

Auto-update controls are never marked is loaded to prevent uvc_get_ctrl from
loading the control value from the cache. When setting a composite (mapped to
several V4L2 controls) auto-update UVC control, the driver updates the control
cache value before processing each V4L2 control, overwriting the previously
set V4L2 control.

This fixes the problem by marking all controls as loaded in uvc_set_ctrl
regardless of their type and resetting the loaded flag in uvc_commit_ctrl for
auto-update controls.

Signed-off-by: Laurent Pinchart <laurent.pinchart@skynet.be>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Laurent Pinchart authored and Mauro Carvalho Chehab committed Oct 12, 2008
1 parent 5e26d50 commit b1accfa
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions drivers/media/video/uvc/uvc_ctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -837,7 +837,17 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev,

for (i = 0; i < entity->ncontrols; ++i) {
ctrl = &entity->controls[i];
if (ctrl->info == NULL || !ctrl->dirty)
if (ctrl->info == NULL)
continue;

/* Reset the loaded flag for auto-update controls that were
* marked as loaded in uvc_ctrl_get/uvc_ctrl_set to prevent
* uvc_ctrl_get from using the cached value.
*/
if (ctrl->info->flags & UVC_CONTROL_AUTO_UPDATE)
ctrl->loaded = 0;

if (!ctrl->dirty)
continue;

if (!rollback)
Expand All @@ -853,9 +863,6 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev,
uvc_ctrl_data(ctrl, UVC_CTRL_DATA_BACKUP),
ctrl->info->size);

if ((ctrl->info->flags & UVC_CONTROL_GET_CUR) == 0)
ctrl->loaded = 0;

ctrl->dirty = 0;

if (ret < 0)
Expand Down Expand Up @@ -913,8 +920,7 @@ int uvc_ctrl_get(struct uvc_video_device *video,
if (ret < 0)
return ret;

if ((ctrl->info->flags & UVC_CONTROL_AUTO_UPDATE) == 0)
ctrl->loaded = 1;
ctrl->loaded = 1;
}

xctrl->value = uvc_get_le_value(
Expand Down Expand Up @@ -965,8 +971,7 @@ int uvc_ctrl_set(struct uvc_video_device *video,
return ret;
}

if ((ctrl->info->flags & UVC_CONTROL_AUTO_UPDATE) == 0)
ctrl->loaded = 1;
ctrl->loaded = 1;
}

if (!ctrl->dirty) {
Expand Down

0 comments on commit b1accfa

Please sign in to comment.