From e1c49bdcdbe31008919ac81e08b46b14e30afd12 Mon Sep 17 00:00:00 2001 From: Thierry Reding Date: Wed, 2 Dec 2015 17:23:31 +0100 Subject: drm/omap: Use platform_register/unregister_drivers() These new helpers simplify implementing multi-driver modules and properly handle failure to register one driver by unregistering all previously registered drivers. Signed-off-by: Thierry Reding Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/omap_drv.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/omap_drv.c') diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index 5c6609cbb6a2..db6d05576685 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -928,35 +928,23 @@ static struct platform_driver pdev = { .remove = pdev_remove, }; +static struct platform_driver * const drivers[] = { + &omap_dmm_driver, + &pdev, +}; + static int __init omap_drm_init(void) { - int r; - DBG("init"); - r = platform_driver_register(&omap_dmm_driver); - if (r) { - pr_err("DMM driver registration failed\n"); - return r; - } - - r = platform_driver_register(&pdev); - if (r) { - pr_err("omapdrm driver registration failed\n"); - platform_driver_unregister(&omap_dmm_driver); - return r; - } - - return 0; + return platform_register_drivers(drivers, ARRAY_SIZE(drivers)); } static void __exit omap_drm_fini(void) { DBG("fini"); - platform_driver_unregister(&pdev); - - platform_driver_unregister(&omap_dmm_driver); + platform_unregister_drivers(drivers, ARRAY_SIZE(drivers)); } /* need late_initcall() so we load after dss_driver's are loaded */ -- cgit v1.2.3 From e1c1174f8d5602b497bd237b7a937b58b58e6b95 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Mon, 14 Dec 2015 22:39:30 +0200 Subject: drm: omapdrm: Make fbdev emulation optional Don't compile the fbdev emulation code when fbdev emulation support is disabled. Signed-off-by: Laurent Pinchart Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/Makefile | 3 ++- drivers/gpu/drm/omapdrm/omap_debugfs.c | 4 ++++ drivers/gpu/drm/omapdrm/omap_drv.c | 4 ---- drivers/gpu/drm/omapdrm/omap_drv.h | 10 ++++++++++ drivers/gpu/drm/omapdrm/omap_fbdev.c | 4 ++++ drivers/gpu/drm/omapdrm/omap_gem.c | 4 ++++ 6 files changed, 24 insertions(+), 5 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/omap_drv.c') diff --git a/drivers/gpu/drm/omapdrm/Makefile b/drivers/gpu/drm/omapdrm/Makefile index 778372b062ad..368c1ec6805a 100644 --- a/drivers/gpu/drm/omapdrm/Makefile +++ b/drivers/gpu/drm/omapdrm/Makefile @@ -12,10 +12,11 @@ omapdrm-y := omap_drv.o \ omap_encoder.o \ omap_connector.o \ omap_fb.o \ - omap_fbdev.o \ omap_gem.o \ omap_gem_dmabuf.o \ omap_dmm_tiler.o \ tcm-sita.o +omapdrm-$(CONFIG_DRM_FBDEV_EMULATION) += omap_fbdev.o + obj-$(CONFIG_DRM_OMAP) += omapdrm.o diff --git a/drivers/gpu/drm/omapdrm/omap_debugfs.c b/drivers/gpu/drm/omapdrm/omap_debugfs.c index ee91a25127f9..6f5fc14fc015 100644 --- a/drivers/gpu/drm/omapdrm/omap_debugfs.c +++ b/drivers/gpu/drm/omapdrm/omap_debugfs.c @@ -51,6 +51,7 @@ static int mm_show(struct seq_file *m, void *arg) return drm_mm_dump_table(m, &dev->vma_offset_manager->vm_addr_space_mm); } +#ifdef CONFIG_DRM_FBDEV_EMULATION static int fb_show(struct seq_file *m, void *arg) { struct drm_info_node *node = (struct drm_info_node *) m->private; @@ -73,12 +74,15 @@ static int fb_show(struct seq_file *m, void *arg) return 0; } +#endif /* list of debufs files that are applicable to all devices */ static struct drm_info_list omap_debugfs_list[] = { {"gem", gem_show, 0}, {"mm", mm_show, 0}, +#ifdef CONFIG_DRM_FBDEV_EMULATION {"fb", fb_show, 0}, +#endif }; /* list of debugfs files that are specific to devices with dmm/tiler */ diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index db6d05576685..1e80b0243f9c 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -692,10 +692,6 @@ static int dev_load(struct drm_device *dev, unsigned long flags) drm_crtc_vblank_off(priv->crtcs[i]); priv->fbdev = omap_fbdev_init(dev); - if (!priv->fbdev) { - dev_warn(dev->dev, "omap_fbdev_init failed\n"); - /* well, limp along without an fbdev.. maybe X11 will work? */ - } /* store off drm_device for use in pm ops */ dev_set_drvdata(dev->dev, dev); diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h index 130fca70bfd7..289d9b0984e2 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.h +++ b/drivers/gpu/drm/omapdrm/omap_drv.h @@ -138,8 +138,18 @@ void omap_irq_unregister(struct drm_device *dev, struct omap_drm_irq *irq); void omap_drm_irq_uninstall(struct drm_device *dev); int omap_drm_irq_install(struct drm_device *dev); +#ifdef CONFIG_DRM_FBDEV_EMULATION struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev); void omap_fbdev_free(struct drm_device *dev); +#else +static inline struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev) +{ + return NULL; +} +static inline void omap_fbdev_free(struct drm_device *dev) +{ +} +#endif struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc); enum omap_channel omap_crtc_channel(struct drm_crtc *crtc); diff --git a/drivers/gpu/drm/omapdrm/omap_fbdev.c b/drivers/gpu/drm/omapdrm/omap_fbdev.c index 24f92bea39c7..3cb16f0cf381 100644 --- a/drivers/gpu/drm/omapdrm/omap_fbdev.c +++ b/drivers/gpu/drm/omapdrm/omap_fbdev.c @@ -295,6 +295,10 @@ fini: drm_fb_helper_fini(helper); fail: kfree(fbdev); + + dev_warn(dev->dev, "omap_fbdev_init failed\n"); + /* well, limp along without an fbdev.. maybe X11 will work? */ + return NULL; } diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c index 7ed08fdc4c42..374ce2adc811 100644 --- a/drivers/gpu/drm/omapdrm/omap_gem.c +++ b/drivers/gpu/drm/omapdrm/omap_gem.c @@ -653,6 +653,7 @@ fail: return ret; } +#ifdef CONFIG_DRM_FBDEV_EMULATION /* Set scrolling position. This allows us to implement fast scrolling * for console. * @@ -689,6 +690,7 @@ fail: return ret; } +#endif /* Sync the buffer for CPU access.. note pages should already be * attached, ie. omap_gem_get_pages() @@ -924,6 +926,7 @@ int omap_gem_put_pages(struct drm_gem_object *obj) return 0; } +#ifdef CONFIG_DRM_FBDEV_EMULATION /* Get kernel virtual address for CPU access.. this more or less only * exists for omap_fbdev. This should be called with struct_mutex * held. @@ -942,6 +945,7 @@ void *omap_gem_vaddr(struct drm_gem_object *obj) } return omap_obj->vaddr; } +#endif #ifdef CONFIG_PM /* re-pin objects in DMM in resume path: */ -- cgit v1.2.3 From ef3f4e998240c33a9a424d5c1dbb045f2b919d43 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Mon, 14 Dec 2015 22:39:36 +0200 Subject: drm: omapdrm: gem: Mask out private flags passed from userspace The 8 high order bits of the buffer flags are reserved for internal use. Mask them out from the flags passed by userspace. Signed-off-by: Laurent Pinchart Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/omap_drv.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/omap_drv.c') diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index 1e80b0243f9c..cc7905566228 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -547,14 +547,19 @@ static int ioctl_set_param(struct drm_device *dev, void *data, return 0; } +#define OMAP_BO_USER_MASK 0x00ffffff /* flags settable by userspace */ + static int ioctl_gem_new(struct drm_device *dev, void *data, struct drm_file *file_priv) { struct drm_omap_gem_new *args = data; + u32 flags = args->flags & OMAP_BO_USER_MASK; + VERB("%p:%p: size=0x%08x, flags=%08x", dev, file_priv, - args->size.bytes, args->flags); - return omap_gem_new_handle(dev, file_priv, args->size, - args->flags, &args->handle); + args->size.bytes, flags); + + return omap_gem_new_handle(dev, file_priv, args->size, flags, + &args->handle); } static int ioctl_gem_cpu_prep(struct drm_device *dev, void *data, -- cgit v1.2.3 From 728fea775caf6f72f6139f820df0917239333f1e Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 2 Oct 2015 11:10:41 +0300 Subject: drm/omap: set DRIVER_ATOMIC for omapdrm omapdrm supports atomic modesetting, and it seems to work ok. So let's set the flag to enable the atomic modesetting API support. Signed-off-by: Tomi Valkeinen Acked-by: Laurent Pinchart --- drivers/gpu/drm/omapdrm/omap_drv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'drivers/gpu/drm/omapdrm/omap_drv.c') diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index cc7905566228..dfafdb602ad2 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -832,7 +832,8 @@ static const struct file_operations omapdriver_fops = { }; static struct drm_driver omap_drm_driver = { - .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME, + .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | + DRIVER_ATOMIC, .load = dev_load, .unload = dev_unload, .open = dev_open, -- cgit v1.2.3