diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-ioctl.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-ioctl.c | 31 | 
1 files changed, 30 insertions, 1 deletions
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index 8e0a0ff62a70..87f163a89c80 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -16,6 +16,7 @@  #include <linux/kernel.h>  #include <linux/version.h> +#include <linux/v4l2-subdev.h>  #include <linux/videodev2.h>  #include <media/media-device.h> /* for media_set_bus_info() */ @@ -1298,6 +1299,9 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)  	case V4L2_PIX_FMT_BGRX32:	descr = "32-bit XBGR 8-8-8-8"; break;  	case V4L2_PIX_FMT_RGBA32:	descr = "32-bit RGBA 8-8-8-8"; break;  	case V4L2_PIX_FMT_RGBX32:	descr = "32-bit RGBX 8-8-8-8"; break; +	case V4L2_PIX_FMT_RGBX1010102:	descr = "32-bit RGBX 10-10-10-2"; break; +	case V4L2_PIX_FMT_RGBA1010102:	descr = "32-bit RGBA 10-10-10-2"; break; +	case V4L2_PIX_FMT_ARGB2101010:	descr = "32-bit ARGB 2-10-10-10"; break;  	case V4L2_PIX_FMT_GREY:		descr = "8-bit Greyscale"; break;  	case V4L2_PIX_FMT_Y4:		descr = "4-bit Greyscale"; break;  	case V4L2_PIX_FMT_Y6:		descr = "6-bit Greyscale"; break; @@ -1442,6 +1446,9 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)  	case V4L2_PIX_FMT_NV12M_8L128:	descr = "NV12M (8x128 Linear)"; break;  	case V4L2_PIX_FMT_NV12_10BE_8L128:	descr = "10-bit NV12 (8x128 Linear, BE)"; break;  	case V4L2_PIX_FMT_NV12M_10BE_8L128:	descr = "10-bit NV12M (8x128 Linear, BE)"; break; +	case V4L2_PIX_FMT_Y210:		descr = "10-bit YUYV Packed"; break; +	case V4L2_PIX_FMT_Y212:		descr = "12-bit YUYV Packed"; break; +	case V4L2_PIX_FMT_Y216:		descr = "16-bit YUYV Packed"; break;  	default:  		/* Compressed formats */ @@ -3148,6 +3155,21 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size,  		ret = 1;  		break;  	} + +	case VIDIOC_SUBDEV_G_ROUTING: +	case VIDIOC_SUBDEV_S_ROUTING: { +		struct v4l2_subdev_routing *routing = parg; + +		if (routing->num_routes > 256) +			return -E2BIG; + +		*user_ptr = u64_to_user_ptr(routing->routes); +		*kernel_ptr = (void **)&routing->routes; +		*array_size = sizeof(struct v4l2_subdev_route) +			    * routing->num_routes; +		ret = 1; +		break; +	}  	}  	return ret; @@ -3394,8 +3416,15 @@ video_usercopy(struct file *file, unsigned int orig_cmd, unsigned long arg,  	/*  	 * Some ioctls can return an error, but still have valid  	 * results that must be returned. +	 * +	 * FIXME: subdev IOCTLS are partially handled here and partially in +	 * v4l2-subdev.c and the 'always_copy' flag can only be set for IOCTLS +	 * defined here as part of the 'v4l2_ioctls' array. As +	 * VIDIOC_SUBDEV_G_ROUTING needs to return results to applications even +	 * in case of failure, but it is not defined here as part of the +	 * 'v4l2_ioctls' array, insert an ad-hoc check to address that.  	 */ -	if (err < 0 && !always_copy) +	if (err < 0 && !always_copy && cmd != VIDIOC_SUBDEV_G_ROUTING)  		goto out;  	if (has_array_args) {  |