Re: [PATCH v3] media: v4l: ctrls: Add debug messages

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 7/19/19 11:53 PM, Ezequiel Garcia wrote:
> On Thu, 2019-06-27 at 09:38 +0200, Hans Verkuil wrote:
>> Hi Ezequiel,
>>
>> 'checkpatch.pl --strict' finds way too many issues.
>>
>> I'm pretty certain you didn't run it.
>>
> 
> Shame on me, I did run it and skipped fixing the long lines :-(
> 
>> Please fix the issues and post a v4.
>>
>> A lot (but not all) of the warnings report lines that are too long
>> and from what I can see most are easily fixed without reducing
>> readability.
>>
> 
> I have fixed all the long lines. IMHO, the remaining warnings
> are not worth fixing:
> 
> CHECK: Macro argument reuse 'vdev' - possible side-effects?
> #77: FILE: drivers/media/v4l2-core/v4l2-ctrls.c:21:
> +#define dprintk(vdev, fmt, arg...) do {					\
> +	if (!WARN_ON(!vdev) && ((vdev)->dev_debug & V4L2_DEV_DEBUG_CTRL)) \
> +		printk(KERN_DEBUG pr_fmt("%s: %s: " fmt),		\
> +		       __func__, video_device_node_name(vdev), ##arg);	\
> +} while (0)

You really need to use 'if (!WARN_ON(!(vdev)) &&' here. It is a little thing that
simply makes the code more robust.

> 
> CHECK: Macro argument 'vdev' may be better as '(vdev)' to avoid precedence issues
> #77: FILE: drivers/media/v4l2-core/v4l2-ctrls.c:21:
> +#define dprintk(vdev, fmt, arg...) do {					\
> +	if (!WARN_ON(!vdev) && ((vdev)->dev_debug & V4L2_DEV_DEBUG_CTRL)) \
> +		printk(KERN_DEBUG pr_fmt("%s: %s: " fmt),		\
> +		       __func__, video_device_node_name(vdev), ##arg);	\
> +} while (0)
> 
> WARNING: Prefer [subsystem eg: netdev]_dbg([subsystem]dev, ... then dev_dbg(dev, ... then pr_debug(...  to printk(KERN_DEBUG ...
> #79: FILE: drivers/media/v4l2-core/v4l2-ctrls.c:23:
> +		printk(KERN_DEBUG pr_fmt("%s: %s: " fmt),		\
> 
> CHECK: Comparison to NULL could be written "!ref"
> #116: FILE: drivers/media/v4l2-core/v4l2-ctrls.c:3255:
> +		if (ref == NULL) {
> 
> CHECK: Comparison to NULL could be written "!hdl"
> #249: FILE: drivers/media/v4l2-core/v4l2-ctrls.c:3730:
> +	if (hdl == NULL) {
> 
> I believe the dprintk macro is OK as-is. We use printk KERN_DEBUG because
> we already have a parameter guarding it. This is consistent
> with the v4l2 way.
> 
> The NULL comparison warning is valid, but it was already
> like this before. I'd rather not change existing code.
> 
> I'll post a v4.

Skipping the other warnings is OK, but the first really needs to be addressed.
So we need a v5, I'm afraid.

Regards,

	Hans

> 
> Ezequiel
> 
>> Regards,
>>
>> 	Hans
>>
>> On 6/22/19 12:28 PM, Ezequiel Garcia wrote:
>>> Currently, the v4l2 control code is a bit silent on errors.
>>> Add debug messages on (hopefully) most of the error paths.
>>>
>>> Signed-off-by: Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx>
>>> ---
>>> Changes from v2:
>>> * Check and noisy-warn if vdev is NULL.
>>>
>>> Changes from v1:
>>> * Drop changes in the debug parameter semantics.
>>> * Drop new module debug parameter.
>>> * Add documentation.
>>> * Add a debug error in all places where control can fail.
>>> * Reorder the vdev parameter, to make the patch less invasive.
>>> ---
>>>  Documentation/media/kapi/v4l2-dev.rst      |   1 +
>>>  drivers/media/platform/omap3isp/ispvideo.c |   2 +-
>>>  drivers/media/v4l2-core/v4l2-ctrls.c       | 106 ++++++++++++++++-----
>>>  drivers/media/v4l2-core/v4l2-ioctl.c       |  12 +--
>>>  drivers/media/v4l2-core/v4l2-subdev.c      |   6 +-
>>>  include/media/v4l2-ctrls.h                 |   9 +-
>>>  include/media/v4l2-ioctl.h                 |   2 +
>>>  7 files changed, 100 insertions(+), 38 deletions(-)
>>>
>>> diff --git a/Documentation/media/kapi/v4l2-dev.rst b/Documentation/media/kapi/v4l2-dev.rst
>>> index b359f1804bbe..4c5a15c53dbf 100644
>>> --- a/Documentation/media/kapi/v4l2-dev.rst
>>> +++ b/Documentation/media/kapi/v4l2-dev.rst
>>> @@ -288,6 +288,7 @@ Mask  Description
>>>  0x08  Log the read and write file operations and the VIDIOC_QBUF and
>>>        VIDIOC_DQBUF ioctls.
>>>  0x10  Log the poll file operation.
>>> +0x20  Log error and messages in the control operations.
>>>  ===== ================================================================
>>>  
>>>  Video device cleanup
>>> diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c
>>> index 175bbed9a235..abc945cc05c9 100644
>>> --- a/drivers/media/platform/omap3isp/ispvideo.c
>>> +++ b/drivers/media/platform/omap3isp/ispvideo.c
>>> @@ -1028,7 +1028,7 @@ static int isp_video_check_external_subdevs(struct isp_video *video,
>>>  	ctrls.count = 1;
>>>  	ctrls.controls = &ctrl;
>>>  
>>> -	ret = v4l2_g_ext_ctrls(pipe->external->ctrl_handler, NULL, &ctrls);
>>> +	ret = v4l2_g_ext_ctrls(pipe->external->ctrl_handler, &video->video, NULL, &ctrls);
>>>  	if (ret < 0) {
>>>  		dev_warn(isp->dev, "no pixel rate control in subdev %s\n",
>>>  			 pipe->external->name);
>>> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
>>> index 2d7525e2d9eb..1c8ae4501870 100644
>>> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
>>> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
>>> @@ -6,6 +6,8 @@
>>>  
>>>   */
>>>  
>>> +#define pr_fmt(fmt) "v4l2-ctrls: " fmt
>>> +
>>>  #include <linux/ctype.h>
>>>  #include <linux/mm.h>
>>>  #include <linux/slab.h>
>>> @@ -16,6 +18,12 @@
>>>  #include <media/v4l2-event.h>
>>>  #include <media/v4l2-dev.h>
>>>  
>>> +#define dprintk(vdev, fmt, arg...) do {					\
>>> +	if (!WARN_ON(!vdev) && ((vdev)->dev_debug & V4L2_DEV_DEBUG_CTRL)) \
>>> +		printk(KERN_DEBUG pr_fmt("%s: %s: " fmt),		\
>>> +		       __func__, video_device_node_name(vdev), ##arg);	\
>>> +} while (0)
>>> +
>>>  #define has_op(master, op) \
>>>  	(master->ops && master->ops->op)
>>>  #define call_op(master, op) \
>>> @@ -3211,6 +3219,7 @@ static int v4l2_ctrl_request_bind(struct media_request *req,
>>>  static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
>>>  			     struct v4l2_ext_controls *cs,
>>>  			     struct v4l2_ctrl_helper *helpers,
>>> +			     struct video_device *vdev,
>>>  			     bool get)
>>>  {
>>>  	struct v4l2_ctrl_helper *h;
>>> @@ -3228,20 +3237,28 @@ static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
>>>  		if (cs->which &&
>>>  		    cs->which != V4L2_CTRL_WHICH_DEF_VAL &&
>>>  		    cs->which != V4L2_CTRL_WHICH_REQUEST_VAL &&
>>> -		    V4L2_CTRL_ID2WHICH(id) != cs->which)
>>> +		    V4L2_CTRL_ID2WHICH(id) != cs->which) {
>>> +			dprintk(vdev, "invalid which 0x%x or control id 0x%x\n", cs->which, id);
>>>  			return -EINVAL;
>>> +		}
>>>  
>>>  		/* Old-style private controls are not allowed for
>>>  		   extended controls */
>>> -		if (id >= V4L2_CID_PRIVATE_BASE)
>>> +		if (id >= V4L2_CID_PRIVATE_BASE) {
>>> +			dprintk(vdev, "old-style private controls not allowed for extended controls\n");
>>>  			return -EINVAL;
>>> +		}
>>>  		ref = find_ref_lock(hdl, id);
>>> -		if (ref == NULL)
>>> +		if (ref == NULL) {
>>> +			dprintk(vdev, "cannot find control id 0x%x\n", id);
>>>  			return -EINVAL;
>>> +		}
>>>  		h->ref = ref;
>>>  		ctrl = ref->ctrl;
>>> -		if (ctrl->flags & V4L2_CTRL_FLAG_DISABLED)
>>> +		if (ctrl->flags & V4L2_CTRL_FLAG_DISABLED) {
>>> +			dprintk(vdev, "control id 0x%x is disabled\n", id);
>>>  			return -EINVAL;
>>> +		}
>>>  
>>>  		if (ctrl->cluster[0]->ncontrols > 1)
>>>  			have_clusters = true;
>>> @@ -3251,10 +3268,16 @@ static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
>>>  			unsigned tot_size = ctrl->elems * ctrl->elem_size;
>>>  
>>>  			if (c->size < tot_size) {
>>> +				/*
>>> +				 * In the get case the application first queries
>>> +				 * to obtain the size of the control.
>>> +				 */
>>>  				if (get) {
>>>  					c->size = tot_size;
>>>  					return -ENOSPC;
>>>  				}
>>> +				dprintk(vdev, "pointer control id 0x%x size too small, %d bytes but %d bytes needed\n",
>>> +					id, c->size, tot_size);
>>>  				return -EFAULT;
>>>  			}
>>>  			c->size = tot_size;
>>> @@ -3315,7 +3338,8 @@ static int class_check(struct v4l2_ctrl_handler *hdl, u32 which)
>>>  
>>>  /* Get extended controls. Allocates the helpers array if needed. */
>>>  static int v4l2_g_ext_ctrls_common(struct v4l2_ctrl_handler *hdl,
>>> -				   struct v4l2_ext_controls *cs)
>>> +				   struct v4l2_ext_controls *cs,
>>> +				   struct video_device *vdev)
>>>  {
>>>  	struct v4l2_ctrl_helper helper[4];
>>>  	struct v4l2_ctrl_helper *helpers = helper;
>>> @@ -3341,7 +3365,7 @@ static int v4l2_g_ext_ctrls_common(struct v4l2_ctrl_handler *hdl,
>>>  			return -ENOMEM;
>>>  	}
>>>  
>>> -	ret = prepare_ext_ctrls(hdl, cs, helpers, true);
>>> +	ret = prepare_ext_ctrls(hdl, cs, helpers, vdev, true);
>>>  	cs->error_idx = cs->count;
>>>  
>>>  	for (i = 0; !ret && i < cs->count; i++)
>>> @@ -3434,8 +3458,8 @@ v4l2_ctrls_find_req_obj(struct v4l2_ctrl_handler *hdl,
>>>  	return obj;
>>>  }
>>>  
>>> -int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct media_device *mdev,
>>> -		     struct v4l2_ext_controls *cs)
>>> +int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct video_device *vdev,
>>> +		     struct media_device *mdev, struct v4l2_ext_controls *cs)
>>>  {
>>>  	struct media_request_object *obj = NULL;
>>>  	struct media_request *req = NULL;
>>> @@ -3471,7 +3495,7 @@ int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct media_device *mdev,
>>>  				   req_obj);
>>>  	}
>>>  
>>> -	ret = v4l2_g_ext_ctrls_common(hdl, cs);
>>> +	ret = v4l2_g_ext_ctrls_common(hdl, cs, vdev);
>>>  
>>>  	if (obj) {
>>>  		media_request_unlock_for_access(req);
>>> @@ -3614,7 +3638,9 @@ static int try_or_set_cluster(struct v4l2_fh *fh, struct v4l2_ctrl *master,
>>>  
>>>  /* Validate controls. */
>>>  static int validate_ctrls(struct v4l2_ext_controls *cs,
>>> -			  struct v4l2_ctrl_helper *helpers, bool set)
>>> +			  struct v4l2_ctrl_helper *helpers,
>>> +			  struct video_device *vdev,
>>> +			  bool set)
>>>  {
>>>  	unsigned i;
>>>  	int ret = 0;
>>> @@ -3626,16 +3652,20 @@ static int validate_ctrls(struct v4l2_ext_controls *cs,
>>>  
>>>  		cs->error_idx = i;
>>>  
>>> -		if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
>>> +		if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY) {
>>> +			dprintk(vdev, "control id 0x%x is read-only\n", ctrl->id);
>>>  			return -EACCES;
>>> +		}
>>>  		/* This test is also done in try_set_control_cluster() which
>>>  		   is called in atomic context, so that has the final say,
>>>  		   but it makes sense to do an up-front check as well. Once
>>>  		   an error occurs in try_set_control_cluster() some other
>>>  		   controls may have been set already and we want to do a
>>>  		   best-effort to avoid that. */
>>> -		if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED))
>>> +		if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)) {
>>> +			dprintk(vdev, "control id 0x%x is grabbed, cannot set\n", ctrl->id);
>>>  			return -EBUSY;
>>> +		}
>>>  		/*
>>>  		 * Skip validation for now if the payload needs to be copied
>>>  		 * from userspace into kernelspace. We'll validate those later.
>>> @@ -3670,7 +3700,8 @@ static void update_from_auto_cluster(struct v4l2_ctrl *master)
>>>  /* Try or try-and-set controls */
>>>  static int try_set_ext_ctrls_common(struct v4l2_fh *fh,
>>>  				    struct v4l2_ctrl_handler *hdl,
>>> -				    struct v4l2_ext_controls *cs, bool set)
>>> +				    struct v4l2_ext_controls *cs,
>>> +				    struct video_device *vdev, bool set)
>>>  {
>>>  	struct v4l2_ctrl_helper helper[4];
>>>  	struct v4l2_ctrl_helper *helpers = helper;
>>> @@ -3680,13 +3711,17 @@ static int try_set_ext_ctrls_common(struct v4l2_fh *fh,
>>>  	cs->error_idx = cs->count;
>>>  
>>>  	/* Default value cannot be changed */
>>> -	if (cs->which == V4L2_CTRL_WHICH_DEF_VAL)
>>> +	if (cs->which == V4L2_CTRL_WHICH_DEF_VAL) {
>>> +		dprintk(vdev, "%s: cannot change default value\n", video_device_node_name(vdev));
>>>  		return -EINVAL;
>>> +	}
>>>  
>>>  	cs->which = V4L2_CTRL_ID2WHICH(cs->which);
>>>  
>>> -	if (hdl == NULL)
>>> +	if (hdl == NULL) {
>>> +		dprintk(vdev, "%s: invalid null control handler\n", video_device_node_name(vdev));
>>>  		return -EINVAL;
>>> +	}
>>>  
>>>  	if (cs->count == 0)
>>>  		return class_check(hdl, cs->which);
>>> @@ -3697,9 +3732,9 @@ static int try_set_ext_ctrls_common(struct v4l2_fh *fh,
>>>  		if (!helpers)
>>>  			return -ENOMEM;
>>>  	}
>>> -	ret = prepare_ext_ctrls(hdl, cs, helpers, false);
>>> +	ret = prepare_ext_ctrls(hdl, cs, helpers, vdev, false);
>>>  	if (!ret)
>>> -		ret = validate_ctrls(cs, helpers, set);
>>> +		ret = validate_ctrls(cs, helpers, vdev, set);
>>>  	if (ret && set)
>>>  		cs->error_idx = cs->count;
>>>  	for (i = 0; !ret && i < cs->count; i++) {
>>> @@ -3784,7 +3819,8 @@ static int try_set_ext_ctrls_common(struct v4l2_fh *fh,
>>>  }
>>>  
>>>  static int try_set_ext_ctrls(struct v4l2_fh *fh,
>>> -			     struct v4l2_ctrl_handler *hdl, struct media_device *mdev,
>>> +			     struct v4l2_ctrl_handler *hdl,
>>> +			     struct video_device *vdev, struct media_device *mdev,
>>>  			     struct v4l2_ext_controls *cs, bool set)
>>>  {
>>>  	struct media_request_object *obj = NULL;
>>> @@ -3792,21 +3828,32 @@ static int try_set_ext_ctrls(struct v4l2_fh *fh,
>>>  	int ret;
>>>  
>>>  	if (cs->which == V4L2_CTRL_WHICH_REQUEST_VAL) {
>>> -		if (!mdev || cs->request_fd < 0)
>>> +		if (!mdev) {
>>> +			dprintk(vdev, "%s: missing media device\n", video_device_node_name(vdev));
>>> +			return -EINVAL;
>>> +		}
>>> +
>>> +		if (cs->request_fd < 0) {
>>> +			dprintk(vdev, "%s: invalid request fd %d\n", video_device_node_name(vdev), cs->request_fd);
>>>  			return -EINVAL;
>>> +		}
>>>  
>>>  		req = media_request_get_by_fd(mdev, cs->request_fd);
>>> -		if (IS_ERR(req))
>>> +		if (IS_ERR(req)) {
>>> +			dprintk(vdev, "%s: cannot find request fd %d\n", video_device_node_name(vdev), cs->request_fd);
>>>  			return PTR_ERR(req);
>>> +		}
>>>  
>>>  		ret = media_request_lock_for_update(req);
>>>  		if (ret) {
>>> +			dprintk(vdev, "%s: cannot lock request fd %d\n", video_device_node_name(vdev), cs->request_fd);
>>>  			media_request_put(req);
>>>  			return ret;
>>>  		}
>>>  
>>>  		obj = v4l2_ctrls_find_req_obj(hdl, req, set);
>>>  		if (IS_ERR(obj)) {
>>> +			dprintk(vdev, "%s: cannot find request object for request fd %d\n", video_device_node_name(vdev), cs->request_fd);
>>>  			media_request_unlock_for_update(req);
>>>  			media_request_put(req);
>>>  			return PTR_ERR(obj);
>>> @@ -3815,7 +3862,9 @@ static int try_set_ext_ctrls(struct v4l2_fh *fh,
>>>  				   req_obj);
>>>  	}
>>>  
>>> -	ret = try_set_ext_ctrls_common(fh, hdl, cs, set);
>>> +	ret = try_set_ext_ctrls_common(fh, hdl, cs, vdev, set);
>>> +	if (ret)
>>> +		dprintk(vdev, "%s: try_set_ext_ctrls_common failed (%d)\n", video_device_node_name(vdev), ret);
>>>  
>>>  	if (obj) {
>>>  		media_request_unlock_for_update(req);
>>> @@ -3826,17 +3875,22 @@ static int try_set_ext_ctrls(struct v4l2_fh *fh,
>>>  	return ret;
>>>  }
>>>  
>>> -int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct media_device *mdev,
>>> +int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl,
>>> +		       struct video_device *vdev,
>>> +		       struct media_device *mdev,
>>>  		       struct v4l2_ext_controls *cs)
>>>  {
>>> -	return try_set_ext_ctrls(NULL, hdl, mdev, cs, false);
>>> +	return try_set_ext_ctrls(NULL, hdl, vdev, mdev, cs, false);
>>>  }
>>>  EXPORT_SYMBOL(v4l2_try_ext_ctrls);
>>>  
>>> -int v4l2_s_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
>>> -		     struct media_device *mdev, struct v4l2_ext_controls *cs)
>>> +int v4l2_s_ext_ctrls(struct v4l2_fh *fh,
>>> +		     struct v4l2_ctrl_handler *hdl,
>>> +		     struct video_device *vdev,
>>> +		     struct media_device *mdev,
>>> +		     struct v4l2_ext_controls *cs)
>>>  {
>>> -	return try_set_ext_ctrls(fh, hdl, mdev, cs, true);
>>> +	return try_set_ext_ctrls(fh, hdl, vdev, mdev, cs, true);
>>>  }
>>>  EXPORT_SYMBOL(v4l2_s_ext_ctrls);
>>>  
>>> diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
>>> index b1f4b991dba6..e95efea1a9ca 100644
>>> --- a/drivers/media/v4l2-core/v4l2-ioctl.c
>>> +++ b/drivers/media/v4l2-core/v4l2-ioctl.c
>>> @@ -2165,9 +2165,9 @@ static int v4l_g_ext_ctrls(const struct v4l2_ioctl_ops *ops,
>>>  
>>>  	p->error_idx = p->count;
>>>  	if (vfh && vfh->ctrl_handler)
>>> -		return v4l2_g_ext_ctrls(vfh->ctrl_handler, vfd->v4l2_dev->mdev, p);
>>> +		return v4l2_g_ext_ctrls(vfh->ctrl_handler, vfd, vfd->v4l2_dev->mdev, p);
>>>  	if (vfd->ctrl_handler)
>>> -		return v4l2_g_ext_ctrls(vfd->ctrl_handler, vfd->v4l2_dev->mdev, p);
>>> +		return v4l2_g_ext_ctrls(vfd->ctrl_handler, vfd, vfd->v4l2_dev->mdev, p);
>>>  	if (ops->vidioc_g_ext_ctrls == NULL)
>>>  		return -ENOTTY;
>>>  	return check_ext_ctrls(p, 0) ? ops->vidioc_g_ext_ctrls(file, fh, p) :
>>> @@ -2184,9 +2184,9 @@ static int v4l_s_ext_ctrls(const struct v4l2_ioctl_ops *ops,
>>>  
>>>  	p->error_idx = p->count;
>>>  	if (vfh && vfh->ctrl_handler)
>>> -		return v4l2_s_ext_ctrls(vfh, vfh->ctrl_handler, vfd->v4l2_dev->mdev, p);
>>> +		return v4l2_s_ext_ctrls(vfh, vfh->ctrl_handler, vfd, vfd->v4l2_dev->mdev, p);
>>>  	if (vfd->ctrl_handler)
>>> -		return v4l2_s_ext_ctrls(NULL, vfd->ctrl_handler, vfd->v4l2_dev->mdev, p);
>>> +		return v4l2_s_ext_ctrls(NULL, vfd->ctrl_handler, vfd, vfd->v4l2_dev->mdev, p);
>>>  	if (ops->vidioc_s_ext_ctrls == NULL)
>>>  		return -ENOTTY;
>>>  	return check_ext_ctrls(p, 0) ? ops->vidioc_s_ext_ctrls(file, fh, p) :
>>> @@ -2203,9 +2203,9 @@ static int v4l_try_ext_ctrls(const struct v4l2_ioctl_ops *ops,
>>>  
>>>  	p->error_idx = p->count;
>>>  	if (vfh && vfh->ctrl_handler)
>>> -		return v4l2_try_ext_ctrls(vfh->ctrl_handler, vfd->v4l2_dev->mdev, p);
>>> +		return v4l2_try_ext_ctrls(vfh->ctrl_handler, vfd, vfd->v4l2_dev->mdev, p);
>>>  	if (vfd->ctrl_handler)
>>> -		return v4l2_try_ext_ctrls(vfd->ctrl_handler, vfd->v4l2_dev->mdev, p);
>>> +		return v4l2_try_ext_ctrls(vfd->ctrl_handler, vfd, vfd->v4l2_dev->mdev, p);
>>>  	if (ops->vidioc_try_ext_ctrls == NULL)
>>>  		return -ENOTTY;
>>>  	return check_ext_ctrls(p, 0) ? ops->vidioc_try_ext_ctrls(file, fh, p) :
>>> diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
>>> index f24978b80440..1b5edd3b1e6c 100644
>>> --- a/drivers/media/v4l2-core/v4l2-subdev.c
>>> +++ b/drivers/media/v4l2-core/v4l2-subdev.c
>>> @@ -211,19 +211,19 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)
>>>  		if (!vfh->ctrl_handler)
>>>  			return -ENOTTY;
>>>  		return v4l2_g_ext_ctrls(vfh->ctrl_handler,
>>> -					sd->v4l2_dev->mdev, arg);
>>> +					vdev, sd->v4l2_dev->mdev, arg);
>>>  
>>>  	case VIDIOC_S_EXT_CTRLS:
>>>  		if (!vfh->ctrl_handler)
>>>  			return -ENOTTY;
>>>  		return v4l2_s_ext_ctrls(vfh, vfh->ctrl_handler,
>>> -					sd->v4l2_dev->mdev, arg);
>>> +					vdev, sd->v4l2_dev->mdev, arg);
>>>  
>>>  	case VIDIOC_TRY_EXT_CTRLS:
>>>  		if (!vfh->ctrl_handler)
>>>  			return -ENOTTY;
>>>  		return v4l2_try_ext_ctrls(vfh->ctrl_handler,
>>> -					  sd->v4l2_dev->mdev, arg);
>>> +					  vdev, sd->v4l2_dev->mdev, arg);
>>>  
>>>  	case VIDIOC_DQEVENT:
>>>  		if (!(sd->flags & V4L2_SUBDEV_FL_HAS_EVENTS))
>>> diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
>>> index b4433483af23..c08d6cc56743 100644
>>> --- a/include/media/v4l2-ctrls.h
>>> +++ b/include/media/v4l2-ctrls.h
>>> @@ -1265,25 +1265,28 @@ int v4l2_s_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
>>>   *	:ref:`VIDIOC_G_EXT_CTRLS <vidioc_g_ext_ctrls>` ioctl
>>>   *
>>>   * @hdl: pointer to &struct v4l2_ctrl_handler
>>> + * @vdev: pointer to &struct video_device
>>>   * @mdev: pointer to &struct media_device
>>>   * @c: pointer to &struct v4l2_ext_controls
>>>   *
>>>   * If hdl == NULL then they will all return -EINVAL.
>>>   */
>>> -int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct media_device *mdev,
>>> -		     struct v4l2_ext_controls *c);
>>> +int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct video_device *vdev,
>>> +		     struct media_device *mdev, struct v4l2_ext_controls *c);
>>>  
>>>  /**
>>>   * v4l2_try_ext_ctrls - Helper function to implement
>>>   *	:ref:`VIDIOC_TRY_EXT_CTRLS <vidioc_g_ext_ctrls>` ioctl
>>>   *
>>>   * @hdl: pointer to &struct v4l2_ctrl_handler
>>> + * @vdev: pointer to &struct video_device
>>>   * @mdev: pointer to &struct media_device
>>>   * @c: pointer to &struct v4l2_ext_controls
>>>   *
>>>   * If hdl == NULL then they will all return -EINVAL.
>>>   */
>>>  int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl,
>>> +		       struct video_device *vdev,
>>>  		       struct media_device *mdev,
>>>  		       struct v4l2_ext_controls *c);
>>>  
>>> @@ -1293,12 +1296,14 @@ int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl,
>>>   *
>>>   * @fh: pointer to &struct v4l2_fh
>>>   * @hdl: pointer to &struct v4l2_ctrl_handler
>>> + * @vdev: pointer to &struct video_device
>>>   * @mdev: pointer to &struct media_device
>>>   * @c: pointer to &struct v4l2_ext_controls
>>>   *
>>>   * If hdl == NULL then they will all return -EINVAL.
>>>   */
>>>  int v4l2_s_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
>>> +		     struct video_device *vdev,
>>>  		     struct media_device *mdev,
>>>  		     struct v4l2_ext_controls *c);
>>>  
>>> diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h
>>> index 400f2e46c108..4bba65a59d46 100644
>>> --- a/include/media/v4l2-ioctl.h
>>> +++ b/include/media/v4l2-ioctl.h
>>> @@ -602,6 +602,8 @@ struct v4l2_ioctl_ops {
>>>  #define V4L2_DEV_DEBUG_STREAMING	0x08
>>>  /* Log poll() */
>>>  #define V4L2_DEV_DEBUG_POLL		0x10
>>> +/* Log controls */
>>> +#define V4L2_DEV_DEBUG_CTRL		0x20
>>>  
>>>  /*  Video standard functions  */
>>>  
>>>
> 
> 




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux