Message ID | 20171013145944.26557-21-laurent.pinchart@ideasonboard.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, On Fri, Oct 13, 2017 at 05:59:16PM +0300, Laurent Pinchart wrote: > The split between the omapdss and omapdrm driver is historic and was due > to other userspace APIs (FBDEV and V4L2) being supported in addition to > DRM/KMS. Now that the drivers only supports the DRM/KMS API, there is no > need to keep them separate anymore. > > Merge the two drivers and remove the now unneeded omapdrm virtual > platform device. > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > drivers/gpu/drm/omapdrm/Kconfig | 5 +- > drivers/gpu/drm/omapdrm/Makefile | 25 ++++++++++ > drivers/gpu/drm/omapdrm/dss/Kconfig | 12 ----- > drivers/gpu/drm/omapdrm/dss/Makefile | 25 ---------- > drivers/gpu/drm/omapdrm/dss/base.c | 13 ----- > drivers/gpu/drm/omapdrm/dss/core.c | 14 ++---- > drivers/gpu/drm/omapdrm/dss/dss.c | 23 ++++++++- > drivers/gpu/drm/omapdrm/dss/omapdss.h | 4 -- > drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | 12 ++++- > drivers/gpu/drm/omapdrm/omap_dmm_tiler.h | 3 +- > drivers/gpu/drm/omapdrm/omap_drv.c | 82 ++------------------------------ > drivers/gpu/drm/omapdrm/omap_drv.h | 4 ++ > 12 files changed, 74 insertions(+), 148 deletions(-) > > diff --git a/drivers/gpu/drm/omapdrm/Kconfig b/drivers/gpu/drm/omapdrm/Kconfig > index b3d08c5f41d4..7e5080e45b16 100644 > --- a/drivers/gpu/drm/omapdrm/Kconfig > +++ b/drivers/gpu/drm/omapdrm/Kconfig > @@ -2,8 +2,11 @@ config DRM_OMAP > tristate "OMAP DRM" > depends on DRM > depends on ARCH_OMAP2PLUS || ARCH_MULTIPLATFORM > - select OMAP2_DSS > select DRM_KMS_HELPER > + select HDMI > + select OMAP2_DSS As far as I can see "CONFIG_OMAP2_DSS" no longer exists after the merge, so this can be dropped. Otherwise: Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> -- Sebastian > + select OMAP2_DSS_INIT > + select VIDEOMODE_HELPERS > default n > help > DRM display driver for OMAP2/3/4 based boards. > diff --git a/drivers/gpu/drm/omapdrm/Makefile b/drivers/gpu/drm/omapdrm/Makefile > index b391be7ecb6c..1dafa51ca00e 100644 > --- a/drivers/gpu/drm/omapdrm/Makefile > +++ b/drivers/gpu/drm/omapdrm/Makefile > @@ -21,4 +21,29 @@ omapdrm-y := omap_drv.o \ > > omapdrm-$(CONFIG_DRM_FBDEV_EMULATION) += omap_fbdev.o > > +# Core DSS files > +omapdrm-y += \ > + dss/base.o \ > + dss/core.o \ > + dss/dispc.o \ > + dss/dispc_coefs.o \ > + dss/display.o \ > + dss/dss.o \ > + dss/dss-of.o \ > + dss/output.o \ > + dss/pll.o \ > + dss/video-pll.o > + > +omapdrm-$(CONFIG_OMAP2_DSS_DPI) += dss/dpi.o > +omapdrm-$(CONFIG_OMAP2_DSS_VENC) += dss/venc.o > +omapdrm-$(CONFIG_OMAP2_DSS_SDI) += dss/sdi.o > +omapdrm-$(CONFIG_OMAP2_DSS_DSI) += dss/dsi.o > +omapdrm-$(CONFIG_OMAP2_DSS_HDMI_COMMON) += dss/hdmi_common.o dss/hdmi_wp.o \ > + dss/hdmi_pll.o dss/hdmi_phy.o > +omapdrm-$(CONFIG_OMAP4_DSS_HDMI) += dss/hdmi4.o dss/hdmi4_core.o > +omapdrm-$(CONFIG_OMAP4_DSS_HDMI_CEC) += dss/hdmi4_cec.o > +omapdrm-$(CONFIG_OMAP5_DSS_HDMI) += dss/hdmi5.o dss/hdmi5_core.o > + > +ccflags-$(CONFIG_OMAP2_DSS_DEBUG) += -DDEBUG > + > obj-$(CONFIG_DRM_OMAP) += omapdrm.o > diff --git a/drivers/gpu/drm/omapdrm/dss/Kconfig b/drivers/gpu/drm/omapdrm/dss/Kconfig > index 39a30a64448a..157c5601e4be 100644 > --- a/drivers/gpu/drm/omapdrm/dss/Kconfig > +++ b/drivers/gpu/drm/omapdrm/dss/Kconfig > @@ -1,16 +1,6 @@ > config OMAP2_DSS_INIT > bool > > -menuconfig OMAP2_DSS > - tristate "OMAP2+ Display Subsystem support" > - select VIDEOMODE_HELPERS > - select OMAP2_DSS_INIT > - select HDMI > - help > - OMAP2+ Display Subsystem support. > - > -if OMAP2_DSS > - > config OMAP2_DSS_DEBUG > bool "Debug support" > default n > @@ -126,5 +116,3 @@ config OMAP2_DSS_SLEEP_AFTER_VENC_RESET > > This option enables the sleep, and is enabled by default. You can > disable the sleep if it doesn't cause problems on your platform. > - > -endif > diff --git a/drivers/gpu/drm/omapdrm/dss/Makefile b/drivers/gpu/drm/omapdrm/dss/Makefile > index 531b4d8075e5..3db4bf31aeaf 100644 > --- a/drivers/gpu/drm/omapdrm/dss/Makefile > +++ b/drivers/gpu/drm/omapdrm/dss/Makefile > @@ -1,26 +1 @@ > obj-$(CONFIG_OMAP2_DSS_INIT) += omapdss-boot-init.o > -obj-$(CONFIG_OMAP2_DSS) += omapdss.o > - > -# Core DSS files > -omapdss-y := \ > - base.o \ > - display.o \ > - dss-of.o \ > - output.o \ > - core.o \ > - dss.o \ > - dispc.o \ > - dispc_coefs.o \ > - pll.o \ > - video-pll.o > - > -omapdss-$(CONFIG_OMAP2_DSS_DPI) += dpi.o > -omapdss-$(CONFIG_OMAP2_DSS_VENC) += venc.o > -omapdss-$(CONFIG_OMAP2_DSS_SDI) += sdi.o > -omapdss-$(CONFIG_OMAP2_DSS_DSI) += dsi.o > -omapdss-$(CONFIG_OMAP2_DSS_HDMI_COMMON) += hdmi_common.o hdmi_wp.o hdmi_pll.o \ > - hdmi_phy.o > -omapdss-$(CONFIG_OMAP4_DSS_HDMI) += hdmi4.o hdmi4_core.o > -omapdss-$(CONFIG_OMAP4_DSS_HDMI_CEC) += hdmi4_cec.o > -omapdss-$(CONFIG_OMAP5_DSS_HDMI) += hdmi5.o hdmi5_core.o > -ccflags-$(CONFIG_OMAP2_DSS_DEBUG) += -DDEBUG > diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c > index eff427dd3297..5729f8244bf9 100644 > --- a/drivers/gpu/drm/omapdrm/dss/base.c > +++ b/drivers/gpu/drm/omapdrm/dss/base.c > @@ -5,7 +5,6 @@ > #include <linux/list.h> > #include "omapdss.h" > > -static bool dss_initialized; > static const struct dispc_ops *ops; > > static struct list_head omapdss_comp_list; > @@ -16,17 +15,6 @@ struct omapdss_comp_node { > bool dss_core_component; > }; > > -void omapdss_set_is_initialized(bool set) > -{ > - dss_initialized = set; > -} > - > -bool omapdss_is_initialized(void) > -{ > - return dss_initialized; > -} > -EXPORT_SYMBOL(omapdss_is_initialized); > - > void dispc_set_ops(const struct dispc_ops *o) > { > ops = o; > @@ -130,4 +118,3 @@ bool omapdss_stack_is_ready(void) > > return true; > } > -EXPORT_SYMBOL(omapdss_stack_is_ready); > diff --git a/drivers/gpu/drm/omapdrm/dss/core.c b/drivers/gpu/drm/omapdrm/dss/core.c > index 197ddbc1512b..776f43601288 100644 > --- a/drivers/gpu/drm/omapdrm/dss/core.c > +++ b/drivers/gpu/drm/omapdrm/dss/core.c > @@ -24,13 +24,14 @@ > > #include <linux/kernel.h> > #include <linux/module.h> > -#include <linux/platform_device.h> > > #include "omapdss.h" > #include "dss.h" > +#include "../omap_dmm_tiler.h" > > /* INIT */ > static int (*dss_output_drv_reg_funcs[])(void) __initdata = { > + dmm_init_platform_driver, > dss_init_platform_driver, > dispc_init_platform_driver, > #ifdef CONFIG_OMAP2_DSS_DSI > @@ -62,10 +63,9 @@ static void (*dss_output_drv_unreg_funcs[])(void) = { > #endif > dispc_uninit_platform_driver, > dss_uninit_platform_driver, > + dmm_uninit_platform_driver, > }; > > -static struct platform_device *omap_drm_device; > - > static int __init omap_dss_init(void) > { > int r; > @@ -77,12 +77,6 @@ static int __init omap_dss_init(void) > goto err_reg; > } > > - omap_drm_device = platform_device_register_simple("omapdrm", 0, NULL, 0); > - if (IS_ERR(omap_drm_device)) { > - r = PTR_ERR(omap_drm_device); > - goto err_reg; > - } > - > return 0; > > err_reg: > @@ -98,8 +92,6 @@ static void __exit omap_dss_exit(void) > { > int i; > > - platform_device_unregister(omap_drm_device); > - > for (i = 0; i < ARRAY_SIZE(dss_output_drv_unreg_funcs); ++i) > dss_output_drv_unreg_funcs[i](); > } > diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c > index a27edc56a509..5721f3d64bdd 100644 > --- a/drivers/gpu/drm/omapdrm/dss/dss.c > +++ b/drivers/gpu/drm/omapdrm/dss/dss.c > @@ -49,6 +49,7 @@ > > #include "omapdss.h" > #include "dss.h" > +#include "../omap_drv.h" > > #define DSS_SZ_REGS SZ_512 > > @@ -94,6 +95,8 @@ struct dss_features { > > static struct { > struct platform_device *pdev; > + struct omap_drm_private drm; > + > void __iomem *base; > struct regmap *syscon_pll_ctrl; > u32 syscon_pll_ctrl_offset; > @@ -1366,10 +1369,15 @@ static int dss_bind(struct device *dev) > pm_set_vt_switch(0); > > omapdss_gather_components(dev); > - omapdss_set_is_initialized(true); > + > + r = omapdrm_init(&dss.drm, dev); > + if (r) > + goto err_drm_init; > > return 0; > > +err_drm_init: > + component_unbind_all(&pdev->dev, NULL); > err_component: > err_runtime_get: > pm_runtime_disable(&pdev->dev); > @@ -1390,7 +1398,7 @@ static void dss_unbind(struct device *dev) > { > struct platform_device *pdev = to_platform_device(dev); > > - omapdss_set_is_initialized(false); > + omapdrm_cleanup(&dss.drm); > > component_unbind_all(&pdev->dev, NULL); > > @@ -1531,7 +1539,18 @@ static int dss_runtime_resume(struct device *dev) > return 0; > } > > +static int dss_suspend(struct device *dev) > +{ > + return omap_drm_suspend(&dss.drm); > +} > + > +static int dss_resume(struct device *dev) > +{ > + return omap_drm_resume(&dss.drm); > +} > + > static const struct dev_pm_ops dss_pm_ops = { > + SET_SYSTEM_SLEEP_PM_OPS(dss_suspend, dss_resume) > .runtime_suspend = dss_runtime_suspend, > .runtime_resume = dss_runtime_resume, > }; > diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h > index 3a6b33ff2990..6f9b9b2d8af2 100644 > --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h > +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h > @@ -583,8 +583,6 @@ struct omap_dss_driver { > const struct hdmi_avi_infoframe *avi); > }; > > -bool omapdss_is_initialized(void); > - > int omap_dss_register_driver(struct omap_dss_driver *); > void omap_dss_unregister_driver(struct omap_dss_driver *); > > @@ -633,8 +631,6 @@ static inline bool omapdss_device_is_enabled(struct omap_dss_device *dssdev) > struct omap_dss_device * > omapdss_of_find_source_for_first_ep(struct device_node *node); > > -void omapdss_set_is_initialized(bool set); > - > struct device_node *dss_of_port_get_parent_device(struct device_node *port); > u32 dss_of_port_get_port_number(struct device_node *port); > > diff --git a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c > index b341ebc136fe..dfbf361ac1e4 100644 > --- a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c > +++ b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c > @@ -1042,7 +1042,7 @@ static const struct of_device_id dmm_of_match[] = { > }; > #endif > > -struct platform_driver omap_dmm_driver = { > +static struct platform_driver omap_dmm_driver = { > .probe = omap_dmm_probe, > .remove = omap_dmm_remove, > .driver = { > @@ -1053,6 +1053,16 @@ struct platform_driver omap_dmm_driver = { > }, > }; > > +int __init dmm_init_platform_driver(void) > +{ > + return platform_driver_register(&omap_dmm_driver); > +} > + > +void dmm_uninit_platform_driver(void) > +{ > + platform_driver_unregister(&omap_dmm_driver); > +} > + > MODULE_LICENSE("GPL v2"); > MODULE_AUTHOR("Andy Gross <andy.gross@ti.com>"); > MODULE_DESCRIPTION("OMAP DMM/Tiler Driver"); > diff --git a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.h b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.h > index 09816adfd422..842254d65548 100644 > --- a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.h > +++ b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.h > @@ -109,7 +109,8 @@ void tiler_align(enum tiler_fmt fmt, u16 *w, u16 *h); > u32 tiler_get_cpu_cache_flags(void); > bool dmm_is_available(void); > > -extern struct platform_driver omap_dmm_driver; > +int dmm_init_platform_driver(void) __init; > +void dmm_uninit_platform_driver(void); > > /* GEM bo flags -> tiler fmt */ > static inline enum tiler_fmt gem2fmt(u32 flags) > diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c > index cbca70f80d8e..baf8e32b899b 100644 > --- a/drivers/gpu/drm/omapdrm/omap_drv.c > +++ b/drivers/gpu/drm/omapdrm/omap_drv.c > @@ -542,7 +542,7 @@ static const struct soc_device_attribute omapdrm_soc_devices[] = { > { /* sentinel */ } > }; > > -static int omapdrm_init(struct omap_drm_private *priv, struct device *dev) > +int omapdrm_init(struct omap_drm_private *priv, struct device *dev) > { > const struct soc_device_attribute *soc; > struct drm_device *ddev; > @@ -630,7 +630,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev) > return ret; > } > > -static void omapdrm_cleanup(struct omap_drm_private *priv) > +void omapdrm_cleanup(struct omap_drm_private *priv) > { > struct drm_device *ddev = priv->ddev; > > @@ -659,44 +659,6 @@ static void omapdrm_cleanup(struct omap_drm_private *priv) > omap_crtc_pre_uninit(); > } > > -static int pdev_probe(struct platform_device *pdev) > -{ > - struct omap_drm_private *priv; > - int ret; > - > - if (omapdss_is_initialized() == false) > - return -EPROBE_DEFER; > - > - ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); > - if (ret) { > - dev_err(&pdev->dev, "Failed to set the DMA mask\n"); > - return ret; > - } > - > - /* Allocate and initialize the driver private structure. */ > - priv = kzalloc(sizeof(*priv), GFP_KERNEL); > - if (!priv) > - return -ENOMEM; > - > - platform_set_drvdata(pdev, priv); > - > - ret = omapdrm_init(priv, &pdev->dev); > - if (ret < 0) > - kfree(priv); > - > - return ret; > -} > - > -static int pdev_remove(struct platform_device *pdev) > -{ > - struct omap_drm_private *priv = platform_get_drvdata(pdev); > - > - omapdrm_cleanup(priv); > - kfree(priv); > - > - return 0; > -} > - > #ifdef CONFIG_PM_SLEEP > static int omap_drm_suspend_all_displays(void) > { > @@ -734,9 +696,8 @@ static int omap_drm_resume_all_displays(void) > return 0; > } > > -static int omap_drm_suspend(struct device *dev) > +int omap_drm_suspend(struct omap_drm_private *priv) > { > - struct omap_drm_private *priv = dev_get_drvdata(dev); > struct drm_device *drm_dev = priv->ddev; > > drm_kms_helper_poll_disable(drm_dev); > @@ -748,9 +709,8 @@ static int omap_drm_suspend(struct device *dev) > return 0; > } > > -static int omap_drm_resume(struct device *dev) > +int omap_drm_resume(struct omap_drm_private *priv) > { > - struct omap_drm_private *priv = dev_get_drvdata(dev); > struct drm_device *drm_dev = priv->ddev; > > drm_modeset_lock_all(drm_dev); > @@ -763,40 +723,6 @@ static int omap_drm_resume(struct device *dev) > } > #endif > > -static SIMPLE_DEV_PM_OPS(omapdrm_pm_ops, omap_drm_suspend, omap_drm_resume); > - > -static struct platform_driver pdev = { > - .driver = { > - .name = "omapdrm", > - .pm = &omapdrm_pm_ops, > - }, > - .probe = pdev_probe, > - .remove = pdev_remove, > -}; > - > -static struct platform_driver * const drivers[] = { > - &omap_dmm_driver, > - &pdev, > -}; > - > -static int __init omap_drm_init(void) > -{ > - DBG("init"); > - > - return platform_register_drivers(drivers, ARRAY_SIZE(drivers)); > -} > - > -static void __exit omap_drm_fini(void) > -{ > - DBG("fini"); > - > - platform_unregister_drivers(drivers, ARRAY_SIZE(drivers)); > -} > - > -/* need late_initcall() so we load after dss_driver's are loaded */ > -late_initcall(omap_drm_init); > -module_exit(omap_drm_fini); > - > MODULE_AUTHOR("Rob Clark <rob@ti.com>"); > MODULE_DESCRIPTION("OMAP DRM Display Driver"); > MODULE_ALIAS("platform:" DRIVER_NAME); > diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h > index 2c06533a2d0a..e10b9105379a 100644 > --- a/drivers/gpu/drm/omapdrm/omap_drv.h > +++ b/drivers/gpu/drm/omapdrm/omap_drv.h > @@ -88,6 +88,10 @@ struct omap_drm_private { > u32 irq_mask; /* enabled irqs in addition to wait_list */ > }; > > +int omapdrm_init(struct omap_drm_private *priv, struct device *dev); > +void omapdrm_cleanup(struct omap_drm_private *priv); > +int omap_drm_suspend(struct omap_drm_private *priv); > +int omap_drm_resume(struct omap_drm_private *priv); > > int omap_debugfs_init(struct drm_minor *minor); > > -- > Regards, > > Laurent Pinchart > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
Hi Sebastian, On Saturday, 14 October 2017 16:12:37 EEST Sebastian Reichel wrote: > On Fri, Oct 13, 2017 at 05:59:16PM +0300, Laurent Pinchart wrote: > > The split between the omapdss and omapdrm driver is historic and was due > > to other userspace APIs (FBDEV and V4L2) being supported in addition to > > DRM/KMS. Now that the drivers only supports the DRM/KMS API, there is no > > need to keep them separate anymore. > > > > Merge the two drivers and remove the now unneeded omapdrm virtual > > platform device. > > > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > --- > > > > drivers/gpu/drm/omapdrm/Kconfig | 5 +- > > drivers/gpu/drm/omapdrm/Makefile | 25 ++++++++++ > > drivers/gpu/drm/omapdrm/dss/Kconfig | 12 ----- > > drivers/gpu/drm/omapdrm/dss/Makefile | 25 ---------- > > drivers/gpu/drm/omapdrm/dss/base.c | 13 ----- > > drivers/gpu/drm/omapdrm/dss/core.c | 14 ++---- > > drivers/gpu/drm/omapdrm/dss/dss.c | 23 ++++++++- > > drivers/gpu/drm/omapdrm/dss/omapdss.h | 4 -- > > drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | 12 ++++- > > drivers/gpu/drm/omapdrm/omap_dmm_tiler.h | 3 +- > > drivers/gpu/drm/omapdrm/omap_drv.c | 82 ++------------------------- > > drivers/gpu/drm/omapdrm/omap_drv.h | 4 ++ > > 12 files changed, 74 insertions(+), 148 deletions(-) > > > > diff --git a/drivers/gpu/drm/omapdrm/Kconfig > > b/drivers/gpu/drm/omapdrm/Kconfig index b3d08c5f41d4..7e5080e45b16 100644 > > --- a/drivers/gpu/drm/omapdrm/Kconfig > > +++ b/drivers/gpu/drm/omapdrm/Kconfig > > @@ -2,8 +2,11 @@ config DRM_OMAP > > tristate "OMAP DRM" > > depends on DRM > > depends on ARCH_OMAP2PLUS || ARCH_MULTIPLATFORM > > - select OMAP2_DSS > > select DRM_KMS_HELPER > > + select HDMI > > + select OMAP2_DSS > > As far as I can see "CONFIG_OMAP2_DSS" no longer exists after the merge, > so this can be dropped. Good point. I'll fix that in v2. > Otherwise: > > Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> > > -- Sebastian > > > + select OMAP2_DSS_INIT > > + select VIDEOMODE_HELPERS > > default n > > help > > DRM display driver for OMAP2/3/4 based boards. [snip]
diff --git a/drivers/gpu/drm/omapdrm/Kconfig b/drivers/gpu/drm/omapdrm/Kconfig index b3d08c5f41d4..7e5080e45b16 100644 --- a/drivers/gpu/drm/omapdrm/Kconfig +++ b/drivers/gpu/drm/omapdrm/Kconfig @@ -2,8 +2,11 @@ config DRM_OMAP tristate "OMAP DRM" depends on DRM depends on ARCH_OMAP2PLUS || ARCH_MULTIPLATFORM - select OMAP2_DSS select DRM_KMS_HELPER + select HDMI + select OMAP2_DSS + select OMAP2_DSS_INIT + select VIDEOMODE_HELPERS default n help DRM display driver for OMAP2/3/4 based boards. diff --git a/drivers/gpu/drm/omapdrm/Makefile b/drivers/gpu/drm/omapdrm/Makefile index b391be7ecb6c..1dafa51ca00e 100644 --- a/drivers/gpu/drm/omapdrm/Makefile +++ b/drivers/gpu/drm/omapdrm/Makefile @@ -21,4 +21,29 @@ omapdrm-y := omap_drv.o \ omapdrm-$(CONFIG_DRM_FBDEV_EMULATION) += omap_fbdev.o +# Core DSS files +omapdrm-y += \ + dss/base.o \ + dss/core.o \ + dss/dispc.o \ + dss/dispc_coefs.o \ + dss/display.o \ + dss/dss.o \ + dss/dss-of.o \ + dss/output.o \ + dss/pll.o \ + dss/video-pll.o + +omapdrm-$(CONFIG_OMAP2_DSS_DPI) += dss/dpi.o +omapdrm-$(CONFIG_OMAP2_DSS_VENC) += dss/venc.o +omapdrm-$(CONFIG_OMAP2_DSS_SDI) += dss/sdi.o +omapdrm-$(CONFIG_OMAP2_DSS_DSI) += dss/dsi.o +omapdrm-$(CONFIG_OMAP2_DSS_HDMI_COMMON) += dss/hdmi_common.o dss/hdmi_wp.o \ + dss/hdmi_pll.o dss/hdmi_phy.o +omapdrm-$(CONFIG_OMAP4_DSS_HDMI) += dss/hdmi4.o dss/hdmi4_core.o +omapdrm-$(CONFIG_OMAP4_DSS_HDMI_CEC) += dss/hdmi4_cec.o +omapdrm-$(CONFIG_OMAP5_DSS_HDMI) += dss/hdmi5.o dss/hdmi5_core.o + +ccflags-$(CONFIG_OMAP2_DSS_DEBUG) += -DDEBUG + obj-$(CONFIG_DRM_OMAP) += omapdrm.o diff --git a/drivers/gpu/drm/omapdrm/dss/Kconfig b/drivers/gpu/drm/omapdrm/dss/Kconfig index 39a30a64448a..157c5601e4be 100644 --- a/drivers/gpu/drm/omapdrm/dss/Kconfig +++ b/drivers/gpu/drm/omapdrm/dss/Kconfig @@ -1,16 +1,6 @@ config OMAP2_DSS_INIT bool -menuconfig OMAP2_DSS - tristate "OMAP2+ Display Subsystem support" - select VIDEOMODE_HELPERS - select OMAP2_DSS_INIT - select HDMI - help - OMAP2+ Display Subsystem support. - -if OMAP2_DSS - config OMAP2_DSS_DEBUG bool "Debug support" default n @@ -126,5 +116,3 @@ config OMAP2_DSS_SLEEP_AFTER_VENC_RESET This option enables the sleep, and is enabled by default. You can disable the sleep if it doesn't cause problems on your platform. - -endif diff --git a/drivers/gpu/drm/omapdrm/dss/Makefile b/drivers/gpu/drm/omapdrm/dss/Makefile index 531b4d8075e5..3db4bf31aeaf 100644 --- a/drivers/gpu/drm/omapdrm/dss/Makefile +++ b/drivers/gpu/drm/omapdrm/dss/Makefile @@ -1,26 +1 @@ obj-$(CONFIG_OMAP2_DSS_INIT) += omapdss-boot-init.o -obj-$(CONFIG_OMAP2_DSS) += omapdss.o - -# Core DSS files -omapdss-y := \ - base.o \ - display.o \ - dss-of.o \ - output.o \ - core.o \ - dss.o \ - dispc.o \ - dispc_coefs.o \ - pll.o \ - video-pll.o - -omapdss-$(CONFIG_OMAP2_DSS_DPI) += dpi.o -omapdss-$(CONFIG_OMAP2_DSS_VENC) += venc.o -omapdss-$(CONFIG_OMAP2_DSS_SDI) += sdi.o -omapdss-$(CONFIG_OMAP2_DSS_DSI) += dsi.o -omapdss-$(CONFIG_OMAP2_DSS_HDMI_COMMON) += hdmi_common.o hdmi_wp.o hdmi_pll.o \ - hdmi_phy.o -omapdss-$(CONFIG_OMAP4_DSS_HDMI) += hdmi4.o hdmi4_core.o -omapdss-$(CONFIG_OMAP4_DSS_HDMI_CEC) += hdmi4_cec.o -omapdss-$(CONFIG_OMAP5_DSS_HDMI) += hdmi5.o hdmi5_core.o -ccflags-$(CONFIG_OMAP2_DSS_DEBUG) += -DDEBUG diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c index eff427dd3297..5729f8244bf9 100644 --- a/drivers/gpu/drm/omapdrm/dss/base.c +++ b/drivers/gpu/drm/omapdrm/dss/base.c @@ -5,7 +5,6 @@ #include <linux/list.h> #include "omapdss.h" -static bool dss_initialized; static const struct dispc_ops *ops; static struct list_head omapdss_comp_list; @@ -16,17 +15,6 @@ struct omapdss_comp_node { bool dss_core_component; }; -void omapdss_set_is_initialized(bool set) -{ - dss_initialized = set; -} - -bool omapdss_is_initialized(void) -{ - return dss_initialized; -} -EXPORT_SYMBOL(omapdss_is_initialized); - void dispc_set_ops(const struct dispc_ops *o) { ops = o; @@ -130,4 +118,3 @@ bool omapdss_stack_is_ready(void) return true; } -EXPORT_SYMBOL(omapdss_stack_is_ready); diff --git a/drivers/gpu/drm/omapdrm/dss/core.c b/drivers/gpu/drm/omapdrm/dss/core.c index 197ddbc1512b..776f43601288 100644 --- a/drivers/gpu/drm/omapdrm/dss/core.c +++ b/drivers/gpu/drm/omapdrm/dss/core.c @@ -24,13 +24,14 @@ #include <linux/kernel.h> #include <linux/module.h> -#include <linux/platform_device.h> #include "omapdss.h" #include "dss.h" +#include "../omap_dmm_tiler.h" /* INIT */ static int (*dss_output_drv_reg_funcs[])(void) __initdata = { + dmm_init_platform_driver, dss_init_platform_driver, dispc_init_platform_driver, #ifdef CONFIG_OMAP2_DSS_DSI @@ -62,10 +63,9 @@ static void (*dss_output_drv_unreg_funcs[])(void) = { #endif dispc_uninit_platform_driver, dss_uninit_platform_driver, + dmm_uninit_platform_driver, }; -static struct platform_device *omap_drm_device; - static int __init omap_dss_init(void) { int r; @@ -77,12 +77,6 @@ static int __init omap_dss_init(void) goto err_reg; } - omap_drm_device = platform_device_register_simple("omapdrm", 0, NULL, 0); - if (IS_ERR(omap_drm_device)) { - r = PTR_ERR(omap_drm_device); - goto err_reg; - } - return 0; err_reg: @@ -98,8 +92,6 @@ static void __exit omap_dss_exit(void) { int i; - platform_device_unregister(omap_drm_device); - for (i = 0; i < ARRAY_SIZE(dss_output_drv_unreg_funcs); ++i) dss_output_drv_unreg_funcs[i](); } diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c index a27edc56a509..5721f3d64bdd 100644 --- a/drivers/gpu/drm/omapdrm/dss/dss.c +++ b/drivers/gpu/drm/omapdrm/dss/dss.c @@ -49,6 +49,7 @@ #include "omapdss.h" #include "dss.h" +#include "../omap_drv.h" #define DSS_SZ_REGS SZ_512 @@ -94,6 +95,8 @@ struct dss_features { static struct { struct platform_device *pdev; + struct omap_drm_private drm; + void __iomem *base; struct regmap *syscon_pll_ctrl; u32 syscon_pll_ctrl_offset; @@ -1366,10 +1369,15 @@ static int dss_bind(struct device *dev) pm_set_vt_switch(0); omapdss_gather_components(dev); - omapdss_set_is_initialized(true); + + r = omapdrm_init(&dss.drm, dev); + if (r) + goto err_drm_init; return 0; +err_drm_init: + component_unbind_all(&pdev->dev, NULL); err_component: err_runtime_get: pm_runtime_disable(&pdev->dev); @@ -1390,7 +1398,7 @@ static void dss_unbind(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); - omapdss_set_is_initialized(false); + omapdrm_cleanup(&dss.drm); component_unbind_all(&pdev->dev, NULL); @@ -1531,7 +1539,18 @@ static int dss_runtime_resume(struct device *dev) return 0; } +static int dss_suspend(struct device *dev) +{ + return omap_drm_suspend(&dss.drm); +} + +static int dss_resume(struct device *dev) +{ + return omap_drm_resume(&dss.drm); +} + static const struct dev_pm_ops dss_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(dss_suspend, dss_resume) .runtime_suspend = dss_runtime_suspend, .runtime_resume = dss_runtime_resume, }; diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h index 3a6b33ff2990..6f9b9b2d8af2 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -583,8 +583,6 @@ struct omap_dss_driver { const struct hdmi_avi_infoframe *avi); }; -bool omapdss_is_initialized(void); - int omap_dss_register_driver(struct omap_dss_driver *); void omap_dss_unregister_driver(struct omap_dss_driver *); @@ -633,8 +631,6 @@ static inline bool omapdss_device_is_enabled(struct omap_dss_device *dssdev) struct omap_dss_device * omapdss_of_find_source_for_first_ep(struct device_node *node); -void omapdss_set_is_initialized(bool set); - struct device_node *dss_of_port_get_parent_device(struct device_node *port); u32 dss_of_port_get_port_number(struct device_node *port); diff --git a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c index b341ebc136fe..dfbf361ac1e4 100644 --- a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c +++ b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c @@ -1042,7 +1042,7 @@ static const struct of_device_id dmm_of_match[] = { }; #endif -struct platform_driver omap_dmm_driver = { +static struct platform_driver omap_dmm_driver = { .probe = omap_dmm_probe, .remove = omap_dmm_remove, .driver = { @@ -1053,6 +1053,16 @@ struct platform_driver omap_dmm_driver = { }, }; +int __init dmm_init_platform_driver(void) +{ + return platform_driver_register(&omap_dmm_driver); +} + +void dmm_uninit_platform_driver(void) +{ + platform_driver_unregister(&omap_dmm_driver); +} + MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("Andy Gross <andy.gross@ti.com>"); MODULE_DESCRIPTION("OMAP DMM/Tiler Driver"); diff --git a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.h b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.h index 09816adfd422..842254d65548 100644 --- a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.h +++ b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.h @@ -109,7 +109,8 @@ void tiler_align(enum tiler_fmt fmt, u16 *w, u16 *h); u32 tiler_get_cpu_cache_flags(void); bool dmm_is_available(void); -extern struct platform_driver omap_dmm_driver; +int dmm_init_platform_driver(void) __init; +void dmm_uninit_platform_driver(void); /* GEM bo flags -> tiler fmt */ static inline enum tiler_fmt gem2fmt(u32 flags) diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index cbca70f80d8e..baf8e32b899b 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -542,7 +542,7 @@ static const struct soc_device_attribute omapdrm_soc_devices[] = { { /* sentinel */ } }; -static int omapdrm_init(struct omap_drm_private *priv, struct device *dev) +int omapdrm_init(struct omap_drm_private *priv, struct device *dev) { const struct soc_device_attribute *soc; struct drm_device *ddev; @@ -630,7 +630,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev) return ret; } -static void omapdrm_cleanup(struct omap_drm_private *priv) +void omapdrm_cleanup(struct omap_drm_private *priv) { struct drm_device *ddev = priv->ddev; @@ -659,44 +659,6 @@ static void omapdrm_cleanup(struct omap_drm_private *priv) omap_crtc_pre_uninit(); } -static int pdev_probe(struct platform_device *pdev) -{ - struct omap_drm_private *priv; - int ret; - - if (omapdss_is_initialized() == false) - return -EPROBE_DEFER; - - ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); - if (ret) { - dev_err(&pdev->dev, "Failed to set the DMA mask\n"); - return ret; - } - - /* Allocate and initialize the driver private structure. */ - priv = kzalloc(sizeof(*priv), GFP_KERNEL); - if (!priv) - return -ENOMEM; - - platform_set_drvdata(pdev, priv); - - ret = omapdrm_init(priv, &pdev->dev); - if (ret < 0) - kfree(priv); - - return ret; -} - -static int pdev_remove(struct platform_device *pdev) -{ - struct omap_drm_private *priv = platform_get_drvdata(pdev); - - omapdrm_cleanup(priv); - kfree(priv); - - return 0; -} - #ifdef CONFIG_PM_SLEEP static int omap_drm_suspend_all_displays(void) { @@ -734,9 +696,8 @@ static int omap_drm_resume_all_displays(void) return 0; } -static int omap_drm_suspend(struct device *dev) +int omap_drm_suspend(struct omap_drm_private *priv) { - struct omap_drm_private *priv = dev_get_drvdata(dev); struct drm_device *drm_dev = priv->ddev; drm_kms_helper_poll_disable(drm_dev); @@ -748,9 +709,8 @@ static int omap_drm_suspend(struct device *dev) return 0; } -static int omap_drm_resume(struct device *dev) +int omap_drm_resume(struct omap_drm_private *priv) { - struct omap_drm_private *priv = dev_get_drvdata(dev); struct drm_device *drm_dev = priv->ddev; drm_modeset_lock_all(drm_dev); @@ -763,40 +723,6 @@ static int omap_drm_resume(struct device *dev) } #endif -static SIMPLE_DEV_PM_OPS(omapdrm_pm_ops, omap_drm_suspend, omap_drm_resume); - -static struct platform_driver pdev = { - .driver = { - .name = "omapdrm", - .pm = &omapdrm_pm_ops, - }, - .probe = pdev_probe, - .remove = pdev_remove, -}; - -static struct platform_driver * const drivers[] = { - &omap_dmm_driver, - &pdev, -}; - -static int __init omap_drm_init(void) -{ - DBG("init"); - - return platform_register_drivers(drivers, ARRAY_SIZE(drivers)); -} - -static void __exit omap_drm_fini(void) -{ - DBG("fini"); - - platform_unregister_drivers(drivers, ARRAY_SIZE(drivers)); -} - -/* need late_initcall() so we load after dss_driver's are loaded */ -late_initcall(omap_drm_init); -module_exit(omap_drm_fini); - MODULE_AUTHOR("Rob Clark <rob@ti.com>"); MODULE_DESCRIPTION("OMAP DRM Display Driver"); MODULE_ALIAS("platform:" DRIVER_NAME); diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h index 2c06533a2d0a..e10b9105379a 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.h +++ b/drivers/gpu/drm/omapdrm/omap_drv.h @@ -88,6 +88,10 @@ struct omap_drm_private { u32 irq_mask; /* enabled irqs in addition to wait_list */ }; +int omapdrm_init(struct omap_drm_private *priv, struct device *dev); +void omapdrm_cleanup(struct omap_drm_private *priv); +int omap_drm_suspend(struct omap_drm_private *priv); +int omap_drm_resume(struct omap_drm_private *priv); int omap_debugfs_init(struct drm_minor *minor);
The split between the omapdss and omapdrm driver is historic and was due to other userspace APIs (FBDEV and V4L2) being supported in addition to DRM/KMS. Now that the drivers only supports the DRM/KMS API, there is no need to keep them separate anymore. Merge the two drivers and remove the now unneeded omapdrm virtual platform device. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> --- drivers/gpu/drm/omapdrm/Kconfig | 5 +- drivers/gpu/drm/omapdrm/Makefile | 25 ++++++++++ drivers/gpu/drm/omapdrm/dss/Kconfig | 12 ----- drivers/gpu/drm/omapdrm/dss/Makefile | 25 ---------- drivers/gpu/drm/omapdrm/dss/base.c | 13 ----- drivers/gpu/drm/omapdrm/dss/core.c | 14 ++---- drivers/gpu/drm/omapdrm/dss/dss.c | 23 ++++++++- drivers/gpu/drm/omapdrm/dss/omapdss.h | 4 -- drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | 12 ++++- drivers/gpu/drm/omapdrm/omap_dmm_tiler.h | 3 +- drivers/gpu/drm/omapdrm/omap_drv.c | 82 ++------------------------------ drivers/gpu/drm/omapdrm/omap_drv.h | 4 ++ 12 files changed, 74 insertions(+), 148 deletions(-)