Commit f0f71ae4 authored by Steve Longerbeam's avatar Steve Longerbeam Committed by Mauro Carvalho Chehab

media: imx: utils: Introduce PIXFMT_SEL_IPU

Add a PIXFMT_SEL_IPU selection flag, to select only the IPU-internal
pixel formats, and move the single-entry IPU-internal pixel format
arrays into pixel_formats[]. imx_media_find_ipu_format() and
imx_media_enum_ipu_format() can now simply call find_format() and
enum_format().

The RGB32 format is both an IPU-internal format, and an in-memory format
via idmac channels that is supported by the IPUv3 driver, so it appears
twice in pixel_formats[], one with ipufmt=false for the in-memory format,
and again with ipufmt=true for the IPU-internal format.
Signed-off-by: default avatarSteve Longerbeam <slongerbeam@gmail.com>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent a7d5003c
...@@ -53,6 +53,12 @@ static const struct imx_media_pixfmt pixel_formats[] = { ...@@ -53,6 +53,12 @@ static const struct imx_media_pixfmt pixel_formats[] = {
.cs = IPUV3_COLORSPACE_YUV, .cs = IPUV3_COLORSPACE_YUV,
.bpp = 16, .bpp = 16,
.planar = true, .planar = true,
}, {
.fourcc = V4L2_PIX_FMT_YUV32,
.codes = {MEDIA_BUS_FMT_AYUV8_1X32},
.cs = IPUV3_COLORSPACE_YUV,
.bpp = 32,
.ipufmt = true,
}, },
/*** RGB formats start here ***/ /*** RGB formats start here ***/
{ {
...@@ -73,6 +79,11 @@ static const struct imx_media_pixfmt pixel_formats[] = { ...@@ -73,6 +79,11 @@ static const struct imx_media_pixfmt pixel_formats[] = {
.fourcc = V4L2_PIX_FMT_BGR24, .fourcc = V4L2_PIX_FMT_BGR24,
.cs = IPUV3_COLORSPACE_RGB, .cs = IPUV3_COLORSPACE_RGB,
.bpp = 24, .bpp = 24,
}, {
.fourcc = V4L2_PIX_FMT_XRGB32,
.codes = {MEDIA_BUS_FMT_ARGB8888_1X32},
.cs = IPUV3_COLORSPACE_RGB,
.bpp = 32,
}, { }, {
.fourcc = V4L2_PIX_FMT_XRGB32, .fourcc = V4L2_PIX_FMT_XRGB32,
.codes = {MEDIA_BUS_FMT_ARGB8888_1X32}, .codes = {MEDIA_BUS_FMT_ARGB8888_1X32},
...@@ -186,42 +197,24 @@ static const struct imx_media_pixfmt pixel_formats[] = { ...@@ -186,42 +197,24 @@ static const struct imx_media_pixfmt pixel_formats[] = {
}, },
}; };
static const struct imx_media_pixfmt ipu_yuv_formats[] = {
{
.fourcc = V4L2_PIX_FMT_YUV32,
.codes = {MEDIA_BUS_FMT_AYUV8_1X32},
.cs = IPUV3_COLORSPACE_YUV,
.bpp = 32,
.ipufmt = true,
},
};
#define NUM_IPU_YUV_FORMATS ARRAY_SIZE(ipu_yuv_formats)
static const struct imx_media_pixfmt ipu_rgb_formats[] = {
{
.fourcc = V4L2_PIX_FMT_XRGB32,
.codes = {MEDIA_BUS_FMT_ARGB8888_1X32},
.cs = IPUV3_COLORSPACE_RGB,
.bpp = 32,
.ipufmt = true,
},
};
#define NUM_IPU_RGB_FORMATS ARRAY_SIZE(ipu_rgb_formats)
static const struct imx_media_pixfmt *find_format(u32 fourcc, static const struct imx_media_pixfmt *find_format(u32 fourcc,
u32 code, u32 code,
enum imx_pixfmt_sel fmt_sel, enum imx_pixfmt_sel fmt_sel,
bool allow_non_mbus) bool allow_non_mbus)
{ {
bool sel_ipu = fmt_sel & PIXFMT_SEL_IPU;
unsigned int i; unsigned int i;
fmt_sel &= ~PIXFMT_SEL_IPU;
for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) { for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) {
const struct imx_media_pixfmt *fmt = &pixel_formats[i]; const struct imx_media_pixfmt *fmt = &pixel_formats[i];
enum imx_pixfmt_sel sel; enum imx_pixfmt_sel sel;
unsigned int j; unsigned int j;
if (sel_ipu != fmt->ipufmt)
continue;
sel = fmt->bayer ? PIXFMT_SEL_BAYER : sel = fmt->bayer ? PIXFMT_SEL_BAYER :
((fmt->cs == IPUV3_COLORSPACE_YUV) ? ((fmt->cs == IPUV3_COLORSPACE_YUV) ?
PIXFMT_SEL_YUV : PIXFMT_SEL_RGB); PIXFMT_SEL_YUV : PIXFMT_SEL_RGB);
...@@ -249,13 +242,19 @@ static int enum_format(u32 *fourcc, u32 *code, u32 index, ...@@ -249,13 +242,19 @@ static int enum_format(u32 *fourcc, u32 *code, u32 index,
enum imx_pixfmt_sel fmt_sel, enum imx_pixfmt_sel fmt_sel,
bool allow_non_mbus) bool allow_non_mbus)
{ {
bool sel_ipu = fmt_sel & PIXFMT_SEL_IPU;
unsigned int i; unsigned int i;
fmt_sel &= ~PIXFMT_SEL_IPU;
for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) { for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) {
const struct imx_media_pixfmt *fmt = &pixel_formats[i]; const struct imx_media_pixfmt *fmt = &pixel_formats[i];
enum imx_pixfmt_sel sel; enum imx_pixfmt_sel sel;
unsigned int j; unsigned int j;
if (sel_ipu != fmt->ipufmt)
continue;
sel = fmt->bayer ? PIXFMT_SEL_BAYER : sel = fmt->bayer ? PIXFMT_SEL_BAYER :
((fmt->cs == IPUV3_COLORSPACE_YUV) ? ((fmt->cs == IPUV3_COLORSPACE_YUV) ?
PIXFMT_SEL_YUV : PIXFMT_SEL_RGB); PIXFMT_SEL_YUV : PIXFMT_SEL_RGB);
...@@ -317,79 +316,14 @@ EXPORT_SYMBOL_GPL(imx_media_enum_mbus_format); ...@@ -317,79 +316,14 @@ EXPORT_SYMBOL_GPL(imx_media_enum_mbus_format);
const struct imx_media_pixfmt * const struct imx_media_pixfmt *
imx_media_find_ipu_format(u32 code, enum imx_pixfmt_sel fmt_sel) imx_media_find_ipu_format(u32 code, enum imx_pixfmt_sel fmt_sel)
{ {
const struct imx_media_pixfmt *array, *fmt, *ret = NULL; return find_format(0, code, fmt_sel | PIXFMT_SEL_IPU, false);
u32 array_size;
int i, j;
fmt_sel &= ~PIXFMT_SEL_BAYER;
switch (fmt_sel) {
case PIXFMT_SEL_YUV:
array_size = NUM_IPU_YUV_FORMATS;
array = ipu_yuv_formats;
break;
case PIXFMT_SEL_RGB:
array_size = NUM_IPU_RGB_FORMATS;
array = ipu_rgb_formats;
break;
case PIXFMT_SEL_YUV_RGB:
array_size = NUM_IPU_YUV_FORMATS + NUM_IPU_RGB_FORMATS;
array = ipu_yuv_formats;
break;
default:
return NULL;
}
for (i = 0; i < array_size; i++) {
if (fmt_sel == PIXFMT_SEL_YUV_RGB && i >= NUM_IPU_YUV_FORMATS)
fmt = &ipu_rgb_formats[i - NUM_IPU_YUV_FORMATS];
else
fmt = &array[i];
for (j = 0; code && fmt->codes[j]; j++) {
if (code == fmt->codes[j]) {
ret = fmt;
goto out;
}
}
}
out:
return ret;
} }
EXPORT_SYMBOL_GPL(imx_media_find_ipu_format); EXPORT_SYMBOL_GPL(imx_media_find_ipu_format);
int imx_media_enum_ipu_format(u32 *code, u32 index, int imx_media_enum_ipu_format(u32 *code, u32 index,
enum imx_pixfmt_sel fmt_sel) enum imx_pixfmt_sel fmt_sel)
{ {
fmt_sel &= ~PIXFMT_SEL_BAYER; return enum_format(NULL, code, index, fmt_sel | PIXFMT_SEL_IPU, false);
switch (fmt_sel) {
case PIXFMT_SEL_YUV:
if (index >= NUM_IPU_YUV_FORMATS)
return -EINVAL;
*code = ipu_yuv_formats[index].codes[0];
break;
case PIXFMT_SEL_RGB:
if (index >= NUM_IPU_RGB_FORMATS)
return -EINVAL;
*code = ipu_rgb_formats[index].codes[0];
break;
case PIXFMT_SEL_YUV_RGB:
if (index >= NUM_IPU_YUV_FORMATS + NUM_IPU_RGB_FORMATS)
return -EINVAL;
if (index >= NUM_IPU_YUV_FORMATS) {
index -= NUM_IPU_YUV_FORMATS;
*code = ipu_rgb_formats[index].codes[0];
} else {
*code = ipu_yuv_formats[index].codes[0];
}
break;
default:
return -EINVAL;
}
return 0;
} }
EXPORT_SYMBOL_GPL(imx_media_enum_ipu_format); EXPORT_SYMBOL_GPL(imx_media_enum_ipu_format);
......
...@@ -83,6 +83,7 @@ enum imx_pixfmt_sel { ...@@ -83,6 +83,7 @@ enum imx_pixfmt_sel {
PIXFMT_SEL_YUV = BIT(0), /* select YUV formats */ PIXFMT_SEL_YUV = BIT(0), /* select YUV formats */
PIXFMT_SEL_RGB = BIT(1), /* select RGB formats */ PIXFMT_SEL_RGB = BIT(1), /* select RGB formats */
PIXFMT_SEL_BAYER = BIT(2), /* select BAYER formats */ PIXFMT_SEL_BAYER = BIT(2), /* select BAYER formats */
PIXFMT_SEL_IPU = BIT(3), /* select IPU-internal formats */
PIXFMT_SEL_YUV_RGB = PIXFMT_SEL_YUV | PIXFMT_SEL_RGB, PIXFMT_SEL_YUV_RGB = PIXFMT_SEL_YUV | PIXFMT_SEL_RGB,
PIXFMT_SEL_ANY = PIXFMT_SEL_YUV | PIXFMT_SEL_RGB | PIXFMT_SEL_BAYER, PIXFMT_SEL_ANY = PIXFMT_SEL_YUV | PIXFMT_SEL_RGB | PIXFMT_SEL_BAYER,
}; };
......
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