media: sun6i-csi: Remove custom format helper and rework configure
authorPaul Kocialkowski <paul.kocialkowski@bootlin.com>
Thu, 3 Nov 2022 16:30:56 +0000 (16:30 +0000)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 25 Nov 2022 07:09:00 +0000 (07:09 +0000)
Remove the custom sun6i_csi_get_bpp helper in favor of common v4l2
infrastructure and rework the related window configuration code.

Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Acked-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c

index d828d98ace7cccc6a3e52443bfa233e0e31471dc..a4df8f8d29808bc3ec0c0871c0e78efde79d16d6 100644 (file)
@@ -60,53 +60,4 @@ struct sun6i_csi_variant {
 bool sun6i_csi_is_format_supported(struct sun6i_csi_device *csi_dev,
                                   u32 pixformat, u32 mbus_code);
 
-/* get bpp form v4l2 pixformat */
-static inline int sun6i_csi_get_bpp(unsigned int pixformat)
-{
-       switch (pixformat) {
-       case V4L2_PIX_FMT_SBGGR8:
-       case V4L2_PIX_FMT_SGBRG8:
-       case V4L2_PIX_FMT_SGRBG8:
-       case V4L2_PIX_FMT_SRGGB8:
-       case V4L2_PIX_FMT_JPEG:
-               return 8;
-       case V4L2_PIX_FMT_SBGGR10:
-       case V4L2_PIX_FMT_SGBRG10:
-       case V4L2_PIX_FMT_SGRBG10:
-       case V4L2_PIX_FMT_SRGGB10:
-               return 10;
-       case V4L2_PIX_FMT_SBGGR12:
-       case V4L2_PIX_FMT_SGBRG12:
-       case V4L2_PIX_FMT_SGRBG12:
-       case V4L2_PIX_FMT_SRGGB12:
-       case V4L2_PIX_FMT_NV12_16L16:
-       case V4L2_PIX_FMT_NV12:
-       case V4L2_PIX_FMT_NV21:
-       case V4L2_PIX_FMT_YUV420:
-       case V4L2_PIX_FMT_YVU420:
-               return 12;
-       case V4L2_PIX_FMT_YUYV:
-       case V4L2_PIX_FMT_YVYU:
-       case V4L2_PIX_FMT_UYVY:
-       case V4L2_PIX_FMT_VYUY:
-       case V4L2_PIX_FMT_NV16:
-       case V4L2_PIX_FMT_NV61:
-       case V4L2_PIX_FMT_YUV422P:
-       case V4L2_PIX_FMT_RGB565:
-       case V4L2_PIX_FMT_RGB565X:
-               return 16;
-       case V4L2_PIX_FMT_RGB24:
-       case V4L2_PIX_FMT_BGR24:
-               return 24;
-       case V4L2_PIX_FMT_RGB32:
-       case V4L2_PIX_FMT_BGR32:
-               return 32;
-       default:
-               WARN(1, "Unsupported pixformat: 0x%x\n", pixformat);
-               break;
-       }
-
-       return 0;
-}
-
 #endif /* __SUN6I_CSI_H__ */
index 3aa8f1eb866cc26af5b25688a5ba7a8c76faa867..04f4aaf6cbd03ec294aba60d1327814f4cfe4c39 100644 (file)
@@ -483,68 +483,68 @@ static void sun6i_csi_capture_configure_format(struct sun6i_csi_device *csi_dev)
 
 static void sun6i_csi_capture_configure_window(struct sun6i_csi_device *csi_dev)
 {
+       struct regmap *regmap = csi_dev->regmap;
+       const struct v4l2_format_info *info;
+       u32 hsize_len, vsize_len;
+       u32 luma_line, chroma_line = 0;
        u32 pixelformat, field;
        u32 width, height;
-       u32 bytesperline_y;
-       u32 bytesperline_c;
-       u32 hor_len;
 
        sun6i_csi_capture_dimensions(csi_dev, &width, &height);
        sun6i_csi_capture_format(csi_dev, &pixelformat, &field);
 
-       hor_len = width;
+       hsize_len = width;
+       vsize_len = height;
 
        switch (pixelformat) {
        case V4L2_PIX_FMT_YUYV:
        case V4L2_PIX_FMT_YVYU:
        case V4L2_PIX_FMT_UYVY:
        case V4L2_PIX_FMT_VYUY:
-               dev_dbg(csi_dev->dev,
-                       "Horizontal length should be 2 times of width for packed YUV formats!\n");
-               hor_len = width * 2;
+               /*
+                * Horizontal length should be 2 times of width for packed
+                * YUV formats.
+                */
+               hsize_len *= 2;
                break;
        default:
                break;
        }
 
-       regmap_write(csi_dev->regmap, SUN6I_CSI_CH_HSIZE_REG,
-                    SUN6I_CSI_CH_HSIZE_LEN(hor_len) |
+       regmap_write(regmap, SUN6I_CSI_CH_HSIZE_REG,
+                    SUN6I_CSI_CH_HSIZE_LEN(hsize_len) |
                     SUN6I_CSI_CH_HSIZE_START(0));
-       regmap_write(csi_dev->regmap, SUN6I_CSI_CH_VSIZE_REG,
-                    SUN6I_CSI_CH_VSIZE_LEN(height) |
+
+       regmap_write(regmap, SUN6I_CSI_CH_VSIZE_REG,
+                    SUN6I_CSI_CH_VSIZE_LEN(vsize_len) |
                     SUN6I_CSI_CH_VSIZE_START(0));
 
        switch (pixelformat) {
-       case V4L2_PIX_FMT_NV12_16L16:
-       case V4L2_PIX_FMT_NV12:
-       case V4L2_PIX_FMT_NV21:
-       case V4L2_PIX_FMT_NV16:
-       case V4L2_PIX_FMT_NV61:
-               bytesperline_y = width;
-               bytesperline_c = width;
+       case V4L2_PIX_FMT_RGB565X:
+               luma_line = width * 2;
                break;
-       case V4L2_PIX_FMT_YUV420:
-       case V4L2_PIX_FMT_YVU420:
-               bytesperline_y = width;
-               bytesperline_c = width / 2;
+       case V4L2_PIX_FMT_NV12_16L16:
+               luma_line = width;
+               chroma_line = width;
                break;
-       case V4L2_PIX_FMT_YUV422P:
-               bytesperline_y = width;
-               bytesperline_c = width / 2;
+       case V4L2_PIX_FMT_JPEG:
+               luma_line = width;
                break;
-       default: /* raw */
-               dev_dbg(csi_dev->dev,
-                       "Calculating pixelformat(0x%x)'s bytesperline as a packed format\n",
-                       pixelformat);
-               bytesperline_y = (sun6i_csi_get_bpp(pixelformat) *
-                                 width) / 8;
-               bytesperline_c = 0;
+       default:
+               info = v4l2_format_info(pixelformat);
+               if (WARN_ON(!info))
+                       return;
+
+               luma_line = width * info->bpp[0];
+
+               if (info->comp_planes > 1)
+                       chroma_line = width * info->bpp[1] / info->hdiv;
                break;
        }
 
-       regmap_write(csi_dev->regmap, SUN6I_CSI_CH_BUF_LEN_REG,
-                    SUN6I_CSI_CH_BUF_LEN_CHROMA_LINE(bytesperline_c) |
-                    SUN6I_CSI_CH_BUF_LEN_LUMA_LINE(bytesperline_y));
+       regmap_write(regmap, SUN6I_CSI_CH_BUF_LEN_REG,
+                    SUN6I_CSI_CH_BUF_LEN_CHROMA_LINE(chroma_line) |
+                    SUN6I_CSI_CH_BUF_LEN_LUMA_LINE(luma_line));
 }
 
 static void sun6i_csi_capture_configure(struct sun6i_csi_device *csi_dev)