diff options
Diffstat (limited to 'drivers/staging/imx-drm')
-rw-r--r-- | drivers/staging/imx-drm/Kconfig | 2 | ||||
-rw-r--r-- | drivers/staging/imx-drm/imx-drm-core.c | 2 | ||||
-rw-r--r-- | drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h | 2 | ||||
-rw-r--r-- | drivers/staging/imx-drm/ipu-v3/ipu-common.c | 67 | ||||
-rw-r--r-- | drivers/staging/imx-drm/ipuv3-crtc.c | 8 | ||||
-rw-r--r-- | drivers/staging/imx-drm/parallel-display.c | 16 |
6 files changed, 66 insertions, 31 deletions
diff --git a/drivers/staging/imx-drm/Kconfig b/drivers/staging/imx-drm/Kconfig index 14b4449..be7e2e3 100644 --- a/drivers/staging/imx-drm/Kconfig +++ b/drivers/staging/imx-drm/Kconfig @@ -3,7 +3,7 @@ config DRM_IMX select DRM_KMS_HELPER select DRM_GEM_CMA_HELPER select DRM_KMS_CMA_HELPER - depends on DRM && ARCH_MXC + depends on DRM && (ARCH_MXC || ARCH_MULTIPLATFORM) help enable i.MX graphics support diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c index 1913199..ecf0f44 100644 --- a/drivers/staging/imx-drm/imx-drm-core.c +++ b/drivers/staging/imx-drm/imx-drm-core.c @@ -824,7 +824,7 @@ static int imx_drm_platform_remove(struct platform_device *pdev) static struct platform_driver imx_drm_pdrv = { .probe = imx_drm_platform_probe, - .remove = __devexit_p(imx_drm_platform_remove), + .remove = imx_drm_platform_remove, .driver = { .owner = THIS_MODULE, .name = "imx-drm", 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..99d1cce 100644 --- a/drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h +++ b/drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h @@ -16,7 +16,6 @@ #include <linux/videodev2.h> #include <linux/bitmap.h> #include <linux/fb.h> -#include <linux/videodev2.h> struct ipu_soc; @@ -293,6 +292,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 f381960..677e665 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) { @@ -234,6 +251,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 +268,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 +330,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 +393,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; @@ -380,6 +405,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); @@ -413,8 +439,9 @@ 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_YVYU: + case V4L2_PIX_FMT_YUYV: return IPUV3_COLORSPACE_YUV; case V4L2_PIX_FMT_RGB32: case V4L2_PIX_FMT_BGR32: @@ -646,8 +673,6 @@ static int ipu_reset(struct ipu_soc *ipu) cpu_relax(); } - mdelay(300); - return 0; } @@ -988,7 +1013,7 @@ static void ipu_irq_exit(struct ipu_soc *ipu) irq_free_descs(ipu->irq_start, IPU_NUM_IRQS); } -static int __devinit ipu_probe(struct platform_device *pdev) +static int ipu_probe(struct platform_device *pdev) { const struct of_device_id *of_id = of_match_device(imx_ipu_dt_ids, &pdev->dev); @@ -1000,13 +1025,11 @@ static int __devinit ipu_probe(struct platform_device *pdev) devtype = of_id->data; - dev_info(&pdev->dev, "Initializing %s\n", devtype->name); - irq_sync = platform_get_irq(pdev, 0); irq_err = platform_get_irq(pdev, 1); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - dev_info(&pdev->dev, "irq_sync: %d irq_err: %d\n", + dev_dbg(&pdev->dev, "irq_sync: %d irq_err: %d\n", irq_sync, irq_err); if (!res || irq_sync < 0 || irq_err < 0) @@ -1026,27 +1049,27 @@ static int __devinit ipu_probe(struct platform_device *pdev) spin_lock_init(&ipu->lock); mutex_init(&ipu->channel_lock); - dev_info(&pdev->dev, "cm_reg: 0x%08lx\n", + dev_dbg(&pdev->dev, "cm_reg: 0x%08lx\n", ipu_base + devtype->cm_ofs); - dev_info(&pdev->dev, "idmac: 0x%08lx\n", + dev_dbg(&pdev->dev, "idmac: 0x%08lx\n", ipu_base + devtype->cm_ofs + IPU_CM_IDMAC_REG_OFS); - dev_info(&pdev->dev, "cpmem: 0x%08lx\n", + dev_dbg(&pdev->dev, "cpmem: 0x%08lx\n", ipu_base + devtype->cpmem_ofs); - dev_info(&pdev->dev, "disp0: 0x%08lx\n", + dev_dbg(&pdev->dev, "disp0: 0x%08lx\n", ipu_base + devtype->disp0_ofs); - dev_info(&pdev->dev, "disp1: 0x%08lx\n", + dev_dbg(&pdev->dev, "disp1: 0x%08lx\n", ipu_base + devtype->disp1_ofs); - dev_info(&pdev->dev, "srm: 0x%08lx\n", + dev_dbg(&pdev->dev, "srm: 0x%08lx\n", ipu_base + devtype->srm_ofs); - dev_info(&pdev->dev, "tpm: 0x%08lx\n", + dev_dbg(&pdev->dev, "tpm: 0x%08lx\n", ipu_base + devtype->tpm_ofs); - dev_info(&pdev->dev, "dc: 0x%08lx\n", + dev_dbg(&pdev->dev, "dc: 0x%08lx\n", ipu_base + devtype->cm_ofs + IPU_CM_DC_REG_OFS); - dev_info(&pdev->dev, "ic: 0x%08lx\n", + dev_dbg(&pdev->dev, "ic: 0x%08lx\n", ipu_base + devtype->cm_ofs + IPU_CM_IC_REG_OFS); - dev_info(&pdev->dev, "dmfc: 0x%08lx\n", + dev_dbg(&pdev->dev, "dmfc: 0x%08lx\n", ipu_base + devtype->cm_ofs + IPU_CM_DMFC_REG_OFS); - dev_info(&pdev->dev, "vdi: 0x%08lx\n", + dev_dbg(&pdev->dev, "vdi: 0x%08lx\n", ipu_base + devtype->vdi_ofs); ipu->cm_reg = devm_ioremap(&pdev->dev, @@ -1098,6 +1121,8 @@ static int __devinit ipu_probe(struct platform_device *pdev) goto failed_add_clients; } + dev_info(&pdev->dev, "%s probed\n", devtype->name); + return 0; failed_add_clients: @@ -1111,7 +1136,7 @@ failed_ioremap: return ret; } -static int __devexit ipu_remove(struct platform_device *pdev) +static int ipu_remove(struct platform_device *pdev) { struct ipu_soc *ipu = platform_get_drvdata(pdev); struct resource *res; @@ -1133,7 +1158,7 @@ static struct platform_driver imx_ipu_driver = { .of_match_table = imx_ipu_dt_ids, }, .probe = ipu_probe, - .remove = __devexit_p(ipu_remove), + .remove = ipu_remove, }; module_platform_driver(imx_ipu_driver); diff --git a/drivers/staging/imx-drm/ipuv3-crtc.c b/drivers/staging/imx-drm/ipuv3-crtc.c index 78d3eda..1892006 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: @@ -530,7 +530,7 @@ err_put_resources: return ret; } -static int __devinit ipu_drm_probe(struct platform_device *pdev) +static int ipu_drm_probe(struct platform_device *pdev) { struct ipu_client_platformdata *pdata = pdev->dev.platform_data; struct ipu_crtc *ipu_crtc; @@ -554,7 +554,7 @@ static int __devinit ipu_drm_probe(struct platform_device *pdev) return 0; } -static int __devexit ipu_drm_remove(struct platform_device *pdev) +static int ipu_drm_remove(struct platform_device *pdev) { struct ipu_crtc *ipu_crtc = platform_get_drvdata(pdev); @@ -570,7 +570,7 @@ static struct platform_driver ipu_drm_driver = { .name = "imx-ipuv3-crtc", }, .probe = ipu_drm_probe, - .remove = __devexit_p(ipu_drm_remove), + .remove = ipu_drm_remove, }; module_platform_driver(ipu_drm_driver); diff --git a/drivers/staging/imx-drm/parallel-display.c b/drivers/staging/imx-drm/parallel-display.c index 9b51d73..a8064fc 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" @@ -188,18 +189,27 @@ static int imx_pd_register(struct imx_parallel_display *imxpd) return 0; } -static int __devinit imx_pd_probe(struct platform_device *pdev) +static int imx_pd_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; const u8 *edidp; 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); @@ -225,7 +235,7 @@ static int __devinit imx_pd_probe(struct platform_device *pdev) return 0; } -static int __devexit imx_pd_remove(struct platform_device *pdev) +static int imx_pd_remove(struct platform_device *pdev) { struct imx_parallel_display *imxpd = platform_get_drvdata(pdev); struct drm_connector *connector = &imxpd->connector; @@ -246,7 +256,7 @@ static const struct of_device_id imx_pd_dt_ids[] = { static struct platform_driver imx_pd_driver = { .probe = imx_pd_probe, - .remove = __devexit_p(imx_pd_remove), + .remove = imx_pd_remove, .driver = { .of_match_table = imx_pd_dt_ids, .name = "imx-parallel-display", |