Re: [PATCH v4 26/45] media: sun6i-csi: Remove custom format helper and rework configure

Jernej Škrabec
2022-04-27T19:31:17Z

Dne petek, 15. april 2022 ob 17:27:52 CEST je Paul Kocialkowski napisal(a):
> 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>

Best regards,
Jernej

> ---
> .../platform/sunxi/sun6i-csi/sun6i_csi.h | 49 -------------
> .../sunxi/sun6i-csi/sun6i_csi_capture.c | 70 +++++++++----------
> 2 files changed, 35 insertions(+), 84 deletions(-)
>
> diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
> b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h index
> f54ad2f438f8..dd90ffdae5d5 100644
> --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
> +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h
> @@ -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__ */
> diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c
> b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c index
> 2aa65a4ddb85..c4e803a38851 100644
> --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c
> +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c
> @@ -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)