media: sun6i-csi: Remove custom format helper and rework configure
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>
This commit is contained in:
Родитель
c2aad41131
Коммит
eee684635d
|
@ -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__ */
|
||||
|
|
|
@ -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_RGB565X:
|
||||
luma_line = width * 2;
|
||||
break;
|
||||
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;
|
||||
luma_line = width;
|
||||
chroma_line = width;
|
||||
break;
|
||||
case V4L2_PIX_FMT_YUV420:
|
||||
case V4L2_PIX_FMT_YVU420:
|
||||
bytesperline_y = width;
|
||||
bytesperline_c = width / 2;
|
||||
case V4L2_PIX_FMT_JPEG:
|
||||
luma_line = width;
|
||||
break;
|
||||
case V4L2_PIX_FMT_YUV422P:
|
||||
bytesperline_y = width;
|
||||
bytesperline_c = width / 2;
|
||||
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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче