diff mbox series

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

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

Commit Message

Paul Kocialkowski April 15, 2022, 3:27 p.m. UTC
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(-)

Comments

Jernej Škrabec April 27, 2022, 7:30 p.m. UTC | #1
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 mbox series

Patch

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)