aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/v4l2-core/v4l2-ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-ioctl.c')
-rw-r--r--drivers/media/v4l2-core/v4l2-ioctl.c214
1 files changed, 202 insertions, 12 deletions
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index aa407cb5f830..85de4557f696 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -142,6 +142,7 @@ const char *v4l2_field_names[] = {
142EXPORT_SYMBOL(v4l2_field_names); 142EXPORT_SYMBOL(v4l2_field_names);
143 143
144const char *v4l2_type_names[] = { 144const char *v4l2_type_names[] = {
145 [0] = "0",
145 [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "vid-cap", 146 [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "vid-cap",
146 [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "vid-overlay", 147 [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "vid-overlay",
147 [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "vid-out", 148 [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "vid-out",
@@ -257,7 +258,8 @@ static void v4l_print_format(const void *arg, bool write_only)
257 pr_cont(", width=%u, height=%u, " 258 pr_cont(", width=%u, height=%u, "
258 "pixelformat=%c%c%c%c, field=%s, " 259 "pixelformat=%c%c%c%c, field=%s, "
259 "bytesperline=%u, sizeimage=%u, colorspace=%d, " 260 "bytesperline=%u, sizeimage=%u, colorspace=%d, "
260 "flags=0x%x, ycbcr_enc=%u, quantization=%u\n", 261 "flags=0x%x, ycbcr_enc=%u, quantization=%u, "
262 "xfer_func=%u\n",
261 pix->width, pix->height, 263 pix->width, pix->height,
262 (pix->pixelformat & 0xff), 264 (pix->pixelformat & 0xff),
263 (pix->pixelformat >> 8) & 0xff, 265 (pix->pixelformat >> 8) & 0xff,
@@ -266,7 +268,7 @@ static void v4l_print_format(const void *arg, bool write_only)
266 prt_names(pix->field, v4l2_field_names), 268 prt_names(pix->field, v4l2_field_names),
267 pix->bytesperline, pix->sizeimage, 269 pix->bytesperline, pix->sizeimage,
268 pix->colorspace, pix->flags, pix->ycbcr_enc, 270 pix->colorspace, pix->flags, pix->ycbcr_enc,
269 pix->quantization); 271 pix->quantization, pix->xfer_func);
270 break; 272 break;
271 case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: 273 case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
272 case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: 274 case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
@@ -274,7 +276,7 @@ static void v4l_print_format(const void *arg, bool write_only)
274 pr_cont(", width=%u, height=%u, " 276 pr_cont(", width=%u, height=%u, "
275 "format=%c%c%c%c, field=%s, " 277 "format=%c%c%c%c, field=%s, "
276 "colorspace=%d, num_planes=%u, flags=0x%x, " 278 "colorspace=%d, num_planes=%u, flags=0x%x, "
277 "ycbcr_enc=%u, quantization=%u\n", 279 "ycbcr_enc=%u, quantization=%u, xfer_func=%u\n",
278 mp->width, mp->height, 280 mp->width, mp->height,
279 (mp->pixelformat & 0xff), 281 (mp->pixelformat & 0xff),
280 (mp->pixelformat >> 8) & 0xff, 282 (mp->pixelformat >> 8) & 0xff,
@@ -282,7 +284,7 @@ static void v4l_print_format(const void *arg, bool write_only)
282 (mp->pixelformat >> 24) & 0xff, 284 (mp->pixelformat >> 24) & 0xff,
283 prt_names(mp->field, v4l2_field_names), 285 prt_names(mp->field, v4l2_field_names),
284 mp->colorspace, mp->num_planes, mp->flags, 286 mp->colorspace, mp->num_planes, mp->flags,
285 mp->ycbcr_enc, mp->quantization); 287 mp->ycbcr_enc, mp->quantization, mp->xfer_func);
286 for (i = 0; i < mp->num_planes; i++) 288 for (i = 0; i < mp->num_planes; i++)
287 printk(KERN_DEBUG "plane %u: bytesperline=%u sizeimage=%u\n", i, 289 printk(KERN_DEBUG "plane %u: bytesperline=%u sizeimage=%u\n", i,
288 mp->plane_fmt[i].bytesperline, 290 mp->plane_fmt[i].bytesperline,
@@ -1103,6 +1105,183 @@ static int v4l_enumoutput(const struct v4l2_ioctl_ops *ops,
1103 return ops->vidioc_enum_output(file, fh, p); 1105 return ops->vidioc_enum_output(file, fh, p);
1104} 1106}
1105 1107
1108static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
1109{
1110 const unsigned sz = sizeof(fmt->description);
1111 const char *descr = NULL;
1112 u32 flags = 0;
1113
1114 /*
1115 * We depart from the normal coding style here since the descriptions
1116 * should be aligned so it is easy to see which descriptions will be
1117 * longer than 31 characters (the max length for a description).
1118 * And frankly, this is easier to read anyway.
1119 *
1120 * Note that gcc will use O(log N) comparisons to find the right case.
1121 */
1122 switch (fmt->pixelformat) {
1123 /* Max description length mask: descr = "0123456789012345678901234567890" */
1124 case V4L2_PIX_FMT_RGB332: descr = "8-bit RGB 3-3-2"; break;
1125 case V4L2_PIX_FMT_RGB444: descr = "16-bit A/XRGB 4-4-4-4"; break;
1126 case V4L2_PIX_FMT_ARGB444: descr = "16-bit ARGB 4-4-4-4"; break;
1127 case V4L2_PIX_FMT_XRGB444: descr = "16-bit XRGB 4-4-4-4"; break;
1128 case V4L2_PIX_FMT_RGB555: descr = "16-bit A/XRGB 1-5-5-5"; break;
1129 case V4L2_PIX_FMT_ARGB555: descr = "16-bit ARGB 1-5-5-5"; break;
1130 case V4L2_PIX_FMT_XRGB555: descr = "16-bit XRGB 1-5-5-5"; break;
1131 case V4L2_PIX_FMT_RGB565: descr = "16-bit RGB 5-6-5"; break;
1132 case V4L2_PIX_FMT_RGB555X: descr = "16-bit A/XRGB 1-5-5-5 BE"; break;
1133 case V4L2_PIX_FMT_ARGB555X: descr = "16-bit ARGB 1-5-5-5 BE"; break;
1134 case V4L2_PIX_FMT_XRGB555X: descr = "16-bit XRGB 1-5-5-5 BE"; break;
1135 case V4L2_PIX_FMT_RGB565X: descr = "16-bit RGB 5-6-5 BE"; break;
1136 case V4L2_PIX_FMT_BGR666: descr = "18-bit BGRX 6-6-6-14"; break;
1137 case V4L2_PIX_FMT_BGR24: descr = "24-bit BGR 8-8-8"; break;
1138 case V4L2_PIX_FMT_RGB24: descr = "24-bit RGB 8-8-8"; break;
1139 case V4L2_PIX_FMT_BGR32: descr = "32-bit BGRA/X 8-8-8-8"; break;
1140 case V4L2_PIX_FMT_ABGR32: descr = "32-bit BGRA 8-8-8-8"; break;
1141 case V4L2_PIX_FMT_XBGR32: descr = "32-bit BGRX 8-8-8-8"; break;
1142 case V4L2_PIX_FMT_RGB32: descr = "32-bit A/XRGB 8-8-8-8"; break;
1143 case V4L2_PIX_FMT_ARGB32: descr = "32-bit ARGB 8-8-8-8"; break;
1144 case V4L2_PIX_FMT_XRGB32: descr = "32-bit XRGB 8-8-8-8"; break;
1145 case V4L2_PIX_FMT_GREY: descr = "8-bit Greyscale"; break;
1146 case V4L2_PIX_FMT_Y4: descr = "4-bit Greyscale"; break;
1147 case V4L2_PIX_FMT_Y6: descr = "6-bit Greyscale"; break;
1148 case V4L2_PIX_FMT_Y10: descr = "10-bit Greyscale"; break;
1149 case V4L2_PIX_FMT_Y12: descr = "12-bit Greyscale"; break;
1150 case V4L2_PIX_FMT_Y16: descr = "16-bit Greyscale"; break;
1151 case V4L2_PIX_FMT_Y16_BE: descr = "16-bit Greyscale BE"; break;
1152 case V4L2_PIX_FMT_Y10BPACK: descr = "10-bit Greyscale (Packed)"; break;
1153 case V4L2_PIX_FMT_PAL8: descr = "8-bit Palette"; break;
1154 case V4L2_PIX_FMT_UV8: descr = "8-bit Chrominance UV 4-4"; break;
1155 case V4L2_PIX_FMT_YVU410: descr = "Planar YVU 4:1:0"; break;
1156 case V4L2_PIX_FMT_YVU420: descr = "Planar YVU 4:2:0"; break;
1157 case V4L2_PIX_FMT_YUYV: descr = "YUYV 4:2:2"; break;
1158 case V4L2_PIX_FMT_YYUV: descr = "YYUV 4:2:2"; break;
1159 case V4L2_PIX_FMT_YVYU: descr = "YVYU 4:2:2"; break;
1160 case V4L2_PIX_FMT_UYVY: descr = "UYVY 4:2:2"; break;
1161 case V4L2_PIX_FMT_VYUY: descr = "VYUY 4:2:2"; break;
1162 case V4L2_PIX_FMT_YUV422P: descr = "Planar YVU 4:2:2"; break;
1163 case V4L2_PIX_FMT_YUV411P: descr = "Planar YUV 4:1:1"; break;
1164 case V4L2_PIX_FMT_Y41P: descr = "YUV 4:1:1 (Packed)"; break;
1165 case V4L2_PIX_FMT_YUV444: descr = "16-bit A/XYUV 4-4-4-4"; break;
1166 case V4L2_PIX_FMT_YUV555: descr = "16-bit A/XYUV 1-5-5-5"; break;
1167 case V4L2_PIX_FMT_YUV565: descr = "16-bit YUV 5-6-5"; break;
1168 case V4L2_PIX_FMT_YUV32: descr = "32-bit A/XYUV 8-8-8-8"; break;
1169 case V4L2_PIX_FMT_YUV410: descr = "Planar YUV 4:1:0"; break;
1170 case V4L2_PIX_FMT_YUV420: descr = "Planar YUV 4:2:0"; break;
1171 case V4L2_PIX_FMT_HI240: descr = "8-bit Dithered RGB (BTTV)"; break;
1172 case V4L2_PIX_FMT_HM12: descr = "YUV 4:2:0 (16x16 Macroblocks)"; break;
1173 case V4L2_PIX_FMT_M420: descr = "YUV 4:2:0 (M420)"; break;
1174 case V4L2_PIX_FMT_NV12: descr = "Y/CbCr 4:2:0"; break;
1175 case V4L2_PIX_FMT_NV21: descr = "Y/CrCb 4:2:0"; break;
1176 case V4L2_PIX_FMT_NV16: descr = "Y/CbCr 4:2:2"; break;
1177 case V4L2_PIX_FMT_NV61: descr = "Y/CrCb 4:2:2"; break;
1178 case V4L2_PIX_FMT_NV24: descr = "Y/CbCr 4:4:4"; break;
1179 case V4L2_PIX_FMT_NV42: descr = "Y/CrCb 4:4:4"; break;
1180 case V4L2_PIX_FMT_NV12M: descr = "Y/CbCr 4:2:0 (N-C)"; break;
1181 case V4L2_PIX_FMT_NV21M: descr = "Y/CrCb 4:2:0 (N-C)"; break;
1182 case V4L2_PIX_FMT_NV16M: descr = "Y/CbCr 4:2:2 (N-C)"; break;
1183 case V4L2_PIX_FMT_NV61M: descr = "Y/CrCb 4:2:2 (N-C)"; break;
1184 case V4L2_PIX_FMT_NV12MT: descr = "Y/CbCr 4:2:0 (64x32 MB, N-C)"; break;
1185 case V4L2_PIX_FMT_NV12MT_16X16: descr = "Y/CbCr 4:2:0 (16x16 MB, N-C)"; break;
1186 case V4L2_PIX_FMT_YUV420M: descr = "Planar YUV 4:2:0 (N-C)"; break;
1187 case V4L2_PIX_FMT_YVU420M: descr = "Planar YVU 4:2:0 (N-C)"; break;
1188 case V4L2_PIX_FMT_SBGGR8: descr = "8-bit Bayer BGBG/GRGR"; break;
1189 case V4L2_PIX_FMT_SGBRG8: descr = "8-bit Bayer GBGB/RGRG"; break;
1190 case V4L2_PIX_FMT_SGRBG8: descr = "8-bit Bayer GRGR/BGBG"; break;
1191 case V4L2_PIX_FMT_SRGGB8: descr = "8-bit Bayer RGRG/GBGB"; break;
1192 case V4L2_PIX_FMT_SBGGR10: descr = "10-bit Bayer BGBG/GRGR"; break;
1193 case V4L2_PIX_FMT_SGBRG10: descr = "10-bit Bayer GBGB/RGRG"; break;
1194 case V4L2_PIX_FMT_SGRBG10: descr = "10-bit Bayer GRGR/BGBG"; break;
1195 case V4L2_PIX_FMT_SRGGB10: descr = "10-bit Bayer RGRG/GBGB"; break;
1196 case V4L2_PIX_FMT_SBGGR12: descr = "12-bit Bayer BGBG/GRGR"; break;
1197 case V4L2_PIX_FMT_SGBRG12: descr = "12-bit Bayer GBGB/RGRG"; break;
1198 case V4L2_PIX_FMT_SGRBG12: descr = "12-bit Bayer GRGR/BGBG"; break;
1199 case V4L2_PIX_FMT_SRGGB12: descr = "12-bit Bayer RGRG/GBGB"; break;
1200 case V4L2_PIX_FMT_SBGGR10P: descr = "10-bit Bayer BGBG/GRGR Packed"; break;
1201 case V4L2_PIX_FMT_SGBRG10P: descr = "10-bit Bayer GBGB/RGRG Packed"; break;
1202 case V4L2_PIX_FMT_SGRBG10P: descr = "10-bit Bayer GRGR/BGBG Packed"; break;
1203 case V4L2_PIX_FMT_SRGGB10P: descr = "10-bit Bayer RGRG/GBGB Packed"; break;
1204 case V4L2_PIX_FMT_SBGGR10ALAW8: descr = "8-bit Bayer BGBG/GRGR (A-law)"; break;
1205 case V4L2_PIX_FMT_SGBRG10ALAW8: descr = "8-bit Bayer GBGB/RGRG (A-law)"; break;
1206 case V4L2_PIX_FMT_SGRBG10ALAW8: descr = "8-bit Bayer GRGR/BGBG (A-law)"; break;
1207 case V4L2_PIX_FMT_SRGGB10ALAW8: descr = "8-bit Bayer RGRG/GBGB (A-law)"; break;
1208 case V4L2_PIX_FMT_SBGGR10DPCM8: descr = "8-bit Bayer BGBG/GRGR (DPCM)"; break;
1209 case V4L2_PIX_FMT_SGBRG10DPCM8: descr = "8-bit Bayer GBGB/RGRG (DPCM)"; break;
1210 case V4L2_PIX_FMT_SGRBG10DPCM8: descr = "8-bit Bayer GRGR/BGBG (DPCM)"; break;
1211 case V4L2_PIX_FMT_SRGGB10DPCM8: descr = "8-bit Bayer RGRG/GBGB (DPCM)"; break;
1212 case V4L2_PIX_FMT_SBGGR16: descr = "16-bit Bayer BGBG/GRGR (Exp.)"; break;
1213 case V4L2_PIX_FMT_SN9C20X_I420: descr = "GSPCA SN9C20X I420"; break;
1214 case V4L2_PIX_FMT_SPCA501: descr = "GSPCA SPCA501"; break;
1215 case V4L2_PIX_FMT_SPCA505: descr = "GSPCA SPCA505"; break;
1216 case V4L2_PIX_FMT_SPCA508: descr = "GSPCA SPCA508"; break;
1217 case V4L2_PIX_FMT_STV0680: descr = "GSPCA STV0680"; break;
1218 case V4L2_PIX_FMT_TM6000: descr = "A/V + VBI Mux Packet"; break;
1219 case V4L2_PIX_FMT_CIT_YYVYUY: descr = "GSPCA CIT YYVYUY"; break;
1220 case V4L2_PIX_FMT_KONICA420: descr = "GSPCA KONICA420"; break;
1221 case V4L2_SDR_FMT_CU8: descr = "Complex U8"; break;
1222 case V4L2_SDR_FMT_CU16LE: descr = "Complex U16LE"; break;
1223 case V4L2_SDR_FMT_CS8: descr = "Complex S8"; break;
1224 case V4L2_SDR_FMT_CS14LE: descr = "Complex S14LE"; break;
1225 case V4L2_SDR_FMT_RU12LE: descr = "Real U12LE"; break;
1226
1227 default:
1228 /* Compressed formats */
1229 flags = V4L2_FMT_FLAG_COMPRESSED;
1230 switch (fmt->pixelformat) {
1231 /* Max description length mask: descr = "0123456789012345678901234567890" */
1232 case V4L2_PIX_FMT_MJPEG: descr = "Motion-JPEG"; break;
1233 case V4L2_PIX_FMT_JPEG: descr = "JFIF JPEG"; break;
1234 case V4L2_PIX_FMT_DV: descr = "1394"; break;
1235 case V4L2_PIX_FMT_MPEG: descr = "MPEG-1/2/4"; break;
1236 case V4L2_PIX_FMT_H264: descr = "H.264"; break;
1237 case V4L2_PIX_FMT_H264_NO_SC: descr = "H.264 (No Start Codes)"; break;
1238 case V4L2_PIX_FMT_H264_MVC: descr = "H.264 MVC"; break;
1239 case V4L2_PIX_FMT_H263: descr = "H.263"; break;
1240 case V4L2_PIX_FMT_MPEG1: descr = "MPEG-1 ES"; break;
1241 case V4L2_PIX_FMT_MPEG2: descr = "MPEG-2 ES"; break;
1242 case V4L2_PIX_FMT_MPEG4: descr = "MPEG-4 part 2 ES"; break;
1243 case V4L2_PIX_FMT_XVID: descr = "Xvid"; break;
1244 case V4L2_PIX_FMT_VC1_ANNEX_G: descr = "VC-1 (SMPTE 412M Annex G)"; break;
1245 case V4L2_PIX_FMT_VC1_ANNEX_L: descr = "VC-1 (SMPTE 412M Annex L)"; break;
1246 case V4L2_PIX_FMT_VP8: descr = "VP8"; break;
1247 case V4L2_PIX_FMT_CPIA1: descr = "GSPCA CPiA YUV"; break;
1248 case V4L2_PIX_FMT_WNVA: descr = "WNVA"; break;
1249 case V4L2_PIX_FMT_SN9C10X: descr = "GSPCA SN9C10X"; break;
1250 case V4L2_PIX_FMT_PWC1: descr = "Raw Philips Webcam Type (Old)"; break;
1251 case V4L2_PIX_FMT_PWC2: descr = "Raw Philips Webcam Type (New)"; break;
1252 case V4L2_PIX_FMT_ET61X251: descr = "GSPCA ET61X251"; break;
1253 case V4L2_PIX_FMT_SPCA561: descr = "GSPCA SPCA561"; break;
1254 case V4L2_PIX_FMT_PAC207: descr = "GSPCA PAC207"; break;
1255 case V4L2_PIX_FMT_MR97310A: descr = "GSPCA MR97310A"; break;
1256 case V4L2_PIX_FMT_JL2005BCD: descr = "GSPCA JL2005BCD"; break;
1257 case V4L2_PIX_FMT_SN9C2028: descr = "GSPCA SN9C2028"; break;
1258 case V4L2_PIX_FMT_SQ905C: descr = "GSPCA SQ905C"; break;
1259 case V4L2_PIX_FMT_PJPG: descr = "GSPCA PJPG"; break;
1260 case V4L2_PIX_FMT_OV511: descr = "GSPCA OV511"; break;
1261 case V4L2_PIX_FMT_OV518: descr = "GSPCA OV518"; break;
1262 case V4L2_PIX_FMT_JPGL: descr = "JPEG Lite"; break;
1263 case V4L2_PIX_FMT_SE401: descr = "GSPCA SE401"; break;
1264 case V4L2_PIX_FMT_S5C_UYVY_JPG: descr = "S5C73MX interleaved UYVY/JPEG"; break;
1265 default:
1266 WARN(1, "Unknown pixelformat 0x%08x\n", fmt->pixelformat);
1267 if (fmt->description[0])
1268 return;
1269 flags = 0;
1270 snprintf(fmt->description, sz, "%c%c%c%c%s",
1271 (char)(fmt->pixelformat & 0x7f),
1272 (char)((fmt->pixelformat >> 8) & 0x7f),
1273 (char)((fmt->pixelformat >> 16) & 0x7f),
1274 (char)((fmt->pixelformat >> 24) & 0x7f),
1275 (fmt->pixelformat & (1 << 31)) ? "-BE" : "");
1276 break;
1277 }
1278 }
1279
1280 if (descr)
1281 WARN_ON(strlcpy(fmt->description, descr, sz) >= sz);
1282 fmt->flags = flags;
1283}
1284
1106static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops, 1285static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops,
1107 struct file *file, void *fh, void *arg) 1286 struct file *file, void *fh, void *arg)
1108{ 1287{
@@ -1112,34 +1291,43 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops,
1112 bool is_sdr = vfd->vfl_type == VFL_TYPE_SDR; 1291 bool is_sdr = vfd->vfl_type == VFL_TYPE_SDR;
1113 bool is_rx = vfd->vfl_dir != VFL_DIR_TX; 1292 bool is_rx = vfd->vfl_dir != VFL_DIR_TX;
1114 bool is_tx = vfd->vfl_dir != VFL_DIR_RX; 1293 bool is_tx = vfd->vfl_dir != VFL_DIR_RX;
1294 int ret = -EINVAL;
1115 1295
1116 switch (p->type) { 1296 switch (p->type) {
1117 case V4L2_BUF_TYPE_VIDEO_CAPTURE: 1297 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1118 if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_cap)) 1298 if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_cap))
1119 break; 1299 break;
1120 return ops->vidioc_enum_fmt_vid_cap(file, fh, arg); 1300 ret = ops->vidioc_enum_fmt_vid_cap(file, fh, arg);
1301 break;
1121 case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: 1302 case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
1122 if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_cap_mplane)) 1303 if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_cap_mplane))
1123 break; 1304 break;
1124 return ops->vidioc_enum_fmt_vid_cap_mplane(file, fh, arg); 1305 ret = ops->vidioc_enum_fmt_vid_cap_mplane(file, fh, arg);
1306 break;
1125 case V4L2_BUF_TYPE_VIDEO_OVERLAY: 1307 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
1126 if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_overlay)) 1308 if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_overlay))
1127 break; 1309 break;
1128 return ops->vidioc_enum_fmt_vid_overlay(file, fh, arg); 1310 ret = ops->vidioc_enum_fmt_vid_overlay(file, fh, arg);
1311 break;
1129 case V4L2_BUF_TYPE_VIDEO_OUTPUT: 1312 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
1130 if (unlikely(!is_tx || !is_vid || !ops->vidioc_enum_fmt_vid_out)) 1313 if (unlikely(!is_tx || !is_vid || !ops->vidioc_enum_fmt_vid_out))
1131 break; 1314 break;
1132 return ops->vidioc_enum_fmt_vid_out(file, fh, arg); 1315 ret = ops->vidioc_enum_fmt_vid_out(file, fh, arg);
1316 break;
1133 case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: 1317 case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
1134 if (unlikely(!is_tx || !is_vid || !ops->vidioc_enum_fmt_vid_out_mplane)) 1318 if (unlikely(!is_tx || !is_vid || !ops->vidioc_enum_fmt_vid_out_mplane))
1135 break; 1319 break;
1136 return ops->vidioc_enum_fmt_vid_out_mplane(file, fh, arg); 1320 ret = ops->vidioc_enum_fmt_vid_out_mplane(file, fh, arg);
1321 break;
1137 case V4L2_BUF_TYPE_SDR_CAPTURE: 1322 case V4L2_BUF_TYPE_SDR_CAPTURE:
1138 if (unlikely(!is_rx || !is_sdr || !ops->vidioc_enum_fmt_sdr_cap)) 1323 if (unlikely(!is_rx || !is_sdr || !ops->vidioc_enum_fmt_sdr_cap))
1139 break; 1324 break;
1140 return ops->vidioc_enum_fmt_sdr_cap(file, fh, arg); 1325 ret = ops->vidioc_enum_fmt_sdr_cap(file, fh, arg);
1326 break;
1141 } 1327 }
1142 return -EINVAL; 1328 if (ret == 0)
1329 v4l_fill_fmtdesc(p);
1330 return ret;
1143} 1331}
1144 1332
1145static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops, 1333static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops,
@@ -1618,6 +1806,8 @@ static int v4l_create_bufs(const struct v4l2_ioctl_ops *ops,
1618 if (ret) 1806 if (ret)
1619 return ret; 1807 return ret;
1620 1808
1809 CLEAR_AFTER_FIELD(create, format);
1810
1621 v4l_sanitize_format(&create->format); 1811 v4l_sanitize_format(&create->format);
1622 1812
1623 ret = ops->vidioc_create_bufs(file, fh, create); 1813 ret = ops->vidioc_create_bufs(file, fh, create);
@@ -2354,7 +2544,7 @@ static long __video_do_ioctl(struct file *file,
2354 if (v4l2_is_known_ioctl(cmd)) { 2544 if (v4l2_is_known_ioctl(cmd)) {
2355 info = &v4l2_ioctls[_IOC_NR(cmd)]; 2545 info = &v4l2_ioctls[_IOC_NR(cmd)];
2356 2546
2357 if (!test_bit(_IOC_NR(cmd), vfd->valid_ioctls) && 2547 if (!test_bit(_IOC_NR(cmd), vfd->valid_ioctls) &&
2358 !((info->flags & INFO_FL_CTRL) && vfh && vfh->ctrl_handler)) 2548 !((info->flags & INFO_FL_CTRL) && vfh && vfh->ctrl_handler))
2359 goto done; 2549 goto done;
2360 2550