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>
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);
exynos_dp_init_dp(dp);
- enable_irq(dp->irq);
-
return 0;
}
goto err_gpio;
}
- disable_irq(dp->irq);
-
platform_set_drvdata(pdev, dp);
exynos_display_attach_panel(EXYNOS_DRM_DISPLAY_TYPE_FIMD, &dp_panel_ops,
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);
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;