Commit 82bedfbf authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab

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: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: default avatarRui Miguel Silva <rmfrfs@gmail.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 0ab05d7f
...@@ -174,7 +174,8 @@ static int capture_enum_fmt_vid_cap(struct file *file, void *fh, ...@@ -174,7 +174,8 @@ static int capture_enum_fmt_vid_cap(struct file *file, void *fh,
(cc_src->cs == IPUV3_COLORSPACE_YUV) ? (cc_src->cs == IPUV3_COLORSPACE_YUV) ?
PIXFMT_SEL_YUV : PIXFMT_SEL_RGB; 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) if (ret)
return ret; return ret;
} else { } else {
...@@ -223,7 +224,7 @@ static int __capture_try_fmt_vid_cap(struct capture_priv *priv, ...@@ -223,7 +224,7 @@ static int __capture_try_fmt_vid_cap(struct capture_priv *priv,
cc = imx_media_find_pixel_format(fourcc, fmt_sel); cc = imx_media_find_pixel_format(fourcc, fmt_sel);
if (!cc) { 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); cc = imx_media_find_pixel_format(fourcc, fmt_sel);
} }
} else { } else {
......
...@@ -167,7 +167,7 @@ static int ipu_csc_scaler_enum_fmt(struct file *file, void *fh, ...@@ -167,7 +167,7 @@ static int ipu_csc_scaler_enum_fmt(struct file *file, void *fh,
int ret; int ret;
ret = imx_media_enum_pixel_formats(&fourcc, f->index, ret = imx_media_enum_pixel_formats(&fourcc, f->index,
PIXFMT_SEL_YUV_RGB); PIXFMT_SEL_YUV_RGB, 0);
if (ret) if (ret)
return ret; return ret;
......
...@@ -283,9 +283,11 @@ EXPORT_SYMBOL_GPL(imx_media_find_mbus_format); ...@@ -283,9 +283,11 @@ EXPORT_SYMBOL_GPL(imx_media_find_mbus_format);
* @index: The requested match index. * @index: The requested match index.
* @fmt_sel: Include in the enumeration entries with the given selection * @fmt_sel: Include in the enumeration entries with the given selection
* criteria. * 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, 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; bool sel_ipu = fmt_sel & PIXFMT_SEL_IPU;
unsigned int i; unsigned int i;
...@@ -306,6 +308,25 @@ int imx_media_enum_pixel_formats(u32 *fourcc, u32 index, ...@@ -306,6 +308,25 @@ int imx_media_enum_pixel_formats(u32 *fourcc, u32 index,
if (!(fmt_sel & sel)) if (!(fmt_sel & sel))
continue; 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) { if (index == 0) {
*fourcc = fmt->fourcc; *fourcc = fmt->fourcc;
return 0; return 0;
......
...@@ -170,7 +170,7 @@ struct imx_media_dev { ...@@ -170,7 +170,7 @@ struct imx_media_dev {
const struct imx_media_pixfmt * const struct imx_media_pixfmt *
imx_media_find_pixel_format(u32 fourcc, enum imx_pixfmt_sel sel); imx_media_find_pixel_format(u32 fourcc, enum imx_pixfmt_sel sel);
int imx_media_enum_pixel_formats(u32 *fourcc, u32 index, 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 * const struct imx_media_pixfmt *
imx_media_find_mbus_format(u32 code, enum imx_pixfmt_sel sel); imx_media_find_mbus_format(u32 code, enum imx_pixfmt_sel sel);
int imx_media_enum_mbus_formats(u32 *code, u32 index, int imx_media_enum_mbus_formats(u32 *code, u32 index,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment