On 01/22/15 15:48, Laurent Pinchart wrote: > Only unsigned compound types are implemented so far, add the > corresponding signes types. > > Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> Acked-by: Hans Verkuil <hans.verkuil@xxxxxxxxx> Looks good! Hans > --- > .../DocBook/media/v4l/vidioc-g-ext-ctrls.xml | 21 +++++++++++++++ > .../DocBook/media/v4l/vidioc-queryctrl.xml | 30 ++++++++++++++++++++++ > drivers/media/v4l2-core/v4l2-ctrls.c | 30 ++++++++++++++++++++++ > include/media/v4l2-ctrls.h | 4 +++ > include/uapi/linux/videodev2.h | 6 +++++ > 5 files changed, 91 insertions(+) > > diff --git a/Documentation/DocBook/media/v4l/vidioc-g-ext-ctrls.xml b/Documentation/DocBook/media/v4l/vidioc-g-ext-ctrls.xml > index c5bdbfc..845087e 100644 > --- a/Documentation/DocBook/media/v4l/vidioc-g-ext-ctrls.xml > +++ b/Documentation/DocBook/media/v4l/vidioc-g-ext-ctrls.xml > @@ -186,6 +186,27 @@ type <constant>V4L2_CTRL_TYPE_STRING</constant>.</entry> > </row> > <row> > <entry></entry> > + <entry>__s8 *</entry> > + <entry><structfield>p_s8</structfield></entry> > + <entry>A pointer to a matrix control of signed 8-bit values. > +Valid if this control is of type <constant>V4L2_CTRL_TYPE_S8</constant>.</entry> > + </row> > + <row> > + <entry></entry> > + <entry>__s16 *</entry> > + <entry><structfield>p_s16</structfield></entry> > + <entry>A pointer to a matrix control of signed 16-bit values. > +Valid if this control is of type <constant>V4L2_CTRL_TYPE_S16</constant>.</entry> > + </row> > + <row> > + <entry></entry> > + <entry>__s32 *</entry> > + <entry><structfield>p_s32</structfield></entry> > + <entry>A pointer to a matrix control of signed 32-bit values. > +Valid if this control is of type <constant>V4L2_CTRL_TYPE_S32</constant>.</entry> > + </row> > + <row> > + <entry></entry> > <entry>__u8 *</entry> > <entry><structfield>p_u8</structfield></entry> > <entry>A pointer to a matrix control of unsigned 8-bit values. > diff --git a/Documentation/DocBook/media/v4l/vidioc-queryctrl.xml b/Documentation/DocBook/media/v4l/vidioc-queryctrl.xml > index 2bd98fd..293e225 100644 > --- a/Documentation/DocBook/media/v4l/vidioc-queryctrl.xml > +++ b/Documentation/DocBook/media/v4l/vidioc-queryctrl.xml > @@ -512,6 +512,36 @@ Older drivers which do not support this feature return an > &EINVAL;.</entry> > </row> > <row> > + <entry><constant>V4L2_CTRL_TYPE_S8</constant></entry> > + <entry>any</entry> > + <entry>any</entry> > + <entry>any</entry> > + <entry>A signed 8-bit valued control ranging from minimum to > +maximum inclusive. The step value indicates the increment between > +values which are actually different on the hardware. > +</entry> > + </row> > + <row> > + <entry><constant>V4L2_CTRL_TYPE_S16</constant></entry> > + <entry>any</entry> > + <entry>any</entry> > + <entry>any</entry> > + <entry>A signed 16-bit valued control ranging from minimum to > +maximum inclusive. The step value indicates the increment between > +values which are actually different on the hardware. > +</entry> > + </row> > + <row> > + <entry><constant>V4L2_CTRL_TYPE_S32</constant></entry> > + <entry>any</entry> > + <entry>any</entry> > + <entry>any</entry> > + <entry>A signed 32-bit valued control ranging from minimum to > +maximum inclusive. The step value indicates the increment between > +values which are actually different on the hardware. > +</entry> > + </row> > + <row> > <entry><constant>V4L2_CTRL_TYPE_U8</constant></entry> > <entry>any</entry> > <entry>any</entry> > diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c > index 45c5b47..301abb7 100644 > --- a/drivers/media/v4l2-core/v4l2-ctrls.c > +++ b/drivers/media/v4l2-core/v4l2-ctrls.c > @@ -1247,10 +1247,13 @@ static bool std_equal(const struct v4l2_ctrl *ctrl, u32 idx, > case V4L2_CTRL_TYPE_INTEGER64: > return ptr1.p_s64[idx] == ptr2.p_s64[idx]; > case V4L2_CTRL_TYPE_U8: > + case V4L2_CTRL_TYPE_S8: > return ptr1.p_u8[idx] == ptr2.p_u8[idx]; > case V4L2_CTRL_TYPE_U16: > + case V4L2_CTRL_TYPE_S16: > return ptr1.p_u16[idx] == ptr2.p_u16[idx]; > case V4L2_CTRL_TYPE_U32: > + case V4L2_CTRL_TYPE_S32: > return ptr1.p_u32[idx] == ptr2.p_u32[idx]; > default: > if (ctrl->is_int) > @@ -1280,12 +1283,15 @@ static void std_init(const struct v4l2_ctrl *ctrl, u32 idx, > ptr.p_s32[idx] = ctrl->default_value; > break; > case V4L2_CTRL_TYPE_U8: > + case V4L2_CTRL_TYPE_S8: > ptr.p_u8[idx] = ctrl->default_value; > break; > case V4L2_CTRL_TYPE_U16: > + case V4L2_CTRL_TYPE_S16: > ptr.p_u16[idx] = ctrl->default_value; > break; > case V4L2_CTRL_TYPE_U32: > + case V4L2_CTRL_TYPE_S32: > ptr.p_u32[idx] = ctrl->default_value; > break; > default: > @@ -1338,6 +1344,15 @@ static void std_log(const struct v4l2_ctrl *ctrl) > case V4L2_CTRL_TYPE_U32: > pr_cont("%u", (unsigned)*ptr.p_u32); > break; > + case V4L2_CTRL_TYPE_S8: > + pr_cont("%d", (int)*ptr.p_s8); > + break; > + case V4L2_CTRL_TYPE_S16: > + pr_cont("%d", (int)*ptr.p_s16); > + break; > + case V4L2_CTRL_TYPE_S32: > + pr_cont("%d", (int)*ptr.p_s32); > + break; > default: > pr_cont("unknown type %d", ctrl->type); > break; > @@ -1397,6 +1412,12 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx, > return ROUND_TO_RANGE(ptr.p_u16[idx], u16, ctrl); > case V4L2_CTRL_TYPE_U32: > return ROUND_TO_RANGE(ptr.p_u32[idx], u32, ctrl); > + case V4L2_CTRL_TYPE_S8: > + return ROUND_TO_RANGE(ptr.p_s8[idx], s8, ctrl); > + case V4L2_CTRL_TYPE_S16: > + return ROUND_TO_RANGE(ptr.p_s16[idx], s16, ctrl); > + case V4L2_CTRL_TYPE_S32: > + return ROUND_TO_RANGE(ptr.p_s32[idx], s32, ctrl); > > case V4L2_CTRL_TYPE_BOOLEAN: > ptr.p_s32[idx] = !!ptr.p_s32[idx]; > @@ -1630,6 +1651,9 @@ static int check_range(enum v4l2_ctrl_type type, > case V4L2_CTRL_TYPE_U8: > case V4L2_CTRL_TYPE_U16: > case V4L2_CTRL_TYPE_U32: > + case V4L2_CTRL_TYPE_S8: > + case V4L2_CTRL_TYPE_S16: > + case V4L2_CTRL_TYPE_S32: > case V4L2_CTRL_TYPE_INTEGER: > case V4L2_CTRL_TYPE_INTEGER64: > if (step == 0 || min > max || def < min || def > max) > @@ -1933,12 +1957,15 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, > elem_size = max + 1; > break; > case V4L2_CTRL_TYPE_U8: > + case V4L2_CTRL_TYPE_S8: > elem_size = sizeof(u8); > break; > case V4L2_CTRL_TYPE_U16: > + case V4L2_CTRL_TYPE_S16: > elem_size = sizeof(u16); > break; > case V4L2_CTRL_TYPE_U32: > + case V4L2_CTRL_TYPE_S32: > elem_size = sizeof(u32); > break; > default: > @@ -3312,6 +3339,9 @@ int __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl, > case V4L2_CTRL_TYPE_U8: > case V4L2_CTRL_TYPE_U16: > case V4L2_CTRL_TYPE_U32: > + case V4L2_CTRL_TYPE_S8: > + case V4L2_CTRL_TYPE_S16: > + case V4L2_CTRL_TYPE_S32: > if (ctrl->is_array) > return -EINVAL; > ret = check_range(ctrl->type, min, max, step, def); > diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h > index 911f3e5..e1cfb8f 100644 > --- a/include/media/v4l2-ctrls.h > +++ b/include/media/v4l2-ctrls.h > @@ -37,6 +37,8 @@ struct v4l2_fh; > struct poll_table_struct; > > /** union v4l2_ctrl_ptr - A pointer to a control value. > + * @p_s8: Pointer to a 8-bit signed value. > + * @p_s16: Pointer to a 16-bit signed value. > * @p_s32: Pointer to a 32-bit signed value. > * @p_s64: Pointer to a 64-bit signed value. > * @p_u8: Pointer to a 8-bit unsigned value. > @@ -46,6 +48,8 @@ struct poll_table_struct; > * @p: Pointer to a compound value. > */ > union v4l2_ctrl_ptr { > + s8 *p_s8; > + s16 *p_s16; > s32 *p_s32; > s64 *p_s64; > u8 *p_u8; > diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h > index fbdc360..9f51535 100644 > --- a/include/uapi/linux/videodev2.h > +++ b/include/uapi/linux/videodev2.h > @@ -1370,6 +1370,9 @@ struct v4l2_ext_control { > __u8 __user *p_u8; > __u16 __user *p_u16; > __u32 __user *p_u32; > + __s8 __user *p_s8; > + __s16 __user *p_s16; > + __s32 __user *p_s32; > void __user *ptr; > }; > } __attribute__ ((packed)); > @@ -1403,6 +1406,9 @@ enum v4l2_ctrl_type { > V4L2_CTRL_TYPE_U8 = 0x0100, > V4L2_CTRL_TYPE_U16 = 0x0101, > V4L2_CTRL_TYPE_U32 = 0x0102, > + V4L2_CTRL_TYPE_S8 = 0x0103, > + V4L2_CTRL_TYPE_S16 = 0x0104, > + V4L2_CTRL_TYPE_S32 = 0x0105, > }; > > /* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */ > -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html