Commit 0245abf8 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

media: v4l2-ctrls.c: fix broken auto cluster handling

When you switch from auto to manual mode for an auto-cluster (e.g.
autogain+gain controls), then the current HW value has to be copied
to the current control value. However, has_changed was never set to
true, so new_to_cur didn't actually copy this value.
Reported-by: default avatarHugues FRUCHET <hugues.fruchet@st.com>
Tested-by: default avatarHugues FRUCHET <hugues.fruchet@st.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 662a99e1
...@@ -3137,9 +3137,22 @@ static int try_or_set_cluster(struct v4l2_fh *fh, struct v4l2_ctrl *master, ...@@ -3137,9 +3137,22 @@ static int try_or_set_cluster(struct v4l2_fh *fh, struct v4l2_ctrl *master,
/* If OK, then make the new values permanent. */ /* If OK, then make the new values permanent. */
update_flag = is_cur_manual(master) != is_new_manual(master); update_flag = is_cur_manual(master) != is_new_manual(master);
for (i = 0; i < master->ncontrols; i++)
for (i = 0; i < master->ncontrols; i++) {
/*
* If we switch from auto to manual mode, and this cluster
* contains volatile controls, then all non-master controls
* have to be marked as changed. The 'new' value contains
* the volatile value (obtained by update_from_auto_cluster),
* which now has to become the current value.
*/
if (i && update_flag && is_new_manual(master) &&
master->has_volatiles && master->cluster[i])
master->cluster[i]->has_changed = true;
new_to_cur(fh, master->cluster[i], ch_flags | new_to_cur(fh, master->cluster[i], ch_flags |
((update_flag && i > 0) ? V4L2_EVENT_CTRL_CH_FLAGS : 0)); ((update_flag && i > 0) ? V4L2_EVENT_CTRL_CH_FLAGS : 0));
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment