From patchwork Fri Oct 13 14:59:16 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 10005019 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 19E1660216 for ; Fri, 13 Oct 2017 15:01:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 08A67290A0 for ; Fri, 13 Oct 2017 15:01:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id F12EF290A2; Fri, 13 Oct 2017 15:01:57 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id B620B290A0 for ; Fri, 13 Oct 2017 15:01:56 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1761C6EBDA; Fri, 13 Oct 2017 15:00:08 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from galahad.ideasonboard.com (galahad.ideasonboard.com [185.26.127.97]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9BC5F6EBAE for ; Fri, 13 Oct 2017 14:59:55 +0000 (UTC) Received: from avalon.bb.dnainternet.fi (dfj612ybrt5fhg77mgycy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:2e86:4862:ef6a:2804]) by galahad.ideasonboard.com (Postfix) with ESMTPSA id 007CF2150A; Fri, 13 Oct 2017 16:59:12 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1507906753; bh=kzLzLMktJ04E0Tjakl/fZkJPCaBcK7EhzzB7JTY+JKE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=v3Kd/SuLgr6ORjjH1W2kz0TUhIkXfLKRuYh72dD5JunNnOwxjQRNRWrmcTM+jUgZO mkFi9G290DKltLggTxkdb8c2YPgLMTAGwPSozBefC3mvWdXR3x7hH+nnDzhAKx8ZuC nNw1HIFrptlpKiNiUcUJjspgF/JY56vtiwCK6rT0= From: Laurent Pinchart To: dri-devel@lists.freedesktop.org Subject: [PATCH 20/48] drm: omapdrm: Merge the omapdrm and omapdss drivers Date: Fri, 13 Oct 2017 17:59:16 +0300 Message-Id: <20171013145944.26557-21-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20171013145944.26557-1-laurent.pinchart@ideasonboard.com> References: <20171013145944.26557-1-laurent.pinchart@ideasonboard.com> Cc: Tomi Valkeinen X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP 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 Reviewed-by: Sebastian Reichel --- 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 #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 #include -#include #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 "); 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 "); 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);