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@xxxxxxxxxxxxxxxx> --- 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 + 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@xxxxxx>"); 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@xxxxxx>"); 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@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel