Message ID | 20220415152811.636419-27-paul.kocialkowski@bootlin.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Allwinner A31/A83T MIPI CSI-2 and A31 ISP / CSI Rework | expand |
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)
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)
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> --- .../platform/sunxi/sun6i-csi/sun6i_csi.h | 49 ------------- .../sunxi/sun6i-csi/sun6i_csi_capture.c | 70 +++++++++---------- 2 files changed, 35 insertions(+), 84 deletions(-)