CHROMIUM: drm/exynos: Remove panel_ops->commit
[cascardo/linux.git] / drivers / gpu / drm / exynos / exynos_dp_core.c
index 6d5046b..73d32c8 100644 (file)
 #include "exynos_drm_drv.h"
 #include "exynos_drm_display.h"
 
-#ifdef CONFIG_DRM_PTN3460
-#include "i2c/ptn3460.h"
-#endif
-
 #include <plat/cpu.h>
 #include <plat/gpio-cfg.h>
 
@@ -944,21 +940,15 @@ static irqreturn_t exynos_dp_irq_handler(int irq, void *arg)
 static void exynos_dp_hotplug(struct work_struct *work)
 {
        struct exynos_dp_device *dp;
-       int ret;
 
        dp = container_of(work, struct exynos_dp_device, hotplug_work);
 
-       /* Cable is disconnected, skip dp initialization */
-       if (exynos_dp_detect_hpd(dp))
-               goto out;
+       drm_helper_hpd_irq_event(dp->drm_dev);
+}
 
-#ifdef CONFIG_DRM_PTN3460
-       ret = ptn3460_wait_until_ready(30 * 1000);
-       if (ret) {
-               DRM_ERROR("PTN3460 is not ready, don't plug\n");
-               return;
-       }
-#endif
+static void exynos_dp_train_link(struct exynos_dp_device *dp)
+{
+       int ret;
 
        ret = exynos_dp_handle_edid(dp);
        if (ret) {
@@ -985,14 +975,14 @@ static void exynos_dp_hotplug(struct work_struct *work)
        exynos_dp_set_link_bandwidth(dp, dp->video_info->link_rate);
 
        exynos_dp_init_video(dp);
-       exynos_dp_config_video(dp);
-
-out:
-       drm_helper_hpd_irq_event(dp->drm_dev);
 }
 
 static int exynos_dp_power_off(struct exynos_dp_device *dp)
 {
+       if (!dp->enabled)
+               return 0;
+
+       dp->enabled = false;
        exynos_dp_disable_hpd(dp);
 
        if (work_pending(&dp->hotplug_work))
@@ -1007,6 +997,9 @@ static int exynos_dp_power_off(struct exynos_dp_device *dp)
 
 static int exynos_dp_power_on(struct exynos_dp_device *dp)
 {
+       if (dp->enabled)
+               return 0;
+
        if (dp->phy_ops.phy_init)
                dp->phy_ops.phy_init();
 
@@ -1022,6 +1015,10 @@ static int exynos_dp_power_on(struct exynos_dp_device *dp)
        if (dp->irq < 0 && !exynos_dp_detect_hpd(dp))
                schedule_work(&dp->hotplug_work);
 
+       exynos_dp_train_link(dp);
+       exynos_dp_config_video(dp);
+
+       dp->enabled = true;
        return 0;
 }
 
@@ -1068,9 +1065,19 @@ static bool exynos_dp_is_connected(void *ctx)
 static int exynos_dp_subdrv_probe(void *ctx, struct drm_device *drm_dev)
 {
        struct exynos_dp_device *dp = ctx;
+       int ret;
 
        dp->drm_dev = drm_dev;
 
+       if (dp->irq >= 0) {
+               ret = request_irq(dp->irq, exynos_dp_irq_handler, dp->irq_flags,
+                               "exynos-dp", dp);
+               if (ret) {
+                       dev_err(dp->dev, "failed to request irq\n");
+                       return ret;
+               }
+       }
+
        exynos_dp_dpms(dp, DRM_MODE_DPMS_ON);
 
        return 0;
@@ -1090,7 +1097,6 @@ static int __devinit exynos_dp_probe(struct platform_device *pdev)
        struct exynos_dp_platdata *pdata;
 
        int ret = 0;
-       int irqflags;
 
        pdata = pdev->dev.platform_data;
        if (!pdata) {
@@ -1153,13 +1159,14 @@ static int __devinit exynos_dp_probe(struct platform_device *pdev)
                s3c_gpio_cfgpin(dp->hpd_gpio, S3C_GPIO_SFN(0xf));
 #endif
                dp->irq = gpio_to_irq(dp->hpd_gpio);
-               irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
+               dp->irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
        } else {
                dp->hpd_gpio = -ENODEV;
                dp->irq = platform_get_irq(pdev, 0);
-               irqflags = 0;
+               dp->irq_flags = 0;
        }
 
+       dp->enabled = false;
        dp->training_type = pdata->training_type;
        dp->video_info = pdata->video_info;
        dp->force_connected = pdata->force_connected;
@@ -1172,15 +1179,6 @@ static int __devinit exynos_dp_probe(struct platform_device *pdev)
 
        INIT_WORK(&dp->hotplug_work, exynos_dp_hotplug);
 
-       if (dp->irq >= 0) {
-               ret = request_irq(dp->irq, exynos_dp_irq_handler, irqflags,
-                               "exynos-dp", dp);
-               if (ret) {
-                       dev_err(&pdev->dev, "failed to request irq\n");
-                       goto err_gpio;
-               }
-       }
-
        platform_set_drvdata(pdev, dp);
 
        exynos_display_attach_panel(EXYNOS_DRM_DISPLAY_TYPE_FIMD, &dp_panel_ops,