media: vimc: Support multiple media bus codes for each pixelformat
authorNícolas F. R. A. Prado <nfraprado@protonmail.com>
Fri, 1 May 2020 13:11:02 +0000 (15:11 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 5 May 2020 15:25:14 +0000 (17:25 +0200)
Change vimc_pix_map_list to allow multiple media bus codes to map to the
same pixelformat, making it possible to add media bus codes for which
there are no pixelformat.

Acked-by: Helen Koike <helen.koike@collabora.com>
Signed-off-by: Nícolas F. R. A. Prado <nfraprado@protonmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
[hverkuil-cisco@xs4all.nl: fix sparse warning: const u32 -> u32]
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/test-drivers/vimc/vimc-common.c
drivers/media/test-drivers/vimc/vimc-common.h
drivers/media/test-drivers/vimc/vimc-scaler.c
drivers/media/test-drivers/vimc/vimc-sensor.c

index c95c17c..24dcc28 100644 (file)
@@ -19,19 +19,19 @@ static const struct vimc_pix_map vimc_pix_map_list[] = {
 
        /* RGB formats */
        {
-               .code = MEDIA_BUS_FMT_BGR888_1X24,
+               .code = { MEDIA_BUS_FMT_BGR888_1X24 },
                .pixelformat = V4L2_PIX_FMT_BGR24,
                .bpp = 3,
                .bayer = false,
        },
        {
-               .code = MEDIA_BUS_FMT_RGB888_1X24,
+               .code = { MEDIA_BUS_FMT_RGB888_1X24 },
                .pixelformat = V4L2_PIX_FMT_RGB24,
                .bpp = 3,
                .bayer = false,
        },
        {
-               .code = MEDIA_BUS_FMT_ARGB8888_1X32,
+               .code = { MEDIA_BUS_FMT_ARGB8888_1X32 },
                .pixelformat = V4L2_PIX_FMT_ARGB32,
                .bpp = 4,
                .bayer = false,
@@ -39,49 +39,49 @@ static const struct vimc_pix_map vimc_pix_map_list[] = {
 
        /* Bayer formats */
        {
-               .code = MEDIA_BUS_FMT_SBGGR8_1X8,
+               .code = { MEDIA_BUS_FMT_SBGGR8_1X8 },
                .pixelformat = V4L2_PIX_FMT_SBGGR8,
                .bpp = 1,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SGBRG8_1X8,
+               .code = { MEDIA_BUS_FMT_SGBRG8_1X8 },
                .pixelformat = V4L2_PIX_FMT_SGBRG8,
                .bpp = 1,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SGRBG8_1X8,
+               .code = { MEDIA_BUS_FMT_SGRBG8_1X8 },
                .pixelformat = V4L2_PIX_FMT_SGRBG8,
                .bpp = 1,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SRGGB8_1X8,
+               .code = { MEDIA_BUS_FMT_SRGGB8_1X8 },
                .pixelformat = V4L2_PIX_FMT_SRGGB8,
                .bpp = 1,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SBGGR10_1X10,
+               .code = { MEDIA_BUS_FMT_SBGGR10_1X10 },
                .pixelformat = V4L2_PIX_FMT_SBGGR10,
                .bpp = 2,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SGBRG10_1X10,
+               .code = { MEDIA_BUS_FMT_SGBRG10_1X10 },
                .pixelformat = V4L2_PIX_FMT_SGBRG10,
                .bpp = 2,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SGRBG10_1X10,
+               .code = { MEDIA_BUS_FMT_SGRBG10_1X10 },
                .pixelformat = V4L2_PIX_FMT_SGRBG10,
                .bpp = 2,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SRGGB10_1X10,
+               .code = { MEDIA_BUS_FMT_SRGGB10_1X10 },
                .pixelformat = V4L2_PIX_FMT_SRGGB10,
                .bpp = 2,
                .bayer = true,
@@ -89,25 +89,25 @@ static const struct vimc_pix_map vimc_pix_map_list[] = {
 
        /* 10bit raw bayer a-law compressed to 8 bits */
        {
-               .code = MEDIA_BUS_FMT_SBGGR10_ALAW8_1X8,
+               .code = { MEDIA_BUS_FMT_SBGGR10_ALAW8_1X8 },
                .pixelformat = V4L2_PIX_FMT_SBGGR10ALAW8,
                .bpp = 1,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SGBRG10_ALAW8_1X8,
+               .code = { MEDIA_BUS_FMT_SGBRG10_ALAW8_1X8 },
                .pixelformat = V4L2_PIX_FMT_SGBRG10ALAW8,
                .bpp = 1,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8,
+               .code = { MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8 },
                .pixelformat = V4L2_PIX_FMT_SGRBG10ALAW8,
                .bpp = 1,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SRGGB10_ALAW8_1X8,
+               .code = { MEDIA_BUS_FMT_SRGGB10_ALAW8_1X8 },
                .pixelformat = V4L2_PIX_FMT_SRGGB10ALAW8,
                .bpp = 1,
                .bayer = true,
@@ -115,49 +115,49 @@ static const struct vimc_pix_map vimc_pix_map_list[] = {
 
        /* 10bit raw bayer DPCM compressed to 8 bits */
        {
-               .code = MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8,
+               .code = { MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8 },
                .pixelformat = V4L2_PIX_FMT_SBGGR10DPCM8,
                .bpp = 1,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8,
+               .code = { MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8 },
                .pixelformat = V4L2_PIX_FMT_SGBRG10DPCM8,
                .bpp = 1,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8,
+               .code = { MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8 },
                .pixelformat = V4L2_PIX_FMT_SGRBG10DPCM8,
                .bpp = 1,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8,
+               .code = { MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8 },
                .pixelformat = V4L2_PIX_FMT_SRGGB10DPCM8,
                .bpp = 1,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SBGGR12_1X12,
+               .code = { MEDIA_BUS_FMT_SBGGR12_1X12 },
                .pixelformat = V4L2_PIX_FMT_SBGGR12,
                .bpp = 2,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SGBRG12_1X12,
+               .code = { MEDIA_BUS_FMT_SGBRG12_1X12 },
                .pixelformat = V4L2_PIX_FMT_SGBRG12,
                .bpp = 2,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SGRBG12_1X12,
+               .code = { MEDIA_BUS_FMT_SGRBG12_1X12 },
                .pixelformat = V4L2_PIX_FMT_SGRBG12,
                .bpp = 2,
                .bayer = true,
        },
        {
-               .code = MEDIA_BUS_FMT_SRGGB12_1X12,
+               .code = { MEDIA_BUS_FMT_SRGGB12_1X12 },
                .pixelformat = V4L2_PIX_FMT_SRGGB12,
                .bpp = 2,
                .bayer = true,
@@ -182,13 +182,32 @@ const struct vimc_pix_map *vimc_pix_map_by_index(unsigned int i)
        return &vimc_pix_map_list[i];
 }
 
+u32 vimc_mbus_code_by_index(unsigned int index)
+{
+       unsigned int i, j;
+
+       for (i = 0; i < ARRAY_SIZE(vimc_pix_map_list); i++) {
+               for (j = 0; j < ARRAY_SIZE(vimc_pix_map_list[i].code); j++) {
+                       if (!vimc_pix_map_list[i].code[j])
+                               break;
+
+                       if (!index)
+                               return vimc_pix_map_list[i].code[j];
+                       index--;
+               }
+       }
+       return 0;
+}
+
 const struct vimc_pix_map *vimc_pix_map_by_code(u32 code)
 {
-       unsigned int i;
+       unsigned int i, j;
 
        for (i = 0; i < ARRAY_SIZE(vimc_pix_map_list); i++) {
-               if (vimc_pix_map_list[i].code == code)
-                       return &vimc_pix_map_list[i];
+               for (j = 0; j < ARRAY_SIZE(vimc_pix_map_list[i].code); j++) {
+                       if (vimc_pix_map_list[i].code[j] == code)
+                               return &vimc_pix_map_list[i];
+               }
        }
        return NULL;
 }
index 487bd02..1b5fbed 100644 (file)
@@ -32,6 +32,8 @@
 #define VIMC_IS_SRC(pad)       (pad)
 #define VIMC_IS_SINK(pad)      (!(pad))
 
+#define VIMC_PIX_FMT_MAX_CODES 1
+
 /**
  * vimc_colorimetry_clamp - Adjust colorimetry parameters
  *
@@ -70,7 +72,7 @@ do {                                                                  \
  * V4L2_PIX_FMT_* fourcc pixelformat and its bytes per pixel (bpp)
  */
 struct vimc_pix_map {
-       unsigned int code;
+       unsigned int code[VIMC_PIX_FMT_MAX_CODES];
        unsigned int bpp;
        u32 pixelformat;
        bool bayer;
@@ -170,6 +172,15 @@ extern struct vimc_ent_type vimc_cap_type;
 const struct vimc_pix_map *vimc_pix_map_by_index(unsigned int i);
 
 /**
+ * vimc_mbus_code_by_index - get mbus code by its index
+ *
+ * @index:             index of the mbus code in vimc_pix_map_list
+ *
+ * Returns 0 if no mbus code is found for the given index.
+ */
+u32 vimc_mbus_code_by_index(unsigned int index);
+
+/**
  * vimc_pix_map_by_code - get vimc_pix_map struct by media bus code
  *
  * @code:              media bus format code defined by MEDIA_BUS_FMT_* macros
index 2231e72..121fa7d 100644 (file)
@@ -110,13 +110,19 @@ static int vimc_sca_enum_mbus_code(struct v4l2_subdev *sd,
                                   struct v4l2_subdev_pad_config *cfg,
                                   struct v4l2_subdev_mbus_code_enum *code)
 {
-       const struct vimc_pix_map *vpix = vimc_pix_map_by_index(code->index);
+       u32 mbus_code = vimc_mbus_code_by_index(code->index);
+       const struct vimc_pix_map *vpix;
+
+       if (!mbus_code)
+               return -EINVAL;
+
+       vpix = vimc_pix_map_by_code(mbus_code);
 
        /* We don't support bayer format */
        if (!vpix || vpix->bayer)
                return -EINVAL;
 
-       code->code = vpix->code;
+       code->code = mbus_code;
 
        return 0;
 }
index 56e8ec1..a2f09ac 100644 (file)
@@ -52,12 +52,12 @@ static int vimc_sen_enum_mbus_code(struct v4l2_subdev *sd,
                                   struct v4l2_subdev_pad_config *cfg,
                                   struct v4l2_subdev_mbus_code_enum *code)
 {
-       const struct vimc_pix_map *vpix = vimc_pix_map_by_index(code->index);
+       u32 mbus_code = vimc_mbus_code_by_index(code->index);
 
-       if (!vpix)
+       if (!mbus_code)
                return -EINVAL;
 
-       code->code = vpix->code;
+       code->code = mbus_code;
 
        return 0;
 }