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.kris...@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

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to