V4L/DVB (7948): videodev: add missing vidioc_try_fmt_sliced_vbi_output and VIDIOC_ENUMOUTPUT handling

There was no vidioc_try_fmt_sliced_vbi_output, instead vidioc_try_fmt_vbi_output
was reused.

The VIDIOC_ENUMOUTPUT handling was missing altogether, even though the callback
existed.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
diff --git a/drivers/media/video/videodev.c b/drivers/media/video/videodev.c
index 4d58b55..83106bb 100644
--- a/drivers/media/video/videodev.c
+++ b/drivers/media/video/videodev.c
@@ -840,8 +840,8 @@
 				ret=vfd->vidioc_enum_fmt_vbi(file, fh, f);
 			break;
 		case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
-			if (vfd->vidioc_enum_fmt_vbi_output)
-				ret=vfd->vidioc_enum_fmt_vbi_output(file,
+			if (vfd->vidioc_enum_fmt_sliced_vbi_output)
+				ret = vfd->vidioc_enum_fmt_sliced_vbi_output(file,
 								fh, f);
 			break;
 		case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
@@ -905,8 +905,8 @@
 				ret=vfd->vidioc_g_fmt_vbi(file, fh, f);
 			break;
 		case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
-			if (vfd->vidioc_g_fmt_vbi_output)
-				ret=vfd->vidioc_g_fmt_vbi_output(file, fh, f);
+			if (vfd->vidioc_g_fmt_sliced_vbi_output)
+				ret = vfd->vidioc_g_fmt_sliced_vbi_output(file, fh, f);
 			break;
 		case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
 			if (vfd->vidioc_g_fmt_vbi_capture)
@@ -957,8 +957,8 @@
 				ret=vfd->vidioc_s_fmt_vbi(file, fh, f);
 			break;
 		case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
-			if (vfd->vidioc_s_fmt_vbi_output)
-				ret=vfd->vidioc_s_fmt_vbi_output(file, fh, f);
+			if (vfd->vidioc_s_fmt_sliced_vbi_output)
+				ret = vfd->vidioc_s_fmt_sliced_vbi_output(file, fh, f);
 			break;
 		case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
 			if (vfd->vidioc_s_fmt_vbi_capture)
@@ -1009,8 +1009,8 @@
 				ret=vfd->vidioc_try_fmt_vbi(file, fh, f);
 			break;
 		case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
-			if (vfd->vidioc_try_fmt_vbi_output)
-				ret=vfd->vidioc_try_fmt_vbi_output(file,
+			if (vfd->vidioc_try_fmt_sliced_vbi_output)
+				ret = vfd->vidioc_try_fmt_sliced_vbi_output(file,
 								fh, f);
 			break;
 		case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
@@ -1297,6 +1297,25 @@
 	}
 
 	/* ------ output switching ---------- */
+	case VIDIOC_ENUMOUTPUT:
+	{
+		struct v4l2_output *p = arg;
+		int i = p->index;
+
+		if (!vfd->vidioc_enum_output)
+			break;
+		memset(p, 0, sizeof(*p));
+		p->index = i;
+
+		ret = vfd->vidioc_enum_output(file, fh, p);
+		if (!ret)
+			dbgarg(cmd, "index=%d, name=%s, type=%d, "
+				"audioset=%d, "
+				"modulator=%d, std=%08Lx\n",
+				p->index, p->name, p->type, p->audioset,
+				p->modulator, (unsigned long long)p->std);
+		break;
+	}
 	case VIDIOC_G_OUTPUT:
 	{
 		unsigned int *i = arg;
diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h
index 8a40f48..f14181f 100644
--- a/include/media/v4l2-dev.h
+++ b/include/media/v4l2-dev.h
@@ -132,6 +132,8 @@
 					    struct v4l2_fmtdesc *f);
 	int (*vidioc_enum_fmt_vbi_output)  (struct file *file, void *fh,
 					    struct v4l2_fmtdesc *f);
+	int (*vidioc_enum_fmt_sliced_vbi_output)  (struct file *file, void *fh,
+					    struct v4l2_fmtdesc *f);
 	int (*vidioc_enum_fmt_type_private)(struct file *file, void *fh,
 					    struct v4l2_fmtdesc *f);
 
@@ -144,6 +146,8 @@
 					struct v4l2_format *f);
 	int (*vidioc_g_fmt_vbi_output) (struct file *file, void *fh,
 					struct v4l2_format *f);
+	int (*vidioc_g_fmt_sliced_vbi_output) (struct file *file, void *fh,
+					struct v4l2_format *f);
 	int (*vidioc_g_fmt_vbi_capture)(struct file *file, void *fh,
 					struct v4l2_format *f);
 	int (*vidioc_g_fmt_video_output)(struct file *file, void *fh,
@@ -163,6 +167,8 @@
 					struct v4l2_format *f);
 	int (*vidioc_s_fmt_vbi_output) (struct file *file, void *fh,
 					struct v4l2_format *f);
+	int (*vidioc_s_fmt_sliced_vbi_output) (struct file *file, void *fh,
+					struct v4l2_format *f);
 	int (*vidioc_s_fmt_vbi_capture)(struct file *file, void *fh,
 					struct v4l2_format *f);
 	int (*vidioc_s_fmt_video_output)(struct file *file, void *fh,
@@ -181,6 +187,8 @@
 					  struct v4l2_format *f);
 	int (*vidioc_try_fmt_vbi_output) (struct file *file, void *fh,
 					  struct v4l2_format *f);
+	int (*vidioc_try_fmt_sliced_vbi_output) (struct file *file, void *fh,
+					  struct v4l2_format *f);
 	int (*vidioc_try_fmt_vbi_capture)(struct file *file, void *fh,
 					  struct v4l2_format *f);
 	int (*vidioc_try_fmt_video_output)(struct file *file, void *fh,
@@ -225,7 +233,7 @@
 	int (*vidioc_s_input)   (struct file *file, void *fh, unsigned int i);
 
 		/* Output handling */
-	int (*vidioc_enumoutput) (struct file *file, void *fh,
+	int (*vidioc_enum_output) (struct file *file, void *fh,
 				  struct v4l2_output *a);
 	int (*vidioc_g_output)   (struct file *file, void *fh, unsigned int *i);
 	int (*vidioc_s_output)   (struct file *file, void *fh, unsigned int i);