diff options
Diffstat (limited to 'drivers/media/video/v4l2-ctrls.c')
-rw-r--r-- | drivers/media/video/v4l2-ctrls.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/drivers/media/video/v4l2-ctrls.c b/drivers/media/video/v4l2-ctrls.c index 8f81efcfcf56..ef66d2af0c57 100644 --- a/drivers/media/video/v4l2-ctrls.c +++ b/drivers/media/video/v4l2-ctrls.c | |||
@@ -569,7 +569,7 @@ static int user_to_new(struct v4l2_ext_control *c, | |||
569 | int ret; | 569 | int ret; |
570 | u32 size; | 570 | u32 size; |
571 | 571 | ||
572 | ctrl->has_new = 1; | 572 | ctrl->is_new = 1; |
573 | switch (ctrl->type) { | 573 | switch (ctrl->type) { |
574 | case V4L2_CTRL_TYPE_INTEGER64: | 574 | case V4L2_CTRL_TYPE_INTEGER64: |
575 | ctrl->val64 = c->value64; | 575 | ctrl->val64 = c->value64; |
@@ -1280,8 +1280,12 @@ int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl) | |||
1280 | if (ctrl->done) | 1280 | if (ctrl->done) |
1281 | continue; | 1281 | continue; |
1282 | 1282 | ||
1283 | for (i = 0; i < master->ncontrols; i++) | 1283 | for (i = 0; i < master->ncontrols; i++) { |
1284 | cur_to_new(master->cluster[i]); | 1284 | if (master->cluster[i]) { |
1285 | cur_to_new(master->cluster[i]); | ||
1286 | master->cluster[i]->is_new = 1; | ||
1287 | } | ||
1288 | } | ||
1285 | 1289 | ||
1286 | /* Skip button controls and read-only controls. */ | 1290 | /* Skip button controls and read-only controls. */ |
1287 | if (ctrl->type == V4L2_CTRL_TYPE_BUTTON || | 1291 | if (ctrl->type == V4L2_CTRL_TYPE_BUTTON || |
@@ -1340,12 +1344,15 @@ int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc) | |||
1340 | 1344 | ||
1341 | ctrl = ref->ctrl; | 1345 | ctrl = ref->ctrl; |
1342 | memset(qc, 0, sizeof(*qc)); | 1346 | memset(qc, 0, sizeof(*qc)); |
1343 | qc->id = ctrl->id; | 1347 | if (id >= V4L2_CID_PRIVATE_BASE) |
1348 | qc->id = id; | ||
1349 | else | ||
1350 | qc->id = ctrl->id; | ||
1344 | strlcpy(qc->name, ctrl->name, sizeof(qc->name)); | 1351 | strlcpy(qc->name, ctrl->name, sizeof(qc->name)); |
1345 | qc->minimum = ctrl->minimum; | 1352 | qc->minimum = ctrl->minimum; |
1346 | qc->maximum = ctrl->maximum; | 1353 | qc->maximum = ctrl->maximum; |
1347 | qc->default_value = ctrl->default_value; | 1354 | qc->default_value = ctrl->default_value; |
1348 | if (qc->type == V4L2_CTRL_TYPE_MENU) | 1355 | if (ctrl->type == V4L2_CTRL_TYPE_MENU) |
1349 | qc->step = 1; | 1356 | qc->step = 1; |
1350 | else | 1357 | else |
1351 | qc->step = ctrl->step; | 1358 | qc->step = ctrl->step; |
@@ -1645,7 +1652,7 @@ static int try_or_set_control_cluster(struct v4l2_ctrl *master, bool set) | |||
1645 | if (ctrl == NULL) | 1652 | if (ctrl == NULL) |
1646 | continue; | 1653 | continue; |
1647 | 1654 | ||
1648 | if (ctrl->has_new) { | 1655 | if (ctrl->is_new) { |
1649 | /* Double check this: it may have changed since the | 1656 | /* Double check this: it may have changed since the |
1650 | last check in try_or_set_ext_ctrls(). */ | 1657 | last check in try_or_set_ext_ctrls(). */ |
1651 | if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)) | 1658 | if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)) |
@@ -1719,13 +1726,13 @@ static int try_or_set_ext_ctrls(struct v4l2_ctrl_handler *hdl, | |||
1719 | 1726 | ||
1720 | v4l2_ctrl_lock(ctrl); | 1727 | v4l2_ctrl_lock(ctrl); |
1721 | 1728 | ||
1722 | /* Reset the 'has_new' flags of the cluster */ | 1729 | /* Reset the 'is_new' flags of the cluster */ |
1723 | for (j = 0; j < master->ncontrols; j++) | 1730 | for (j = 0; j < master->ncontrols; j++) |
1724 | if (master->cluster[j]) | 1731 | if (master->cluster[j]) |
1725 | master->cluster[j]->has_new = 0; | 1732 | master->cluster[j]->is_new = 0; |
1726 | 1733 | ||
1727 | /* Copy the new caller-supplied control values. | 1734 | /* Copy the new caller-supplied control values. |
1728 | user_to_new() sets 'has_new' to 1. */ | 1735 | user_to_new() sets 'is_new' to 1. */ |
1729 | ret = cluster_walk(i, cs, helpers, user_to_new); | 1736 | ret = cluster_walk(i, cs, helpers, user_to_new); |
1730 | 1737 | ||
1731 | if (!ret) | 1738 | if (!ret) |
@@ -1820,15 +1827,18 @@ static int set_ctrl(struct v4l2_ctrl *ctrl, s32 *val) | |||
1820 | int ret; | 1827 | int ret; |
1821 | int i; | 1828 | int i; |
1822 | 1829 | ||
1830 | if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY) | ||
1831 | return -EACCES; | ||
1832 | |||
1823 | v4l2_ctrl_lock(ctrl); | 1833 | v4l2_ctrl_lock(ctrl); |
1824 | 1834 | ||
1825 | /* Reset the 'has_new' flags of the cluster */ | 1835 | /* Reset the 'is_new' flags of the cluster */ |
1826 | for (i = 0; i < master->ncontrols; i++) | 1836 | for (i = 0; i < master->ncontrols; i++) |
1827 | if (master->cluster[i]) | 1837 | if (master->cluster[i]) |
1828 | master->cluster[i]->has_new = 0; | 1838 | master->cluster[i]->is_new = 0; |
1829 | 1839 | ||
1830 | ctrl->val = *val; | 1840 | ctrl->val = *val; |
1831 | ctrl->has_new = 1; | 1841 | ctrl->is_new = 1; |
1832 | ret = try_or_set_control_cluster(master, false); | 1842 | ret = try_or_set_control_cluster(master, false); |
1833 | if (!ret) | 1843 | if (!ret) |
1834 | ret = try_or_set_control_cluster(master, true); | 1844 | ret = try_or_set_control_cluster(master, true); |