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@xxxxxxxxxxx> Acked-by: Jernej Skrabec <jernej.skrabec@xxxxxxxxx> 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)