Browse Source

drm/exynos/dp: embed display into private context

exynos_drm_display is used by internal Exynos DRM framework for
representing encoder:connector pair. As it should be mapped 1:1 to dp
private context it seems more reasonable to embed it directly in that context.
As a result further code simplification will be possible.
Moreover it will be possible to handle multiple dp devices in the system.

Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Andrzej Hajda 10 years ago
parent
commit
1df6e5fb79
2 changed files with 21 additions and 24 deletions
  1. 18 24
      drivers/gpu/drm/exynos/exynos_dp_core.c
  2. 3 0
      drivers/gpu/drm/exynos/exynos_dp_core.h

+ 18 - 24
drivers/gpu/drm/exynos/exynos_dp_core.c

@@ -30,7 +30,6 @@
 #include <drm/drm_panel.h>
 #include <drm/drm_panel.h>
 #include <drm/bridge/ptn3460.h>
 #include <drm/bridge/ptn3460.h>
 
 
-#include "exynos_drm_drv.h"
 #include "exynos_dp_core.h"
 #include "exynos_dp_core.h"
 
 
 #define ctx_from_connector(c)	container_of(c, struct exynos_dp_device, \
 #define ctx_from_connector(c)	container_of(c, struct exynos_dp_device, \
@@ -1133,11 +1132,6 @@ static struct exynos_drm_display_ops exynos_dp_display_ops = {
 	.commit = exynos_dp_commit,
 	.commit = exynos_dp_commit,
 };
 };
 
 
-static struct exynos_drm_display exynos_dp_display = {
-	.type = EXYNOS_DISPLAY_TYPE_LCD,
-	.ops = &exynos_dp_display_ops,
-};
-
 static struct video_info *exynos_dp_dt_parse_pdata(struct device *dev)
 static struct video_info *exynos_dp_dt_parse_pdata(struct device *dev)
 {
 {
 	struct device_node *dp_node = dev->of_node;
 	struct device_node *dp_node = dev->of_node;
@@ -1211,10 +1205,10 @@ static int exynos_dp_dt_parse_panel(struct exynos_dp_device *dp)
 
 
 static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
 static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
 {
 {
+	struct exynos_dp_device *dp = dev_get_drvdata(dev);
 	struct platform_device *pdev = to_platform_device(dev);
 	struct platform_device *pdev = to_platform_device(dev);
 	struct drm_device *drm_dev = data;
 	struct drm_device *drm_dev = data;
 	struct resource *res;
 	struct resource *res;
-	struct exynos_dp_device *dp = exynos_dp_display.ctx;
 	unsigned int irq_flags;
 	unsigned int irq_flags;
 	int ret = 0;
 	int ret = 0;
 
 
@@ -1306,17 +1300,15 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
 
 
 	dp->drm_dev = drm_dev;
 	dp->drm_dev = drm_dev;
 
 
-	platform_set_drvdata(pdev, &exynos_dp_display);
-
-	return exynos_drm_create_enc_conn(drm_dev, &exynos_dp_display);
+	return exynos_drm_create_enc_conn(drm_dev, &dp->display);
 }
 }
 
 
 static void exynos_dp_unbind(struct device *dev, struct device *master,
 static void exynos_dp_unbind(struct device *dev, struct device *master,
 				void *data)
 				void *data)
 {
 {
-	struct exynos_drm_display *display = dev_get_drvdata(dev);
+	struct exynos_dp_device *dp = dev_get_drvdata(dev);
 
 
-	exynos_dp_dpms(display, DRM_MODE_DPMS_OFF);
+	exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_OFF);
 }
 }
 
 
 static const struct component_ops exynos_dp_ops = {
 static const struct component_ops exynos_dp_ops = {
@@ -1331,16 +1323,20 @@ static int exynos_dp_probe(struct platform_device *pdev)
 	struct exynos_dp_device *dp;
 	struct exynos_dp_device *dp;
 	int ret;
 	int ret;
 
 
-	ret = exynos_drm_component_add(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR,
-					exynos_dp_display.type);
-	if (ret)
-		return ret;
-
 	dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device),
 	dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device),
 				GFP_KERNEL);
 				GFP_KERNEL);
 	if (!dp)
 	if (!dp)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
+	dp->display.type = EXYNOS_DISPLAY_TYPE_LCD;
+	dp->display.ops = &exynos_dp_display_ops;
+	platform_set_drvdata(pdev, dp);
+
+	ret = exynos_drm_component_add(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR,
+					dp->display.type);
+	if (ret)
+		return ret;
+
 	panel_node = of_parse_phandle(dev->of_node, "panel", 0);
 	panel_node = of_parse_phandle(dev->of_node, "panel", 0);
 	if (panel_node) {
 	if (panel_node) {
 		dp->panel = of_drm_find_panel(panel_node);
 		dp->panel = of_drm_find_panel(panel_node);
@@ -1349,7 +1345,7 @@ static int exynos_dp_probe(struct platform_device *pdev)
 			return -EPROBE_DEFER;
 			return -EPROBE_DEFER;
 	}
 	}
 
 
-	exynos_dp_display.ctx = dp;
+	dp->display.ctx = dp;
 
 
 	ret = component_add(&pdev->dev, &exynos_dp_ops);
 	ret = component_add(&pdev->dev, &exynos_dp_ops);
 	if (ret)
 	if (ret)
@@ -1370,19 +1366,17 @@ static int exynos_dp_remove(struct platform_device *pdev)
 #ifdef CONFIG_PM_SLEEP
 #ifdef CONFIG_PM_SLEEP
 static int exynos_dp_suspend(struct device *dev)
 static int exynos_dp_suspend(struct device *dev)
 {
 {
-	struct platform_device *pdev = to_platform_device(dev);
-	struct exynos_drm_display *display = platform_get_drvdata(pdev);
+	struct exynos_dp_device *dp = dev_get_drvdata(dev);
 
 
-	exynos_dp_dpms(display, DRM_MODE_DPMS_OFF);
+	exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_OFF);
 	return 0;
 	return 0;
 }
 }
 
 
 static int exynos_dp_resume(struct device *dev)
 static int exynos_dp_resume(struct device *dev)
 {
 {
-	struct platform_device *pdev = to_platform_device(dev);
-	struct exynos_drm_display *display = platform_get_drvdata(pdev);
+	struct exynos_dp_device *dp = dev_get_drvdata(dev);
 
 
-	exynos_dp_dpms(display, DRM_MODE_DPMS_ON);
+	exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_ON);
 	return 0;
 	return 0;
 }
 }
 #endif
 #endif

+ 3 - 0
drivers/gpu/drm/exynos/exynos_dp_core.h

@@ -17,6 +17,8 @@
 #include <drm/drm_dp_helper.h>
 #include <drm/drm_dp_helper.h>
 #include <drm/exynos_drm.h>
 #include <drm/exynos_drm.h>
 
 
+#include "exynos_drm_drv.h"
+
 #define DP_TIMEOUT_LOOP_COUNT 100
 #define DP_TIMEOUT_LOOP_COUNT 100
 #define MAX_CR_LOOP 5
 #define MAX_CR_LOOP 5
 #define MAX_EQ_LOOP 5
 #define MAX_EQ_LOOP 5
@@ -145,6 +147,7 @@ struct link_train {
 };
 };
 
 
 struct exynos_dp_device {
 struct exynos_dp_device {
+	struct exynos_drm_display display;
 	struct device		*dev;
 	struct device		*dev;
 	struct drm_device	*drm_dev;
 	struct drm_device	*drm_dev;
 	struct drm_connector	connector;
 	struct drm_connector	connector;