diff options
Diffstat (limited to 'drivers/staging/imx-drm')
-rw-r--r-- | drivers/staging/imx-drm/Kconfig | 5 | ||||
-rw-r--r-- | drivers/staging/imx-drm/TODO | 1 | ||||
-rw-r--r-- | drivers/staging/imx-drm/imx-drm-core.c | 26 | ||||
-rw-r--r-- | drivers/staging/imx-drm/imx-ldb.c | 3 | ||||
-rw-r--r-- | drivers/staging/imx-drm/imx-tve.c | 27 | ||||
-rw-r--r-- | drivers/staging/imx-drm/ipu-v3/ipu-common.c | 17 | ||||
-rw-r--r-- | drivers/staging/imx-drm/ipu-v3/ipu-dc.c | 5 | ||||
-rw-r--r-- | drivers/staging/imx-drm/ipu-v3/ipu-di.c | 4 | ||||
-rw-r--r-- | drivers/staging/imx-drm/ipu-v3/ipu-dp.c | 13 | ||||
-rw-r--r-- | drivers/staging/imx-drm/ipuv3-crtc.c | 4 | ||||
-rw-r--r-- | drivers/staging/imx-drm/parallel-display.c | 1 |
11 files changed, 56 insertions, 50 deletions
diff --git a/drivers/staging/imx-drm/Kconfig b/drivers/staging/imx-drm/Kconfig index 22339059837f..394254f7d6b5 100644 --- a/drivers/staging/imx-drm/Kconfig +++ b/drivers/staging/imx-drm/Kconfig @@ -15,7 +15,7 @@ config DRM_IMX_FB_HELPER help The DRM framework can provide a legacy /dev/fb0 framebuffer for your device. This is necessary to get a framebuffer console - and also for appplications using the legacy framebuffer API + and also for applications using the legacy framebuffer API config DRM_IMX_PARALLEL_DISPLAY tristate "Support for parallel displays" @@ -32,8 +32,7 @@ config DRM_IMX_TVE config DRM_IMX_LDB tristate "Support for LVDS displays" - depends on DRM_IMX - select OF_VIDEOMODE + depends on DRM_IMX && MFD_SYSCON help Choose this to enable the internal LVDS Display Bridge (LDB) found on i.MX53 and i.MX6 processors. diff --git a/drivers/staging/imx-drm/TODO b/drivers/staging/imx-drm/TODO index f80641528f75..9cfa2a7efdc0 100644 --- a/drivers/staging/imx-drm/TODO +++ b/drivers/staging/imx-drm/TODO @@ -10,7 +10,6 @@ TODO: Missing features (not necessarily for moving out of staging): - Add KMS plane support for CRTC driver -- Add LDB (LVDS Display Bridge) support - Add i.MX6 HDMI support - Add support for IC (Image converter) - Add support for CSI (CMOS Sensor interface) diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c index 9854a1daf606..47c5888461ff 100644 --- a/drivers/staging/imx-drm/imx-drm-core.c +++ b/drivers/staging/imx-drm/imx-drm-core.c @@ -69,28 +69,20 @@ struct imx_drm_connector { struct module *owner; }; -static int imx_drm_driver_firstopen(struct drm_device *drm) -{ - if (!imx_drm_device_get()) - return -EINVAL; - - return 0; -} - static void imx_drm_driver_lastclose(struct drm_device *drm) { struct imx_drm_device *imxdrm = drm->dev_private; if (imxdrm->fbhelper) drm_fbdev_cma_restore_mode(imxdrm->fbhelper); - - imx_drm_device_put(); } static int imx_drm_driver_unload(struct drm_device *drm) { struct imx_drm_device *imxdrm = drm->dev_private; + imx_drm_device_put(); + drm_mode_config_cleanup(imxdrm->drm); drm_kms_helper_poll_fini(imxdrm->drm); @@ -207,7 +199,6 @@ static const struct file_operations imx_drm_driver_fops = { .unlocked_ioctl = drm_ioctl, .mmap = drm_gem_cma_mmap, .poll = drm_poll, - .fasync = drm_fasync, .read = drm_read, .llseek = noop_llseek, }; @@ -226,8 +217,6 @@ struct drm_device *imx_drm_device_get(void) struct imx_drm_connector *con; struct imx_drm_crtc *crtc; - mutex_lock(&imxdrm->mutex); - list_for_each_entry(enc, &imxdrm->encoder_list, list) { if (!try_module_get(enc->owner)) { dev_err(imxdrm->dev, "could not get module %s\n", @@ -254,8 +243,6 @@ struct drm_device *imx_drm_device_get(void) imxdrm->references++; - mutex_unlock(&imxdrm->mutex); - return imxdrm->drm; unwind_crtc: @@ -447,6 +434,9 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags) */ imxdrm->drm->vblank_disable_allowed = 1; + if (!imx_drm_device_get()) + ret = -EINVAL; + ret = 0; err_init: @@ -678,6 +668,7 @@ found: return i; } +EXPORT_SYMBOL_GPL(imx_drm_encoder_get_mux_id); /* * imx_drm_remove_encoder - remove an encoder @@ -783,7 +774,7 @@ int imx_drm_remove_connector(struct imx_drm_connector *imx_drm_connector) } EXPORT_SYMBOL_GPL(imx_drm_remove_connector); -static struct drm_ioctl_desc imx_drm_ioctls[] = { +static const struct drm_ioctl_desc imx_drm_ioctls[] = { /* none so far */ }; @@ -791,13 +782,12 @@ static struct drm_driver imx_drm_driver = { .driver_features = DRIVER_MODESET | DRIVER_GEM, .load = imx_drm_driver_load, .unload = imx_drm_driver_unload, - .firstopen = imx_drm_driver_firstopen, .lastclose = imx_drm_driver_lastclose, .gem_free_object = drm_gem_cma_free_object, .gem_vm_ops = &drm_gem_cma_vm_ops, .dumb_create = drm_gem_cma_dumb_create, .dumb_map_offset = drm_gem_cma_dumb_map_offset, - .dumb_destroy = drm_gem_cma_dumb_destroy, + .dumb_destroy = drm_gem_dumb_destroy, .get_vblank_counter = drm_vblank_count, .enable_vblank = imx_drm_enable_vblank, diff --git a/drivers/staging/imx-drm/imx-ldb.c b/drivers/staging/imx-drm/imx-ldb.c index 8af7f3b40bae..af733ea48565 100644 --- a/drivers/staging/imx-drm/imx-ldb.c +++ b/drivers/staging/imx-drm/imx-ldb.c @@ -497,7 +497,7 @@ static int imx_ldb_probe(struct platform_device *pdev) imx_ldb->ldb_ctrl |= LDB_SPLIT_MODE_EN; /* - * There are three diferent possible clock mux configurations: + * There are three different possible clock mux configurations: * i.MX53: ipu1_di0_sel, ipu1_di1_sel * i.MX6q: ipu1_di0_sel, ipu1_di1_sel, ipu2_di0_sel, ipu2_di1_sel * i.MX6dl: ipu1_di0_sel, ipu1_di1_sel, lcdif_sel @@ -623,3 +623,4 @@ module_platform_driver(imx_ldb_driver); MODULE_DESCRIPTION("i.MX LVDS driver"); MODULE_AUTHOR("Sascha Hauer, Pengutronix"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:" DRIVER_NAME); diff --git a/drivers/staging/imx-drm/imx-tve.c b/drivers/staging/imx-drm/imx-tve.c index a56797d88edc..33d6525cf996 100644 --- a/drivers/staging/imx-drm/imx-tve.c +++ b/drivers/staging/imx-drm/imx-tve.c @@ -21,7 +21,7 @@ #include <linux/clk.h> #include <linux/clk-provider.h> #include <linux/module.h> -#include <linux/of_i2c.h> +#include <linux/i2c.h> #include <linux/regmap.h> #include <linux/regulator/consumer.h> #include <linux/spinlock.h> @@ -131,12 +131,14 @@ struct imx_tve { }; static void tve_lock(void *__tve) +__acquires(&tve->lock) { struct imx_tve *tve = __tve; spin_lock(&tve->lock); } static void tve_unlock(void *__tve) +__releases(&tve->lock) { struct imx_tve *tve = __tve; spin_unlock(&tve->lock); @@ -164,7 +166,10 @@ static void tve_enable(struct imx_tve *tve) regmap_write(tve->regmap, TVE_INT_CONT_REG, 0); else regmap_write(tve->regmap, TVE_INT_CONT_REG, - TVE_CD_SM_IEN | TVE_CD_LM_IEN | TVE_CD_MON_END_IEN); + TVE_CD_SM_IEN | + TVE_CD_LM_IEN | + TVE_CD_MON_END_IEN); + spin_unlock_irqrestore(&tve->enable_lock, flags); } @@ -465,7 +470,9 @@ static int clk_tve_di_set_rate(struct clk_hw *hw, unsigned long rate, else val = TVE_DAC_FULL_RATE; - ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, TVE_DAC_SAMP_RATE_MASK, val); + ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, + TVE_DAC_SAMP_RATE_MASK, val); + if (ret < 0) { dev_err(tve->dev, "failed to set divider: %d\n", ret); return ret; @@ -609,13 +616,17 @@ static int imx_tve_probe(struct platform_device *pdev) } if (tve->mode == TVE_MODE_VGA) { - ret = of_property_read_u32(np, "fsl,hsync-pin", &tve->hsync_pin); + ret = of_property_read_u32(np, "fsl,hsync-pin", + &tve->hsync_pin); + if (ret < 0) { dev_err(&pdev->dev, "failed to get vsync pin\n"); return ret; } - ret |= of_property_read_u32(np, "fsl,vsync-pin", &tve->vsync_pin); + ret |= of_property_read_u32(np, "fsl,vsync-pin", + &tve->vsync_pin); + if (ret < 0) { dev_err(&pdev->dev, "failed to get vsync pin\n"); return ret; @@ -623,11 +634,6 @@ static int imx_tve_probe(struct platform_device *pdev) } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "failed to get memory region\n"); - return -ENOENT; - } - base = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(base)) return PTR_ERR(base); @@ -743,3 +749,4 @@ module_platform_driver(imx_tve_driver); MODULE_DESCRIPTION("i.MX Television Encoder driver"); MODULE_AUTHOR("Philipp Zabel, Pengutronix"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:imx-tve"); diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-common.c b/drivers/staging/imx-drm/ipu-v3/ipu-common.c index e35d0bf03c7b..ba464e5d9f12 100644 --- a/drivers/staging/imx-drm/ipu-v3/ipu-common.c +++ b/drivers/staging/imx-drm/ipu-v3/ipu-common.c @@ -1075,21 +1075,23 @@ static int ipu_probe(struct platform_device *pdev) ipu->cpmem_base = devm_ioremap(&pdev->dev, ipu_base + devtype->cpmem_ofs, PAGE_SIZE); - if (!ipu->cm_reg || !ipu->idmac_reg || !ipu->cpmem_base) { - ret = -ENOMEM; - goto failed_ioremap; - } + if (!ipu->cm_reg || !ipu->idmac_reg || !ipu->cpmem_base) + return -ENOMEM; ipu->clk = devm_clk_get(&pdev->dev, "bus"); if (IS_ERR(ipu->clk)) { ret = PTR_ERR(ipu->clk); dev_err(&pdev->dev, "clk_get failed with %d", ret); - goto failed_clk_get; + return ret; } platform_set_drvdata(pdev, ipu); - clk_prepare_enable(ipu->clk); + ret = clk_prepare_enable(ipu->clk); + if (ret) { + dev_err(&pdev->dev, "clk_prepare_enable failed: %d\n", ret); + return ret; + } ipu->dev = &pdev->dev; ipu->irq_sync = irq_sync; @@ -1134,8 +1136,6 @@ out_failed_reset: ipu_irq_exit(ipu); out_failed_irq: clk_disable_unprepare(ipu->clk); -failed_clk_get: -failed_ioremap: return ret; } @@ -1163,6 +1163,7 @@ static struct platform_driver imx_ipu_driver = { module_platform_driver(imx_ipu_driver); +MODULE_ALIAS("platform:imx-ipuv3"); MODULE_DESCRIPTION("i.MX IPU v3 driver"); MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>"); MODULE_LICENSE("GPL"); diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-dc.c b/drivers/staging/imx-drm/ipu-v3/ipu-dc.c index 59f03f9aefc3..21bf1c806528 100644 --- a/drivers/staging/imx-drm/ipu-v3/ipu-dc.c +++ b/drivers/staging/imx-drm/ipu-v3/ipu-dc.c @@ -161,14 +161,15 @@ int ipu_dc_init_sync(struct ipu_dc *dc, struct ipu_di *di, bool interlaced, u32 pixel_fmt, u32 width) { struct ipu_dc_priv *priv = dc->priv; - u32 reg = 0, map; + u32 reg = 0; + int map; dc->di = ipu_di_get_num(di); map = ipu_pixfmt_to_map(pixel_fmt); if (map < 0) { dev_dbg(priv->dev, "IPU_DISP: No MAP\n"); - return -EINVAL; + return map; } if (interlaced) { diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-di.c b/drivers/staging/imx-drm/ipu-v3/ipu-di.c index 0b6806e2069c..948a49b289ef 100644 --- a/drivers/staging/imx-drm/ipu-v3/ipu-di.c +++ b/drivers/staging/imx-drm/ipu-v3/ipu-di.c @@ -654,7 +654,9 @@ EXPORT_SYMBOL_GPL(ipu_di_init_sync_panel); int ipu_di_enable(struct ipu_di *di) { - clk_prepare_enable(di->clk_di_pixel); + int ret = clk_prepare_enable(di->clk_di_pixel); + if (ret) + return ret; ipu_module_enable(di->ipu, di->module); diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-dp.c b/drivers/staging/imx-drm/ipu-v3/ipu-dp.c index 113b046c0225..231afd6c60f8 100644 --- a/drivers/staging/imx-drm/ipu-v3/ipu-dp.c +++ b/drivers/staging/imx-drm/ipu-v3/ipu-dp.c @@ -46,6 +46,8 @@ #define DP_COM_CONF_CSC_DEF_BG (2 << 8) #define DP_COM_CONF_CSC_DEF_BOTH (1 << 8) +#define IPUV3_NUM_FLOWS 3 + struct ipu_dp_priv; struct ipu_dp { @@ -67,7 +69,7 @@ struct ipu_dp_priv { struct ipu_soc *ipu; struct device *dev; void __iomem *base; - struct ipu_flow flow[3]; + struct ipu_flow flow[IPUV3_NUM_FLOWS]; struct mutex mutex; int use_count; }; @@ -280,7 +282,7 @@ struct ipu_dp *ipu_dp_get(struct ipu_soc *ipu, unsigned int flow) struct ipu_dp_priv *priv = ipu->dp_priv; struct ipu_dp *dp; - if (flow > 5) + if ((flow >> 1) >= IPUV3_NUM_FLOWS) return ERR_PTR(-EINVAL); if (flow & 1) @@ -309,19 +311,20 @@ int ipu_dp_init(struct ipu_soc *ipu, struct device *dev, unsigned long base) int i; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; priv->dev = dev; priv->ipu = ipu; ipu->dp_priv = priv; priv->base = devm_ioremap(dev, base, PAGE_SIZE); - if (!priv->base) { + if (!priv->base) return -ENOMEM; - } mutex_init(&priv->mutex); - for (i = 0; i < 3; i++) { + for (i = 0; i < IPUV3_NUM_FLOWS; i++) { priv->flow[i].foreground.foreground = 1; priv->flow[i].base = priv->base + ipu_dp_flow_base[i]; priv->flow[i].priv = priv; diff --git a/drivers/staging/imx-drm/ipuv3-crtc.c b/drivers/staging/imx-drm/ipuv3-crtc.c index 9176a8171e6f..6fd37a7453e9 100644 --- a/drivers/staging/imx-drm/ipuv3-crtc.c +++ b/drivers/staging/imx-drm/ipuv3-crtc.c @@ -129,7 +129,8 @@ static void ipu_crtc_dpms(struct drm_crtc *crtc, int mode) static int ipu_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb, - struct drm_pending_vblank_event *event) + struct drm_pending_vblank_event *event, + uint32_t page_flip_flags) { struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); int ret; @@ -562,3 +563,4 @@ module_platform_driver(ipu_drm_driver); MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>"); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:imx-ipuv3-crtc"); diff --git a/drivers/staging/imx-drm/parallel-display.c b/drivers/staging/imx-drm/parallel-display.c index cea9f14fff4a..24aa9beedcfb 100644 --- a/drivers/staging/imx-drm/parallel-display.c +++ b/drivers/staging/imx-drm/parallel-display.c @@ -272,3 +272,4 @@ module_platform_driver(imx_pd_driver); MODULE_DESCRIPTION("i.MX parallel display driver"); MODULE_AUTHOR("Sascha Hauer, Pengutronix"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:imx-parallel-display"); |