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 <[email protected]>

Acked-by: Hans Verkuil <[email protected]>

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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to