The following contains some assorted updates to the i.MX drm driver for the next merge window.
Sascha
---------------------------------------------------------------- Michael Olbrich (1): staging: drm/imx: Fix YUYV support in i.MX IPUv3 base driver
Philipp Zabel (4): staging: drm/imx: Add YVU420 support to i.MX IPUv3 base driver staging: drm/imx: silence ipu_crtc_dpms debug message staging: drm/imx: Add ipu_cpmem_set_yuv_interleaved() staging: drm/imx: Remove 300ms delay after memory reset
Sascha Hauer (1): staging: drm/imx: Add pinctrl support to parallel display driver
drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h | 1 + drivers/staging/imx-drm/ipu-v3/ipu-common.c | 33 +++++++++++++++++++++++---- drivers/staging/imx-drm/ipuv3-crtc.c | 2 +- drivers/staging/imx-drm/parallel-display.c | 10 ++++++++ 4 files changed, 41 insertions(+), 5 deletions(-)
From: Michael Olbrich m.olbrich@pengutronix.de
YVYU is not supported by the IPU, so remove partial handling of this format and replace it with YUYV which is supported.
Signed-off-by: Michael Olbrich m.olbrich@pengutronix.de Signed-off-by: Philipp Zabel p.zabel@pengutronix.de Signed-off-by: Sascha Hauer s.hauer@pengutronix.de --- drivers/staging/imx-drm/ipu-v3/ipu-common.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-common.c b/drivers/staging/imx-drm/ipu-v3/ipu-common.c index f381960..04f6aba 100644 --- a/drivers/staging/imx-drm/ipu-v3/ipu-common.c +++ b/drivers/staging/imx-drm/ipu-v3/ipu-common.c @@ -380,6 +380,7 @@ int ipu_cpmem_set_image(struct ipu_ch_param __iomem *cpmem, ipu_cpmem_set_buffer(cpmem, 0, image->phys + y_offset); break; case V4L2_PIX_FMT_UYVY: + case V4L2_PIX_FMT_YUYV: ipu_cpmem_set_buffer(cpmem, 0, image->phys + image->rect.left * 2 + image->rect.top * image->pix.bytesperline); @@ -414,7 +415,7 @@ enum ipu_color_space ipu_pixelformat_to_colorspace(u32 pixelformat) switch (pixelformat) { case V4L2_PIX_FMT_YUV420: case V4L2_PIX_FMT_UYVY: - case V4L2_PIX_FMT_YVYU: + case V4L2_PIX_FMT_YUYV: return IPUV3_COLORSPACE_YUV; case V4L2_PIX_FMT_RGB32: case V4L2_PIX_FMT_BGR32:
From: Philipp Zabel p.zabel@pengutronix.de
Signed-off-by: Philipp Zabel p.zabel@pengutronix.de Signed-off-by: Sascha Hauer s.hauer@pengutronix.de --- drivers/staging/imx-drm/ipu-v3/ipu-common.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-common.c b/drivers/staging/imx-drm/ipu-v3/ipu-common.c index 04f6aba..a5cec0e 100644 --- a/drivers/staging/imx-drm/ipu-v3/ipu-common.c +++ b/drivers/staging/imx-drm/ipu-v3/ipu-common.c @@ -234,6 +234,11 @@ void ipu_cpmem_set_yuv_planar_full(struct ipu_ch_param __iomem *p, ipu_ch_param_write_field(p, IPU_FIELD_UBO, u_offset / 8); ipu_ch_param_write_field(p, IPU_FIELD_VBO, v_offset / 8); break; + case V4L2_PIX_FMT_YVU420: + ipu_ch_param_write_field(p, IPU_FIELD_SLUV, (stride / 2) - 1); + ipu_ch_param_write_field(p, IPU_FIELD_UBO, v_offset / 8); + ipu_ch_param_write_field(p, IPU_FIELD_VBO, u_offset / 8); + break; } } EXPORT_SYMBOL_GPL(ipu_cpmem_set_yuv_planar_full); @@ -246,10 +251,11 @@ void ipu_cpmem_set_yuv_planar(struct ipu_ch_param __iomem *p, u32 pixel_format,
switch (pixel_format) { case V4L2_PIX_FMT_YUV420: + case V4L2_PIX_FMT_YVU420: uv_stride = stride / 2; u_offset = stride * height; v_offset = u_offset + (uv_stride * height / 2); - ipu_cpmem_set_yuv_planar_full(p, V4L2_PIX_FMT_YUV420, stride, + ipu_cpmem_set_yuv_planar_full(p, pixel_format, stride, u_offset, v_offset); break; } @@ -307,6 +313,7 @@ int ipu_cpmem_set_fmt(struct ipu_ch_param __iomem *cpmem, u32 pixelformat) { switch (pixelformat) { case V4L2_PIX_FMT_YUV420: + case V4L2_PIX_FMT_YVU420: /* pix format */ ipu_ch_param_write_field(cpmem, IPU_FIELD_PFS, 2); /* burst size */ @@ -369,6 +376,7 @@ int ipu_cpmem_set_image(struct ipu_ch_param __iomem *cpmem,
switch (pix->pixelformat) { case V4L2_PIX_FMT_YUV420: + case V4L2_PIX_FMT_YVU420: y_offset = Y_OFFSET(pix, image->rect.left, image->rect.top); u_offset = U_OFFSET(pix, image->rect.left, image->rect.top) - y_offset; @@ -414,6 +422,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_UYVY: case V4L2_PIX_FMT_YUYV: return IPUV3_COLORSPACE_YUV;
From: Philipp Zabel p.zabel@pengutronix.de
It's for debugging only, so use dev_dbg.
Signed-off-by: Philipp Zabel p.zabel@pengutronix.de Signed-off-by: Sascha Hauer s.hauer@pengutronix.de --- drivers/staging/imx-drm/ipuv3-crtc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/staging/imx-drm/ipuv3-crtc.c b/drivers/staging/imx-drm/ipuv3-crtc.c index 78d3eda..7e85c59 100644 --- a/drivers/staging/imx-drm/ipuv3-crtc.c +++ b/drivers/staging/imx-drm/ipuv3-crtc.c @@ -116,7 +116,7 @@ static void ipu_crtc_dpms(struct drm_crtc *crtc, int mode) { struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
- dev_info(ipu_crtc->dev, "%s mode: %d\n", __func__, mode); + dev_dbg(ipu_crtc->dev, "%s mode: %d\n", __func__, mode);
switch (mode) { case DRM_MODE_DPMS_ON:
From: Philipp Zabel p.zabel@pengutronix.de
For configuring interleaved formats.
Signed-off-by: Philipp Zabel p.zabel@pengutronix.de Signed-off-by: Sascha Hauer s.hauer@pengutronix.de --- drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h | 1 + drivers/staging/imx-drm/ipu-v3/ipu-common.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+)
diff --git a/drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h b/drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h index 74158dd..22c1196 100644 --- a/drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h +++ b/drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h @@ -293,6 +293,7 @@ static inline void ipu_cpmem_interlaced_scan(struct ipu_ch_param *p,
void ipu_cpmem_set_yuv_planar(struct ipu_ch_param __iomem *p, u32 pixel_format, int stride, int height); +void ipu_cpmem_set_yuv_interleaved(struct ipu_ch_param *p, u32 pixel_format); void ipu_cpmem_set_yuv_planar_full(struct ipu_ch_param __iomem *p, u32 pixel_format, int stride, int u_offset, int v_offset); int ipu_cpmem_set_fmt(struct ipu_ch_param __iomem *cpmem, u32 pixelformat); diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-common.c b/drivers/staging/imx-drm/ipu-v3/ipu-common.c index a5cec0e..d871bb6 100644 --- a/drivers/staging/imx-drm/ipu-v3/ipu-common.c +++ b/drivers/staging/imx-drm/ipu-v3/ipu-common.c @@ -225,6 +225,23 @@ int ipu_cpmem_set_format_passthrough(struct ipu_ch_param __iomem *p, } EXPORT_SYMBOL_GPL(ipu_cpmem_set_format_passthrough);
+void ipu_cpmem_set_yuv_interleaved(struct ipu_ch_param *p, u32 pixel_format) +{ + switch (pixel_format) { + case V4L2_PIX_FMT_UYVY: + ipu_ch_param_write_field(p, IPU_FIELD_BPP, 3); /* bits/pixel */ + ipu_ch_param_write_field(p, IPU_FIELD_PFS, 0xA); /* pix format */ + ipu_ch_param_write_field(p, IPU_FIELD_NPB, 31); /* burst size */ + break; + case V4L2_PIX_FMT_YUYV: + ipu_ch_param_write_field(p, IPU_FIELD_BPP, 3); /* bits/pixel */ + ipu_ch_param_write_field(p, IPU_FIELD_PFS, 0x8); /* pix format */ + ipu_ch_param_write_field(p, IPU_FIELD_NPB, 31); /* burst size */ + break; + } +} +EXPORT_SYMBOL_GPL(ipu_cpmem_set_yuv_interleaved); + void ipu_cpmem_set_yuv_planar_full(struct ipu_ch_param __iomem *p, u32 pixel_format, int stride, int u_offset, int v_offset) {
To allow the iomux to be configured for the display.
Signed-off-by: Sascha Hauer s.hauer@pengutronix.de --- drivers/staging/imx-drm/parallel-display.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/drivers/staging/imx-drm/parallel-display.c b/drivers/staging/imx-drm/parallel-display.c index 9b51d73..324283c 100644 --- a/drivers/staging/imx-drm/parallel-display.c +++ b/drivers/staging/imx-drm/parallel-display.c @@ -23,6 +23,7 @@ #include <drm/drm_fb_helper.h> #include <drm/drm_crtc_helper.h> #include <linux/videodev2.h> +#include <linux/pinctrl/consumer.h>
#include "imx-drm.h"
@@ -195,11 +196,20 @@ static int __devinit imx_pd_probe(struct platform_device *pdev) struct imx_parallel_display *imxpd; int ret; const char *fmt; + struct pinctrl *pinctrl;
imxpd = devm_kzalloc(&pdev->dev, sizeof(*imxpd), GFP_KERNEL); if (!imxpd) return -ENOMEM;
+ pinctrl = devm_pinctrl_get_select_default(&pdev->dev); + if (IS_ERR(pinctrl)) { + ret = PTR_ERR(pinctrl); + dev_warn(&pdev->dev, "pinctrl_get_select_default failed with %d", + ret); + return ret; + } + edidp = of_get_property(np, "edid", &imxpd->edid_len); if (edidp) imxpd->edid = kmemdup(edidp, imxpd->edid_len, GFP_KERNEL);
From: Philipp Zabel p.zabel@pengutronix.de
This has been added once, but does not seem to be necessary. Tested on i.MX51 and i.MX6.
Signed-off-by: Philipp Zabel p.zabel@pengutronix.de Signed-off-by: Sascha Hauer s.hauer@pengutronix.de --- drivers/staging/imx-drm/ipu-v3/ipu-common.c | 2 -- 1 file changed, 2 deletions(-)
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-common.c b/drivers/staging/imx-drm/ipu-v3/ipu-common.c index d871bb6..147c3e9 100644 --- a/drivers/staging/imx-drm/ipu-v3/ipu-common.c +++ b/drivers/staging/imx-drm/ipu-v3/ipu-common.c @@ -673,8 +673,6 @@ static int ipu_reset(struct ipu_soc *ipu) cpu_relax(); }
- mdelay(300); - return 0; }
dri-devel@lists.freedesktop.org