From: Philipp Zabel <philipp.zabel@xxxxxxxxx> Signed-off-by: Philipp Zabel <philipp.zabel@xxxxxxxxx> --- drivers/gpu/ipu-v3/ipu-common.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c index 7a0b377..cd4f584 100644 --- a/drivers/gpu/ipu-v3/ipu-common.c +++ b/drivers/gpu/ipu-v3/ipu-common.c @@ -251,6 +251,7 @@ void ipu_cpmem_set_yuv_planar_full(struct ipu_ch_param __iomem *p, { switch (pixel_format) { case V4L2_PIX_FMT_YUV420: + case V4L2_PIX_FMT_YUV422P: ipu_ch_param_write_field(p, IPU_FIELD_SLUV, (stride / 2) - 1); ipu_ch_param_write_field(p, IPU_FIELD_UBO, u_offset / 8); ipu_ch_param_write_field(p, IPU_FIELD_VBO, v_offset / 8); @@ -284,6 +285,13 @@ void ipu_cpmem_set_yuv_planar(struct ipu_ch_param __iomem *p, u32 pixel_format, ipu_cpmem_set_yuv_planar_full(p, pixel_format, stride, u_offset, v_offset); break; + case V4L2_PIX_FMT_YUV422P: + uv_stride = stride / 2; + u_offset = stride * height; + v_offset = u_offset + (uv_stride * height); + ipu_cpmem_set_yuv_planar_full(p, pixel_format, stride, + u_offset, v_offset); + break; case V4L2_PIX_FMT_NV12: u_offset = v_offset = stride * height; ipu_cpmem_set_yuv_planar_full(p, pixel_format, stride, @@ -347,6 +355,11 @@ static const struct ipu_rgb def_bgr_16 = { #define V_OFFSET(pix, x, y) ((pix->width * pix->height) + \ (pix->width * pix->height / 4) + \ (pix->width * (y) / 4) + (x) / 2) +#define U_OFFSET2(pix, x, y) ((pix->width * pix->height) + \ + (pix->width * (y) / 2) + (x) / 2) +#define V_OFFSET2(pix, x, y) ((pix->width * pix->height) + \ + (pix->width * pix->height / 2) + \ + (pix->width * (y) / 2) + (x) / 2) int ipu_cpmem_set_fmt(struct ipu_ch_param __iomem *cpmem, u32 drm_fourcc) { @@ -358,6 +371,11 @@ int ipu_cpmem_set_fmt(struct ipu_ch_param __iomem *cpmem, u32 drm_fourcc) /* burst size */ ipu_ch_param_write_field(cpmem, IPU_FIELD_NPB, 63); break; + case DRM_FORMAT_YUV422: + case DRM_FORMAT_YVU422: + ipu_ch_param_write_field(cpmem, IPU_FIELD_PFS, 1); + ipu_ch_param_write_field(cpmem, IPU_FIELD_NPB, 63); + break; case DRM_FORMAT_NV12: ipu_ch_param_write_field(cpmem, IPU_FIELD_PFS, 4); ipu_ch_param_write_field(cpmem, IPU_FIELD_NPB, 63); @@ -447,6 +465,8 @@ static int v4l2_pix_fmt_to_drm_fourcc(u32 pixelformat) return DRM_FORMAT_YUV420; case V4L2_PIX_FMT_YVU420: return DRM_FORMAT_YVU420; + case V4L2_PIX_FMT_YUV422P: + return DRM_FORMAT_YUV422; case V4L2_PIX_FMT_NV12: return DRM_FORMAT_NV12; } @@ -474,6 +494,8 @@ enum ipu_color_space ipu_drm_fourcc_to_colorspace(u32 drm_fourcc) case DRM_FORMAT_UYVY: case DRM_FORMAT_YUV420: case DRM_FORMAT_YVU420: + case DRM_FORMAT_YUV422: + case DRM_FORMAT_YVU422: case DRM_FORMAT_NV12: return IPUV3_COLORSPACE_YUV; default: @@ -511,6 +533,17 @@ int ipu_cpmem_set_image(struct ipu_ch_param __iomem *cpmem, pix->bytesperline, u_offset, v_offset); ipu_cpmem_set_buffer(cpmem, 0, image->phys + y_offset); break; + case V4L2_PIX_FMT_YUV422P: + y_offset = Y_OFFSET(pix, image->rect.left, image->rect.top); + u_offset = U_OFFSET2(pix, image->rect.left, + image->rect.top) - y_offset; + v_offset = V_OFFSET2(pix, image->rect.left, + image->rect.top) - y_offset; + + ipu_cpmem_set_yuv_planar_full(cpmem, pix->pixelformat, + pix->bytesperline, u_offset, v_offset); + ipu_cpmem_set_buffer(cpmem, 0, image->phys + y_offset); + break; case V4L2_PIX_FMT_NV12: y_offset = Y_OFFSET(pix, image->rect.left, image->rect.top); u_offset = U_OFFSET(pix, image->rect.left, @@ -579,6 +612,7 @@ enum ipu_color_space ipu_pixelformat_to_colorspace(u32 pixelformat) switch (pixelformat) { case V4L2_PIX_FMT_YUV420: case V4L2_PIX_FMT_YVU420: + case V4L2_PIX_FMT_YUV422P: case V4L2_PIX_FMT_UYVY: case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_NV12: -- 2.0.0.rc2 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html