From 82bedfbf663ae9380d8386c532edae69b8f359f5 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Mon, 15 Feb 2021 05:26:30 +0100 Subject: [PATCH] media: imx: utils: Add ability to filter pixel formats by mbus code Add a media bus code argument to the imx_media_enum_pixel_formats(). If set to a non-zero value, the function will only consider pixel formats that match the given media bus code. Signed-off-by: Laurent Pinchart Reviewed-by: Rui Miguel Silva Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab --- drivers/staging/media/imx/imx-media-capture.c | 5 +++-- drivers/staging/media/imx/imx-media-csc-scaler.c | 2 +- drivers/staging/media/imx/imx-media-utils.c | 23 ++++++++++++++++++++++- drivers/staging/media/imx/imx-media.h | 2 +- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/drivers/staging/media/imx/imx-media-capture.c b/drivers/staging/media/imx/imx-media-capture.c index e10ce10..bea3467 100644 --- a/drivers/staging/media/imx/imx-media-capture.c +++ b/drivers/staging/media/imx/imx-media-capture.c @@ -174,7 +174,8 @@ static int capture_enum_fmt_vid_cap(struct file *file, void *fh, (cc_src->cs == IPUV3_COLORSPACE_YUV) ? PIXFMT_SEL_YUV : PIXFMT_SEL_RGB; - ret = imx_media_enum_pixel_formats(&fourcc, f->index, fmt_sel); + ret = imx_media_enum_pixel_formats(&fourcc, f->index, fmt_sel, + 0); if (ret) return ret; } else { @@ -223,7 +224,7 @@ static int __capture_try_fmt_vid_cap(struct capture_priv *priv, cc = imx_media_find_pixel_format(fourcc, fmt_sel); if (!cc) { - imx_media_enum_pixel_formats(&fourcc, 0, fmt_sel); + imx_media_enum_pixel_formats(&fourcc, 0, fmt_sel, 0); cc = imx_media_find_pixel_format(fourcc, fmt_sel); } } else { diff --git a/drivers/staging/media/imx/imx-media-csc-scaler.c b/drivers/staging/media/imx/imx-media-csc-scaler.c index 63a0204..eb6da9b 100644 --- a/drivers/staging/media/imx/imx-media-csc-scaler.c +++ b/drivers/staging/media/imx/imx-media-csc-scaler.c @@ -167,7 +167,7 @@ static int ipu_csc_scaler_enum_fmt(struct file *file, void *fh, int ret; ret = imx_media_enum_pixel_formats(&fourcc, f->index, - PIXFMT_SEL_YUV_RGB); + PIXFMT_SEL_YUV_RGB, 0); if (ret) return ret; diff --git a/drivers/staging/media/imx/imx-media-utils.c b/drivers/staging/media/imx/imx-media-utils.c index c2088f7..5128915 100644 --- a/drivers/staging/media/imx/imx-media-utils.c +++ b/drivers/staging/media/imx/imx-media-utils.c @@ -283,9 +283,11 @@ EXPORT_SYMBOL_GPL(imx_media_find_mbus_format); * @index: The requested match index. * @fmt_sel: Include in the enumeration entries with the given selection * criteria. + * @code: If non-zero, only include in the enumeration entries matching this + * media bus code. */ int imx_media_enum_pixel_formats(u32 *fourcc, u32 index, - enum imx_pixfmt_sel fmt_sel) + enum imx_pixfmt_sel fmt_sel, u32 code) { bool sel_ipu = fmt_sel & PIXFMT_SEL_IPU; unsigned int i; @@ -306,6 +308,25 @@ int imx_media_enum_pixel_formats(u32 *fourcc, u32 index, if (!(fmt_sel & sel)) continue; + /* + * If a media bus code is specified, only consider formats that + * match it. + */ + if (code) { + unsigned int j; + + if (!fmt->codes) + continue; + + for (j = 0; fmt->codes[j]; j++) { + if (code == fmt->codes[j]) + break; + } + + if (!fmt->codes[j]) + continue; + } + if (index == 0) { *fourcc = fmt->fourcc; return 0; diff --git a/drivers/staging/media/imx/imx-media.h b/drivers/staging/media/imx/imx-media.h index 1abb9bb..085110e 100644 --- a/drivers/staging/media/imx/imx-media.h +++ b/drivers/staging/media/imx/imx-media.h @@ -170,7 +170,7 @@ struct imx_media_dev { const struct imx_media_pixfmt * imx_media_find_pixel_format(u32 fourcc, enum imx_pixfmt_sel sel); int imx_media_enum_pixel_formats(u32 *fourcc, u32 index, - enum imx_pixfmt_sel sel); + enum imx_pixfmt_sel sel, u32 code); const struct imx_media_pixfmt * imx_media_find_mbus_format(u32 code, enum imx_pixfmt_sel sel); int imx_media_enum_mbus_formats(u32 *code, u32 index, -- 2.7.4