[PATCH] [RFC] video: exynos dp: Making Exynos DP Compliant with CDF

Leela Krishna Amudala l.krishna at samsung.com
Fri Jan 11 02:35:40 PST 2013


The Exynos DP transmitter is treated as an end entity in the display pipeline
and made this RFC patch compliant with CDF.

Any suggestions are welcome.

Signed-off-by: Leela Krishna Amudala <l.krishna at samsung.com>
---
 drivers/video/display/display-core.c  |  2 +-
 drivers/video/exynos/exynos_dp_core.c | 88 +++++++++++++++++++++++++++++++++++
 drivers/video/exynos/exynos_dp_core.h |  6 +++
 3 files changed, 95 insertions(+), 1 deletion(-)

diff --git a/drivers/video/display/display-core.c b/drivers/video/display/display-core.c
index 5f8be30..dbad7e9 100644
--- a/drivers/video/display/display-core.c
+++ b/drivers/video/display/display-core.c
@@ -15,7 +15,7 @@
 #include <linux/list.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
-#include <linux/videomode.h>
+#include <video/videomode.h>
 
 #include <video/display.h>
 
diff --git a/drivers/video/exynos/exynos_dp_core.c b/drivers/video/exynos/exynos_dp_core.c
index 4ef18e2..0f8de27b 100644
--- a/drivers/video/exynos/exynos_dp_core.c
+++ b/drivers/video/exynos/exynos_dp_core.c
@@ -23,6 +23,9 @@
 #include <video/exynos_dp.h>
 
 #include "exynos_dp_core.h"
+#include <video/videomode.h>
+#include <video/display.h>
+#define to_panel(p) container_of(p, struct exynos_dp_device, entity)
 
 static int exynos_dp_init_dp(struct exynos_dp_device *dp)
 {
@@ -1033,6 +1036,81 @@ static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
 }
 #endif /* CONFIG_OF */
 
+static int exynos_dp_power_on(struct exynos_dp_device *dp)
+{
+	struct platform_device *pdev = to_platform_device(dp->dev);
+	struct exynos_dp_platdata *pdata = pdev->dev.platform_data;
+
+	if (dp->dev->of_node) {
+		if (dp->phy_addr)
+			exynos_dp_phy_init(dp);
+	} else {
+		if (pdata->phy_init)
+			pdata->phy_init();
+	}
+
+	clk_prepare_enable(dp->clock);
+	exynos_dp_init_dp(dp);
+	enable_irq(dp->irq);
+
+	return 0;
+}
+
+static int dp_set_state(struct display_entity *entity,
+			enum display_entity_state state)
+{
+	struct exynos_dp_device *dp = to_panel(entity);
+	struct platform_device *pdev = to_platform_device(dp->dev);
+	int ret = 0;
+
+	switch (state) {
+	case DISPLAY_ENTITY_STATE_OFF:
+	case DISPLAY_ENTITY_STATE_STANDBY:
+		ret = exynos_dp_remove(pdev);
+		break;
+	case DISPLAY_ENTITY_STATE_ON:
+		ret = exynos_dp_power_on(dp);
+		break;
+	}
+	return ret;
+}
+
+static int dp_get_modes(struct display_entity *entity,
+			const struct videomode **modes)
+{
+	/* Rework has to be done here*/
+	return 1;
+}
+
+static int dp_get_size(struct display_entity *entity,
+			unsigned int *width, unsigned int *height)
+{
+	struct exynos_dp_device *dp = to_panel(entity);
+	struct platform_device *pdev = to_platform_device(dp->dev);
+	/*getting pdata in older way, rework has to be done  here to
+	  parse it from dt node */
+	struct exynos_dp_platdata *pdata = pdev->dev.platform_data;
+
+	/*Rework has to be done here */
+	*width = 1280;
+	*height = 800;
+	return 0;
+}
+
+static int dp_update(struct display_entity *entity,
+		void (*callback)(int, void *), void *data)
+{
+	/*Rework has to be done here*/
+	return 0;
+}
+
+static const struct display_entity_control_ops dp_control_ops = {
+	.set_state = dp_set_state,
+	.get_modes = dp_get_modes,
+	.get_size = dp_get_size,
+	.update = dp_update,
+};
+
 static int exynos_dp_probe(struct platform_device *pdev)
 {
 	struct resource *res;
@@ -1111,6 +1189,16 @@ static int exynos_dp_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, dp);
 
+	/* setup panel entity */
+	dp->entity.dev = &pdev->dev;
+	dp->entity.release = exynos_dp_remove;
+	dp->entity.ops = &dp_control_ops;
+
+	ret = display_entity_register(&dp->entity);
+	if (ret < 0) {
+		pr_err("failed to register display entity\n");
+		return ret;
+	}
 	return 0;
 }
 
diff --git a/drivers/video/exynos/exynos_dp_core.h b/drivers/video/exynos/exynos_dp_core.h
index 6c567bb..eb18c10 100644
--- a/drivers/video/exynos/exynos_dp_core.h
+++ b/drivers/video/exynos/exynos_dp_core.h
@@ -13,6 +13,8 @@
 #ifndef _EXYNOS_DP_CORE_H
 #define _EXYNOS_DP_CORE_H
 
+#include <video/display.h>
+
 enum dp_irq_type {
 	DP_IRQ_TYPE_HP_CABLE_IN,
 	DP_IRQ_TYPE_HP_CABLE_OUT,
@@ -42,6 +44,7 @@ struct exynos_dp_device {
 	struct video_info	*video_info;
 	struct link_train	link_train;
 	struct work_struct	hotplug_work;
+	struct display_entity	entity;
 };
 
 /* exynos_dp_reg.c */
@@ -133,6 +136,9 @@ void exynos_dp_config_video_slave_mode(struct exynos_dp_device *dp);
 void exynos_dp_enable_scrambling(struct exynos_dp_device *dp);
 void exynos_dp_disable_scrambling(struct exynos_dp_device *dp);
 
+static int exynos_dp_power_on(struct exynos_dp_device *dp);
+static int exynos_dp_remove(struct platform_device *pdev);
+
 /* I2C EDID Chip ID, Slave Address */
 #define I2C_EDID_DEVICE_ADDR			0x50
 #define I2C_E_EDID_DEVICE_ADDR			0x30
-- 
1.8.0



More information about the dri-devel mailing list