[media] v4l2-ctrls: add new bitmask control type
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Sakari Ailus <sakari.ailus@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
1de5be5e91
commit
fa4d7096d1
|
@ -105,6 +105,9 @@ int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl,
|
|||
menu_items[ctrl->value][0] == '\0')
|
||||
return -EINVAL;
|
||||
}
|
||||
if (qctrl->type == V4L2_CTRL_TYPE_BITMASK &&
|
||||
(ctrl->value & ~qctrl->maximum))
|
||||
return -ERANGE;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_ctrl_check);
|
||||
|
|
|
@ -805,6 +805,10 @@ static int validate_new_int(const struct v4l2_ctrl *ctrl, s32 *pval)
|
|||
return -EINVAL;
|
||||
return 0;
|
||||
|
||||
case V4L2_CTRL_TYPE_BITMASK:
|
||||
*pval &= ctrl->maximum;
|
||||
return 0;
|
||||
|
||||
case V4L2_CTRL_TYPE_BUTTON:
|
||||
case V4L2_CTRL_TYPE_CTRL_CLASS:
|
||||
*pval = 0;
|
||||
|
@ -825,6 +829,7 @@ static int validate_new(const struct v4l2_ctrl *ctrl, struct v4l2_ext_control *c
|
|||
case V4L2_CTRL_TYPE_INTEGER:
|
||||
case V4L2_CTRL_TYPE_BOOLEAN:
|
||||
case V4L2_CTRL_TYPE_MENU:
|
||||
case V4L2_CTRL_TYPE_BITMASK:
|
||||
case V4L2_CTRL_TYPE_BUTTON:
|
||||
case V4L2_CTRL_TYPE_CTRL_CLASS:
|
||||
return validate_new_int(ctrl, &c->value);
|
||||
|
@ -1063,13 +1068,17 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
|
|||
|
||||
/* Sanity checks */
|
||||
if (id == 0 || name == NULL || id >= V4L2_CID_PRIVATE_BASE ||
|
||||
max < min ||
|
||||
(type == V4L2_CTRL_TYPE_INTEGER && step == 0) ||
|
||||
(type == V4L2_CTRL_TYPE_BITMASK && max == 0) ||
|
||||
(type == V4L2_CTRL_TYPE_MENU && qmenu == NULL) ||
|
||||
(type == V4L2_CTRL_TYPE_STRING && max == 0)) {
|
||||
handler_set_err(hdl, -ERANGE);
|
||||
return NULL;
|
||||
}
|
||||
if (type != V4L2_CTRL_TYPE_BITMASK && max < min) {
|
||||
handler_set_err(hdl, -ERANGE);
|
||||
return NULL;
|
||||
}
|
||||
if ((type == V4L2_CTRL_TYPE_INTEGER ||
|
||||
type == V4L2_CTRL_TYPE_MENU ||
|
||||
type == V4L2_CTRL_TYPE_BOOLEAN) &&
|
||||
|
@ -1077,6 +1086,10 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
|
|||
handler_set_err(hdl, -ERANGE);
|
||||
return NULL;
|
||||
}
|
||||
if (type == V4L2_CTRL_TYPE_BITMASK && ((def & ~max) || min || step)) {
|
||||
handler_set_err(hdl, -ERANGE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (type == V4L2_CTRL_TYPE_BUTTON)
|
||||
flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
|
||||
|
@ -1357,6 +1370,9 @@ static void log_ctrl(const struct v4l2_ctrl *ctrl,
|
|||
case V4L2_CTRL_TYPE_MENU:
|
||||
printk(KERN_CONT "%s", ctrl->qmenu[ctrl->cur.val]);
|
||||
break;
|
||||
case V4L2_CTRL_TYPE_BITMASK:
|
||||
printk(KERN_CONT "0x%08x", ctrl->cur.val);
|
||||
break;
|
||||
case V4L2_CTRL_TYPE_INTEGER64:
|
||||
printk(KERN_CONT "%lld", ctrl->cur.val64);
|
||||
break;
|
||||
|
|
|
@ -1040,6 +1040,7 @@ enum v4l2_ctrl_type {
|
|||
V4L2_CTRL_TYPE_INTEGER64 = 5,
|
||||
V4L2_CTRL_TYPE_CTRL_CLASS = 6,
|
||||
V4L2_CTRL_TYPE_STRING = 7,
|
||||
V4L2_CTRL_TYPE_BITMASK = 8,
|
||||
};
|
||||
|
||||
/* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */
|
||||
|
|
Loading…
Reference in New Issue