|
@@ -837,7 +837,17 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev,
|
|
|
|
|
|
for (i = 0; i < entity->ncontrols; ++i) {
|
|
for (i = 0; i < entity->ncontrols; ++i) {
|
|
ctrl = &entity->controls[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;
|
|
continue;
|
|
|
|
|
|
if (!rollback)
|
|
if (!rollback)
|
|
@@ -853,9 +863,6 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev,
|
|
uvc_ctrl_data(ctrl, UVC_CTRL_DATA_BACKUP),
|
|
uvc_ctrl_data(ctrl, UVC_CTRL_DATA_BACKUP),
|
|
ctrl->info->size);
|
|
ctrl->info->size);
|
|
|
|
|
|
- if ((ctrl->info->flags & UVC_CONTROL_GET_CUR) == 0)
|
|
|
|
- ctrl->loaded = 0;
|
|
|
|
-
|
|
|
|
ctrl->dirty = 0;
|
|
ctrl->dirty = 0;
|
|
|
|
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
@@ -913,8 +920,7 @@ int uvc_ctrl_get(struct uvc_video_device *video,
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
- if ((ctrl->info->flags & UVC_CONTROL_AUTO_UPDATE) == 0)
|
|
|
|
- ctrl->loaded = 1;
|
|
|
|
|
|
+ ctrl->loaded = 1;
|
|
}
|
|
}
|
|
|
|
|
|
xctrl->value = uvc_get_le_value(
|
|
xctrl->value = uvc_get_le_value(
|
|
@@ -965,8 +971,7 @@ int uvc_ctrl_set(struct uvc_video_device *video,
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
- if ((ctrl->info->flags & UVC_CONTROL_AUTO_UPDATE) == 0)
|
|
|
|
- ctrl->loaded = 1;
|
|
|
|
|
|
+ ctrl->loaded = 1;
|
|
}
|
|
}
|
|
|
|
|
|
if (!ctrl->dirty) {
|
|
if (!ctrl->dirty) {
|