diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-subdev.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-subdev.c | 33 | 
1 files changed, 22 insertions, 11 deletions
diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index 19a034e79be4..63596063b213 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -93,8 +93,7 @@ static int subdev_open(struct file *file)  err:  #if defined(CONFIG_MEDIA_CONTROLLER) -	if (entity) -		media_entity_put(entity); +	media_entity_put(entity);  #endif  	v4l2_fh_del(&subdev_fh->vfh);  	v4l2_fh_exit(&subdev_fh->vfh); @@ -262,7 +261,7 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)  		if (rval)  			return rval; -		return v4l2_subdev_call(sd, pad, get_fmt, subdev_fh, format); +		return v4l2_subdev_call(sd, pad, get_fmt, subdev_fh->pad, format);  	}  	case VIDIOC_SUBDEV_S_FMT: { @@ -272,7 +271,7 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)  		if (rval)  			return rval; -		return v4l2_subdev_call(sd, pad, set_fmt, subdev_fh, format); +		return v4l2_subdev_call(sd, pad, set_fmt, subdev_fh->pad, format);  	}  	case VIDIOC_SUBDEV_G_CROP: { @@ -289,7 +288,7 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)  		sel.target = V4L2_SEL_TGT_CROP;  		rval = v4l2_subdev_call( -			sd, pad, get_selection, subdev_fh, &sel); +			sd, pad, get_selection, subdev_fh->pad, &sel);  		crop->rect = sel.r; @@ -311,7 +310,7 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)  		sel.r = crop->rect;  		rval = v4l2_subdev_call( -			sd, pad, set_selection, subdev_fh, &sel); +			sd, pad, set_selection, subdev_fh->pad, &sel);  		crop->rect = sel.r; @@ -321,20 +320,28 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)  	case VIDIOC_SUBDEV_ENUM_MBUS_CODE: {  		struct v4l2_subdev_mbus_code_enum *code = arg; +		if (code->which != V4L2_SUBDEV_FORMAT_TRY && +		    code->which != V4L2_SUBDEV_FORMAT_ACTIVE) +			return -EINVAL; +  		if (code->pad >= sd->entity.num_pads)  			return -EINVAL; -		return v4l2_subdev_call(sd, pad, enum_mbus_code, subdev_fh, +		return v4l2_subdev_call(sd, pad, enum_mbus_code, subdev_fh->pad,  					code);  	}  	case VIDIOC_SUBDEV_ENUM_FRAME_SIZE: {  		struct v4l2_subdev_frame_size_enum *fse = arg; +		if (fse->which != V4L2_SUBDEV_FORMAT_TRY && +		    fse->which != V4L2_SUBDEV_FORMAT_ACTIVE) +			return -EINVAL; +  		if (fse->pad >= sd->entity.num_pads)  			return -EINVAL; -		return v4l2_subdev_call(sd, pad, enum_frame_size, subdev_fh, +		return v4l2_subdev_call(sd, pad, enum_frame_size, subdev_fh->pad,  					fse);  	} @@ -359,10 +366,14 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)  	case VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL: {  		struct v4l2_subdev_frame_interval_enum *fie = arg; +		if (fie->which != V4L2_SUBDEV_FORMAT_TRY && +		    fie->which != V4L2_SUBDEV_FORMAT_ACTIVE) +			return -EINVAL; +  		if (fie->pad >= sd->entity.num_pads)  			return -EINVAL; -		return v4l2_subdev_call(sd, pad, enum_frame_interval, subdev_fh, +		return v4l2_subdev_call(sd, pad, enum_frame_interval, subdev_fh->pad,  					fie);  	} @@ -374,7 +385,7 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)  			return rval;  		return v4l2_subdev_call( -			sd, pad, get_selection, subdev_fh, sel); +			sd, pad, get_selection, subdev_fh->pad, sel);  	}  	case VIDIOC_SUBDEV_S_SELECTION: { @@ -385,7 +396,7 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)  			return rval;  		return v4l2_subdev_call( -			sd, pad, set_selection, subdev_fh, sel); +			sd, pad, set_selection, subdev_fh->pad, sel);  	}  	case VIDIOC_G_EDID: {  |