return single_open(file, dbg_hotplug_show, inode->i_private);
}
+static inline void tegra_hdmi_hotplug_signal(struct tegra_dc_hdmi_data *hdmi)
+{
+ tegra_dc_hpd(hdmi->dc);
+ queue_delayed_work(system_nrt_wq, &hdmi->work,
+ msecs_to_jiffies(30));
+}
+
+static inline void tegra_hdmi_hotplug_disable(struct tegra_dc_hdmi_data *hdmi)
+{
+ struct tegra_dc *dc = hdmi->dc;
+
+ disable_irq(gpio_to_irq(dc->out->hotplug_gpio));
+}
+
+/* enables hotplug IRQ - this must be balanced */
+static inline void tegra_hdmi_hotplug_enable(struct tegra_dc_hdmi_data *hdmi)
+{
+ struct tegra_dc *dc = hdmi->dc;
+
+ enable_irq(gpio_to_irq(dc->out->hotplug_gpio));
+}
+
static int dbg_hotplug_write(struct file *file, const char __user *addr,
size_t len, loff_t *pos)
{
dc->out->hotplug_state = new_state;
- queue_delayed_work(system_nrt_wq, &hdmi->work,
- msecs_to_jiffies(100));
-
+ tegra_hdmi_hotplug_signal(hdmi);
return len;
}
spin_lock_irqsave(&hdmi->suspend_lock, flags);
if (!hdmi->suspended) {
__cancel_delayed_work(&hdmi->work);
- queue_delayed_work(system_nrt_wq, &hdmi->work,
- msecs_to_jiffies(100));
+ tegra_hdmi_hotplug_signal(hdmi);
}
spin_unlock_irqrestore(&hdmi->suspend_lock, flags);
struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
unsigned long flags;
+ /* turn off hotplug detection to avoid resume event when +5V falls */
+ tegra_hdmi_hotplug_disable(hdmi);
+
tegra_nvhdcp_suspend(hdmi->nvhdcp);
spin_lock_irqsave(&hdmi->suspend_lock, flags);
hdmi->suspended = true;
static void tegra_dc_hdmi_resume(struct tegra_dc *dc)
{
struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
- bool hpd = tegra_dc_hdmi_hpd(dc);
unsigned long flags;
spin_lock_irqsave(&hdmi->suspend_lock, flags);
hdmi->suspended = false;
- queue_delayed_work(system_nrt_wq, &hdmi->work,
- msecs_to_jiffies(hpd ? 100 : 30));
-
spin_unlock_irqrestore(&hdmi->suspend_lock, flags);
+
tegra_nvhdcp_resume(hdmi->nvhdcp);
+ /* restore hotplug detection */
+ tegra_hdmi_hotplug_enable(hdmi);
+ tegra_hdmi_hotplug_signal(hdmi);
}
#ifdef CONFIG_SWITCH