media: imx: utils: Introduce PIXFMT_SEL_IPU
authorSteve Longerbeam <slongerbeam@gmail.com>
Mon, 6 Apr 2020 16:39:01 +0000 (18:39 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 21 Apr 2020 11:18:46 +0000 (13:18 +0200)
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: Steve Longerbeam <slongerbeam@gmail.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/staging/media/imx/imx-media-utils.c
drivers/staging/media/imx/imx-media.h

index 32acece14a6f754e244f87e51feb0c97a08b37ec..7566e0ae5e8189a849bc34ea14c8501688680a06 100644 (file)
@@ -53,6 +53,12 @@ static const struct imx_media_pixfmt pixel_formats[] = {
                .cs     = IPUV3_COLORSPACE_YUV,
                .bpp    = 16,
                .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 ***/
        {
@@ -73,6 +79,11 @@ static const struct imx_media_pixfmt pixel_formats[] = {
                .fourcc = V4L2_PIX_FMT_BGR24,
                .cs     = IPUV3_COLORSPACE_RGB,
                .bpp    = 24,
+       }, {
+               .fourcc = V4L2_PIX_FMT_XRGB32,
+               .codes  = {MEDIA_BUS_FMT_ARGB8888_1X32},
+               .cs     = IPUV3_COLORSPACE_RGB,
+               .bpp    = 32,
        }, {
                .fourcc = V4L2_PIX_FMT_XRGB32,
                .codes  = {MEDIA_BUS_FMT_ARGB8888_1X32},
@@ -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,
                                                  u32 code,
                                                  enum imx_pixfmt_sel fmt_sel,
                                                  bool allow_non_mbus)
 {
+       bool sel_ipu = fmt_sel & PIXFMT_SEL_IPU;
        unsigned int i;
 
+       fmt_sel &= ~PIXFMT_SEL_IPU;
+
        for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) {
                const struct imx_media_pixfmt *fmt = &pixel_formats[i];
                enum imx_pixfmt_sel sel;
                unsigned int j;
 
+               if (sel_ipu != fmt->ipufmt)
+                       continue;
+
                sel = fmt->bayer ? PIXFMT_SEL_BAYER :
                        ((fmt->cs == IPUV3_COLORSPACE_YUV) ?
                         PIXFMT_SEL_YUV : PIXFMT_SEL_RGB);
@@ -249,13 +242,19 @@ static int enum_format(u32 *fourcc, u32 *code, u32 index,
                       enum imx_pixfmt_sel fmt_sel,
                       bool allow_non_mbus)
 {
+       bool sel_ipu = fmt_sel & PIXFMT_SEL_IPU;
        unsigned int i;
 
+       fmt_sel &= ~PIXFMT_SEL_IPU;
+
        for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) {
                const struct imx_media_pixfmt *fmt = &pixel_formats[i];
                enum imx_pixfmt_sel sel;
                unsigned int j;
 
+               if (sel_ipu != fmt->ipufmt)
+                       continue;
+
                sel = fmt->bayer ? PIXFMT_SEL_BAYER :
                        ((fmt->cs == IPUV3_COLORSPACE_YUV) ?
                         PIXFMT_SEL_YUV : PIXFMT_SEL_RGB);
@@ -317,79 +316,14 @@ EXPORT_SYMBOL_GPL(imx_media_enum_mbus_format);
 const struct imx_media_pixfmt *
 imx_media_find_ipu_format(u32 code, enum imx_pixfmt_sel fmt_sel)
 {
-       const struct imx_media_pixfmt *array, *fmt, *ret = NULL;
-       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;
+       return find_format(0, code, fmt_sel | PIXFMT_SEL_IPU, false);
 }
 EXPORT_SYMBOL_GPL(imx_media_find_ipu_format);
 
 int imx_media_enum_ipu_format(u32 *code, u32 index,
                              enum imx_pixfmt_sel fmt_sel)
 {
-       fmt_sel &= ~PIXFMT_SEL_BAYER;
-
-       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;
+       return enum_format(NULL, code, index, fmt_sel | PIXFMT_SEL_IPU, false);
 }
 EXPORT_SYMBOL_GPL(imx_media_enum_ipu_format);
 
index ac7c521d8148d75b4053750192ad41ed16ac2e9d..c61592750729d86f116b8e4e9c2dd71398dd179d 100644 (file)
@@ -83,6 +83,7 @@ enum imx_pixfmt_sel {
        PIXFMT_SEL_YUV   = BIT(0), /* select YUV formats */
        PIXFMT_SEL_RGB   = BIT(1), /* select RGB 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_ANY = PIXFMT_SEL_YUV | PIXFMT_SEL_RGB | PIXFMT_SEL_BAYER,
 };