#include <linux/interrupt.h>
 #include <linux/delay.h>
 #include <linux/of.h>
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
 #include <linux/component.h>
 #include <linux/phy/phy.h>
 #include <video/of_display_timing.h>
        struct drm_device *drm_dev = data;
        struct resource *res;
        struct exynos_dp_device *dp;
+       unsigned int irq_flags;
 
        int ret = 0;
 
        if (IS_ERR(dp->reg_base))
                return PTR_ERR(dp->reg_base);
 
-       dp->irq = platform_get_irq(pdev, 0);
+       dp->hpd_gpio = of_get_named_gpio(dev->of_node, "samsung,hpd-gpio", 0);
+
+       if (gpio_is_valid(dp->hpd_gpio)) {
+               /*
+                * Set up the hotplug GPIO from the device tree as an interrupt.
+                * Simply specifying a different interrupt in the device tree
+                * doesn't work since we handle hotplug rather differently when
+                * using a GPIO.  We also need the actual GPIO specifier so
+                * that we can get the current state of the GPIO.
+                */
+               ret = devm_gpio_request_one(&pdev->dev, dp->hpd_gpio, GPIOF_IN,
+                                           "hpd_gpio");
+               if (ret) {
+                       dev_err(&pdev->dev, "failed to get hpd gpio\n");
+                       return ret;
+               }
+               dp->irq = gpio_to_irq(dp->hpd_gpio);
+               irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
+       } else {
+               dp->hpd_gpio = -ENODEV;
+               dp->irq = platform_get_irq(pdev, 0);
+               irq_flags = 0;
+       }
+
        if (dp->irq == -ENXIO) {
                dev_err(&pdev->dev, "failed to get irq\n");
                return -ENODEV;
 
        exynos_dp_init_dp(dp);
 
-       ret = devm_request_irq(&pdev->dev, dp->irq, exynos_dp_irq_handler, 0,
-                               "exynos-dp", dp);
+       ret = devm_request_irq(&pdev->dev, dp->irq, exynos_dp_irq_handler,
+                       irq_flags, "exynos-dp", dp);
        if (ret) {
                dev_err(&pdev->dev, "failed to request irq\n");
                return ret;
 
 #include <linux/device.h>
 #include <linux/io.h>
 #include <linux/delay.h>
+#include <linux/gpio.h>
 
 #include "exynos_dp_core.h"
 #include "exynos_dp_reg.h"
 {
        u32 reg;
 
+       if (gpio_is_valid(dp->hpd_gpio))
+               return;
+
        reg = HOTPLUG_CHG | HPD_LOST | PLUG;
        writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_4);
 
 {
        u32 reg;
 
+       if (gpio_is_valid(dp->hpd_gpio))
+               return;
+
        exynos_dp_clear_hotplug_interrupts(dp);
 
        reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
 {
        u32 reg;
 
-       /* Parse hotplug interrupt status register */
-       reg = readl(dp->reg_base + EXYNOS_DP_COMMON_INT_STA_4);
+       if (gpio_is_valid(dp->hpd_gpio)) {
+               reg = gpio_get_value(dp->hpd_gpio);
+               if (reg)
+                       return DP_IRQ_TYPE_HP_CABLE_IN;
+               else
+                       return DP_IRQ_TYPE_HP_CABLE_OUT;
+       } else {
+               /* Parse hotplug interrupt status register */
+               reg = readl(dp->reg_base + EXYNOS_DP_COMMON_INT_STA_4);
 
-       if (reg & PLUG)
-               return DP_IRQ_TYPE_HP_CABLE_IN;
+               if (reg & PLUG)
+                       return DP_IRQ_TYPE_HP_CABLE_IN;
 
-       if (reg & HPD_LOST)
-               return DP_IRQ_TYPE_HP_CABLE_OUT;
+               if (reg & HPD_LOST)
+                       return DP_IRQ_TYPE_HP_CABLE_OUT;
 
-       if (reg & HOTPLUG_CHG)
-               return DP_IRQ_TYPE_HP_CHANGE;
+               if (reg & HOTPLUG_CHG)
+                       return DP_IRQ_TYPE_HP_CHANGE;
 
-       return DP_IRQ_TYPE_UNKNOWN;
+               return DP_IRQ_TYPE_UNKNOWN;
+       }
 }
 
 void exynos_dp_reset_aux(struct exynos_dp_device *dp)
 {
        u32 reg;
 
-       reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
-       if (reg & HPD_STATUS)
-               return 0;
+       if (gpio_is_valid(dp->hpd_gpio)) {
+               if (gpio_get_value(dp->hpd_gpio))
+                       return 0;
+       } else {
+               reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
+               if (reg & HPD_STATUS)
+                       return 0;
+       }
 
        return -EINVAL;
 }