drm/exynos: dp: Mask interrupts instead of disable
authorSean Paul <seanpaul@chromium.org>
Tue, 6 Nov 2012 17:14:36 +0000 (12:14 -0500)
committerGerrit <chrome-bot@google.com>
Tue, 13 Nov 2012 17:31:13 +0000 (09:31 -0800)
Instead of running disable_irq on suspend, and subsequently enable_irq
on resume, just mask off the interrupt before suspending. This avoids
the ugly disable_irq in probe, and any future issues with mismatched irq
enable/disables.

BUG=None
TEST=Tested on snow idle suspend/lid suspend, boot, etc.

Change-Id: I0e913b1c563b3b0081c074eac52c8d887d5dca58
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/37621
Reviewed-by: Mandeep Singh Baines <msb@chromium.org>
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
drivers/gpu/drm/exynos/exynos_dp_core.c
drivers/gpu/drm/exynos/exynos_dp_core.h
drivers/gpu/drm/exynos/exynos_dp_reg.c

index f20d0c0..126c9d7 100644 (file)
@@ -978,7 +978,7 @@ static void exynos_dp_hotplug(struct work_struct *work)
 
 static int exynos_dp_power_off(struct exynos_dp_device *dp)
 {
-       disable_irq(dp->irq);
+       exynos_dp_disable_hpd(dp);
 
        if (work_pending(&dp->hotplug_work))
                flush_work_sync(&dp->hotplug_work);
@@ -999,8 +999,6 @@ static int exynos_dp_power_on(struct exynos_dp_device *dp)
 
        exynos_dp_init_dp(dp);
 
-       enable_irq(dp->irq);
-
        return 0;
 }
 
@@ -1152,8 +1150,6 @@ static int __devinit exynos_dp_probe(struct platform_device *pdev)
                goto err_gpio;
        }
 
-       disable_irq(dp->irq);
-
        platform_set_drvdata(pdev, dp);
 
        exynos_display_attach_panel(EXYNOS_DRM_DISPLAY_TYPE_FIMD, &dp_panel_ops,
index 13d2cc1..85a0812 100644 (file)
@@ -67,6 +67,7 @@ void exynos_dp_set_analog_power_down(struct exynos_dp_device *dp,
                                bool enable);
 void exynos_dp_init_analog_func(struct exynos_dp_device *dp);
 void exynos_dp_init_hpd(struct exynos_dp_device *dp);
+void exynos_dp_disable_hpd(struct exynos_dp_device *dp);
 enum dp_irq_type exynos_dp_get_irq_type(struct exynos_dp_device *dp);
 void exynos_dp_clear_hotplug_interrupts(struct exynos_dp_device *dp);
 void exynos_dp_reset_aux(struct exynos_dp_device *dp);
index c8b423b..3a79b02 100644 (file)
@@ -325,6 +325,23 @@ void exynos_dp_init_hpd(struct exynos_dp_device *dp)
        writel(reg, dp->reg_base + EXYNOS_DP_INT_STA_MASK);
 }
 
+void exynos_dp_disable_hpd(struct exynos_dp_device *dp)
+{
+       u32 reg;
+
+       if (gpio_is_valid(dp->hpd_gpio))
+               return;
+
+       exynos_dp_clear_hotplug_interrupts(dp);
+
+       /* Mask hotplug interrupts */
+       reg = 0;
+       writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_4);
+
+       reg = 0;
+       writel(reg, dp->reg_base + EXYNOS_DP_INT_STA_MASK);
+}
+
 enum dp_irq_type exynos_dp_get_irq_type(struct exynos_dp_device *dp)
 {
        u32 reg;