Linux Samsung SOC development
 help / color / mirror / Atom feed
From: Inki Dae <inki.dae@samsung.com>
To: dri-devel@lists.freedesktop.org
Cc: linux-samsung-soc@vger.kernel.org
Subject: [RFC PATCH 1/3] drm/exynos: make kms drivers to be independent modules
Date: Wed, 19 Nov 2014 00:26:42 +0900	[thread overview]
Message-ID: <1416324404-28153-2-git-send-email-inki.dae@samsung.com> (raw)
In-Reply-To: <1416324404-28153-1-git-send-email-inki.dae@samsung.com>

This patch makes kms drivers to be independent modules.
For this, it removes all register codes to kms drivers
from exynos_drm_drv module and adds module_init/exit
for each kms driver so that each kms driver can be
called independently.

Signed-off-by: Inki Dae <inki.dae@samsung.com>
---
 drivers/gpu/drm/exynos/Kconfig           |    8 +++---
 drivers/gpu/drm/exynos/exynos_dp_core.c  |   13 +++++++++
 drivers/gpu/drm/exynos/exynos_drm_drv.c  |   43 +++---------------------------
 drivers/gpu/drm/exynos/exynos_drm_drv.h  |    5 ----
 drivers/gpu/drm/exynos/exynos_drm_dsi.c  |   13 +++++++++
 drivers/gpu/drm/exynos/exynos_drm_fimd.c |   13 +++++++++
 drivers/gpu/drm/exynos/exynos_hdmi.c     |   13 +++++++++
 drivers/gpu/drm/exynos/exynos_mixer.c    |   13 +++++++++
 8 files changed, 72 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig
index 7f9f6f9..3d5fa69 100644
--- a/drivers/gpu/drm/exynos/Kconfig
+++ b/drivers/gpu/drm/exynos/Kconfig
@@ -25,7 +25,7 @@ config DRM_EXYNOS_DMABUF
 	  Choose this option if you want to use DMABUF feature for DRM.
 
 config DRM_EXYNOS_FIMD
-	bool "Exynos DRM FIMD"
+	tristate "Exynos DRM FIMD"
 	depends on DRM_EXYNOS && !FB_S3C
 	select FB_MODE_HELPERS
 	select MFD_SYSCON
@@ -41,7 +41,7 @@ config DRM_EXYNOS_DPI
 	  This enables support for Exynos parallel output.
 
 config DRM_EXYNOS_DSI
-	bool "EXYNOS DRM MIPI-DSI driver support"
+	tristate "EXYNOS DRM MIPI-DSI driver support"
 	depends on DRM_EXYNOS_FIMD
 	select DRM_MIPI_DSI
 	select DRM_PANEL
@@ -50,7 +50,7 @@ config DRM_EXYNOS_DSI
 	  This enables support for Exynos MIPI-DSI device.
 
 config DRM_EXYNOS_DP
-	bool "EXYNOS DRM DP driver support"
+	tristate "EXYNOS DRM DP driver support"
 	depends on DRM_EXYNOS_FIMD && ARCH_EXYNOS && (DRM_PTN3460=n || DRM_PTN3460=y || DRM_PTN3460=DRM_EXYNOS)
 	default DRM_EXYNOS
 	select DRM_PANEL
@@ -58,7 +58,7 @@ config DRM_EXYNOS_DP
 	  This enables support for DP device.
 
 config DRM_EXYNOS_HDMI
-	bool "Exynos DRM HDMI"
+	tristate "Exynos DRM HDMI"
 	depends on DRM_EXYNOS && !VIDEO_SAMSUNG_S5P_TV
 	help
 	  Choose this option if you want to use Exynos HDMI for DRM.
diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c
index ed818b9..b08d97b 100644
--- a/drivers/gpu/drm/exynos/exynos_dp_core.c
+++ b/drivers/gpu/drm/exynos/exynos_dp_core.c
@@ -1408,6 +1408,19 @@ struct platform_driver dp_driver = {
 	},
 };
 
+static int exynos_dp_init(void)
+{
+	return platform_driver_register(&dp_driver);
+}
+
+static void exynos_dp_exit(void)
+{
+	platform_driver_unregister(&dp_driver);
+}
+
+module_init(exynos_dp_init);
+module_exit(exynos_dp_exit);
+
 MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");
 MODULE_DESCRIPTION("Samsung SoC DP Driver");
 MODULE_LICENSE("GPL v2");
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index eab12f0..02d4772 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -484,12 +484,6 @@ static struct component_match *exynos_drm_match_add(struct device *dev)
 
 	mutex_lock(&drm_component_lock);
 
-	/* Do not retry to probe if there is no any kms driver regitered. */
-	if (list_empty(&drm_component_list)) {
-		mutex_unlock(&drm_component_lock);
-		return ERR_PTR(-ENODEV);
-	}
-
 	list_for_each_entry(cdev, &drm_component_list, list) {
 		/*
 		 * Add components to master only in case that crtc and
@@ -545,22 +539,6 @@ static const struct component_master_ops exynos_drm_ops = {
 	.unbind		= exynos_drm_unbind,
 };
 
-static struct platform_driver *const exynos_drm_kms_drivers[] = {
-#ifdef CONFIG_DRM_EXYNOS_FIMD
-	&fimd_driver,
-#endif
-#ifdef CONFIG_DRM_EXYNOS_DP
-	&dp_driver,
-#endif
-#ifdef CONFIG_DRM_EXYNOS_DSI
-	&dsi_driver,
-#endif
-#ifdef CONFIG_DRM_EXYNOS_HDMI
-	&mixer_driver,
-	&hdmi_driver,
-#endif
-};
-
 static struct platform_driver *const exynos_drm_non_kms_drivers[] = {
 #ifdef CONFIG_DRM_EXYNOS_G2D
 	&g2d_driver,
@@ -587,22 +565,14 @@ static int exynos_drm_platform_probe(struct platform_device *pdev)
 	pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
 	exynos_drm_driver.num_ioctls = ARRAY_SIZE(exynos_ioctls);
 
-	for (i = 0; i < ARRAY_SIZE(exynos_drm_kms_drivers); ++i) {
-		ret = platform_driver_register(exynos_drm_kms_drivers[i]);
-		if (ret < 0)
-			goto err_unregister_kms_drivers;
-	}
-
 	match = exynos_drm_match_add(&pdev->dev);
-	if (IS_ERR(match)) {
-		ret = PTR_ERR(match);
-		goto err_unregister_kms_drivers;
-	}
+	if (IS_ERR(match))
+		return PTR_ERR(match);
 
 	ret = component_master_add_with_match(&pdev->dev, &exynos_drm_ops,
 						match);
 	if (ret < 0)
-		goto err_unregister_kms_drivers;
+		return ret;
 
 	for (j = 0; j < ARRAY_SIZE(exynos_drm_non_kms_drivers); ++j) {
 		ret = platform_driver_register(exynos_drm_non_kms_drivers[j]);
@@ -632,10 +602,6 @@ err_unregister_non_kms_drivers:
 err_del_component_master:
 	component_master_del(&pdev->dev, &exynos_drm_ops);
 
-err_unregister_kms_drivers:
-	while (--i >= 0)
-		platform_driver_unregister(exynos_drm_kms_drivers[i]);
-
 	return ret;
 }
 
@@ -654,9 +620,6 @@ static int exynos_drm_platform_remove(struct platform_device *pdev)
 
 	component_master_del(&pdev->dev, &exynos_drm_ops);
 
-	for (i = ARRAY_SIZE(exynos_drm_kms_drivers) - 1; i >= 0; --i)
-		platform_driver_unregister(exynos_drm_kms_drivers[i]);
-
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
index 262a459..352a9f9 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
@@ -331,11 +331,6 @@ int exynos_drm_component_add(struct device *dev,
 void exynos_drm_component_del(struct device *dev,
 				enum exynos_drm_device_type dev_type);
 
-extern struct platform_driver fimd_driver;
-extern struct platform_driver dp_driver;
-extern struct platform_driver dsi_driver;
-extern struct platform_driver mixer_driver;
-extern struct platform_driver hdmi_driver;
 extern struct platform_driver exynos_drm_common_hdmi_driver;
 extern struct platform_driver vidi_driver;
 extern struct platform_driver g2d_driver;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
index 66d427e..ebc3383 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
@@ -1799,6 +1799,19 @@ struct platform_driver dsi_driver = {
 	},
 };
 
+static int exynos_dsi_driver_init(void)
+{
+	return platform_driver_register(&dsi_driver);
+}
+
+static void exynos_dsi_driver_exit(void)
+{
+	platform_driver_unregister(&dsi_driver);
+}
+
+module_init(exynos_dsi_driver_init);
+module_exit(exynos_dsi_driver_exit);
+
 MODULE_AUTHOR("Tomasz Figa <t.figa@samsung.com>");
 MODULE_AUTHOR("Andrzej Hajda <a.hajda@samsung.com>");
 MODULE_DESCRIPTION("Samsung SoC MIPI DSI Master");
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index 0673a39..eed51c6 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -1240,3 +1240,16 @@ struct platform_driver fimd_driver = {
 		.of_match_table = fimd_driver_dt_match,
 	},
 };
+
+static int exynos_drm_fimd_init(void)
+{
+	return platform_driver_register(&fimd_driver);
+}
+
+static void exynos_drm_fimd_exit(void)
+{
+	platform_driver_unregister(&fimd_driver);
+}
+
+module_init(exynos_drm_fimd_init);
+module_exit(exynos_drm_fimd_exit);
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index 563a19e..83198f7 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -2537,3 +2537,16 @@ struct platform_driver hdmi_driver = {
 		.of_match_table = hdmi_match_types,
 	},
 };
+
+static int hdmi_init(void)
+{
+	return platform_driver_register(&hdmi_driver);
+}
+
+static void hdmi_exit(void)
+{
+	platform_driver_unregister(&hdmi_driver);
+}
+
+module_init(hdmi_init);
+module_exit(hdmi_exit);
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c
index a41c84e..4d812f1 100644
--- a/drivers/gpu/drm/exynos/exynos_mixer.c
+++ b/drivers/gpu/drm/exynos/exynos_mixer.c
@@ -1349,3 +1349,16 @@ struct platform_driver mixer_driver = {
 	.remove = mixer_remove,
 	.id_table	= mixer_driver_types,
 };
+
+static int mixer_init(void)
+{
+	return platform_driver_register(&mixer_driver);
+}
+
+static void mixer_exit(void)
+{
+	platform_driver_unregister(&mixer_driver);
+}
+
+module_init(mixer_init);
+module_exit(mixer_exit);
-- 
1.7.9.5

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2014-11-18 15:26 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-18 15:26 [RFC PATCH 0/3] drm/exynos: add full modularity support to sub drivers Inki Dae
2014-11-18 15:26 ` Inki Dae [this message]
2014-11-19  8:49   ` [RFC PATCH 1/3] drm/exynos: make kms drivers to be independent modules Andrzej Hajda
2014-11-19 13:17     ` Inki Dae
2014-11-18 15:26 ` [RFC PATCH 2/3] drm/exynos: make non kms drivers to be indenpendent modules Inki Dae
2014-11-19  3:19   ` [RFC PATCH v2] " Inki Dae
2014-11-19  4:39     ` YoungJun Cho
2014-11-19  4:51       ` Inki Dae
2014-11-18 15:26 ` [RFC PATCH 3/3] drm/exynos: make vidi driver to be independent module Inki Dae

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1416324404-28153-2-git-send-email-inki.dae@samsung.com \
    --to=inki.dae@samsung.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox