summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/video/tegra/dc/dc.h1
-rw-r--r--drivers/video/tegra/dc/hdcp/hdmihdcp.c6
-rw-r--r--drivers/video/tegra/dc/hdcp/hdmihdcp.h2
-rw-r--r--drivers/video/tegra/dc/hdmi2.0.c7
4 files changed, 14 insertions, 2 deletions
diff --git a/drivers/video/tegra/dc/dc.h b/drivers/video/tegra/dc/dc.h
index 2952d6e73..4ec62158a 100644
--- a/drivers/video/tegra/dc/dc.h
+++ b/drivers/video/tegra/dc/dc.h
@@ -637,6 +637,7 @@ struct tegra_dc_out {
637 int hotplug_gpio; 637 int hotplug_gpio;
638 int hotplug_state; /* TEGRA_HPD_STATE_* */ 638 int hotplug_state; /* TEGRA_HPD_STATE_* */
639 int vrr_hotplug_state; 639 int vrr_hotplug_state;
640 int prev_hotplug_state;
640 const char *parent_clk; 641 const char *parent_clk;
641 642
642 unsigned max_pixclock; 643 unsigned max_pixclock;
diff --git a/drivers/video/tegra/dc/hdcp/hdmihdcp.c b/drivers/video/tegra/dc/hdcp/hdmihdcp.c
index bcd07bbbc..619cd84d0 100644
--- a/drivers/video/tegra/dc/hdcp/hdmihdcp.c
+++ b/drivers/video/tegra/dc/hdcp/hdmihdcp.c
@@ -1435,6 +1435,11 @@ exit:
1435 return err; 1435 return err;
1436} 1436}
1437 1437
1438void tegra_nvhdcp_clear_fallback(struct tegra_nvhdcp *nvhdcp)
1439{
1440 g_fallback = 0;
1441}
1442
1438static void nvhdcp_fallback_worker(struct work_struct *work) 1443static void nvhdcp_fallback_worker(struct work_struct *work)
1439{ 1444{
1440 struct tegra_nvhdcp *nvhdcp = 1445 struct tegra_nvhdcp *nvhdcp =
@@ -1490,7 +1495,6 @@ static void nvhdcp_downstream_worker(struct work_struct *work)
1490 } 1495 }
1491 } 1496 }
1492 1497
1493 g_fallback = 0;
1494 1498
1495 nvhdcp_vdbg("%s():started thread %s for sor: %x\n", __func__, 1499 nvhdcp_vdbg("%s():started thread %s for sor: %x\n", __func__,
1496 nvhdcp->name, nvhdcp->hdmi->sor->ctrl_num); 1500 nvhdcp->name, nvhdcp->hdmi->sor->ctrl_num);
diff --git a/drivers/video/tegra/dc/hdcp/hdmihdcp.h b/drivers/video/tegra/dc/hdcp/hdmihdcp.h
index b9be41df9..7bc7d9973 100644
--- a/drivers/video/tegra/dc/hdcp/hdmihdcp.h
+++ b/drivers/video/tegra/dc/hdcp/hdmihdcp.h
@@ -78,6 +78,7 @@ struct tegra_nvhdcp {
78 78
79#ifdef CONFIG_HDCP 79#ifdef CONFIG_HDCP
80void tegra_nvhdcp_set_plug(struct tegra_nvhdcp *nvhdcp, bool hpd); 80void tegra_nvhdcp_set_plug(struct tegra_nvhdcp *nvhdcp, bool hpd);
81void tegra_nvhdcp_clear_fallback(struct tegra_nvhdcp *nvhdcp);
81int tegra_nvhdcp_set_policy(struct tegra_nvhdcp *nvhdcp, int pol); 82int tegra_nvhdcp_set_policy(struct tegra_nvhdcp *nvhdcp, int pol);
82void tegra_nvhdcp_suspend(struct tegra_nvhdcp *nvhdcp); 83void tegra_nvhdcp_suspend(struct tegra_nvhdcp *nvhdcp);
83void tegra_nvhdcp_resume(struct tegra_nvhdcp *nvhdcp); 84void tegra_nvhdcp_resume(struct tegra_nvhdcp *nvhdcp);
@@ -100,6 +101,7 @@ static inline int tegra_nvhdcp_set_policy(struct tegra_nvhdcp *nvhdcp, int pol)
100{ 101{
101 return 0; 102 return 0;
102} 103}
104void tegra_nvhdcp_clear_fallback(struct tegra_nvhdcp *nvhdcp) { }
103static inline void tegra_nvhdcp_suspend(struct tegra_nvhdcp *nvhdcp) { } 105static inline void tegra_nvhdcp_suspend(struct tegra_nvhdcp *nvhdcp) { }
104static inline void tegra_nvhdcp_resume(struct tegra_nvhdcp *nvhdcp) { } 106static inline void tegra_nvhdcp_resume(struct tegra_nvhdcp *nvhdcp) { }
105static inline void tegra_nvhdcp_shutdown(struct tegra_nvhdcp *nvhdcp) { } 107static inline void tegra_nvhdcp_shutdown(struct tegra_nvhdcp *nvhdcp) { }
diff --git a/drivers/video/tegra/dc/hdmi2.0.c b/drivers/video/tegra/dc/hdmi2.0.c
index ad2a0d4b3..a26619515 100644
--- a/drivers/video/tegra/dc/hdmi2.0.c
+++ b/drivers/video/tegra/dc/hdmi2.0.c
@@ -787,6 +787,10 @@ static void tegra_hdmi_hpd_worker(struct work_struct *work)
787 connected = tegra_dc_hpd(hdmi->dc); 787 connected = tegra_dc_hpd(hdmi->dc);
788 orig_state = hdmi->plug_state; 788 orig_state = hdmi->plug_state;
789 789
790 if (hdmi->dc->out->hotplug_state == TEGRA_HPD_STATE_NORMAL &&
791 hdmi->dc->out->prev_hotplug_state == TEGRA_HPD_STATE_NORMAL)
792 tegra_nvhdcp_clear_fallback(hdmi->nvhdcp);
793
790 if (connected) { 794 if (connected) {
791 switch (orig_state) { 795 switch (orig_state) {
792 case TEGRA_HDMI_MONITOR_ENABLE: 796 case TEGRA_HDMI_MONITOR_ENABLE:
@@ -859,6 +863,7 @@ static irqreturn_t tegra_hdmi_hpd_irq_handler(int irq, void *ptr)
859 if (atomic_read(&hdmi->suspended)) 863 if (atomic_read(&hdmi->suspended))
860 return IRQ_HANDLED; 864 return IRQ_HANDLED;
861 865
866 tegra_nvhdcp_clear_fallback(hdmi->nvhdcp);
862 cancel_delayed_work(&hdmi->hpd_worker); 867 cancel_delayed_work(&hdmi->hpd_worker);
863 868
864 if (tegra_edid_get_quirks(hdmi->edid) & 869 if (tegra_edid_get_quirks(hdmi->edid) &
@@ -3376,6 +3381,7 @@ void tegra_hdmi_set_hotplug_state(struct tegra_hdmi *hdmi, int new_hpd_state)
3376 3381
3377 rmb(); 3382 rmb();
3378 hotplug_state = dc->out->hotplug_state; 3383 hotplug_state = dc->out->hotplug_state;
3384 dc->out->prev_hotplug_state = hotplug_state;
3379 3385
3380 if (hotplug_state == TEGRA_HPD_STATE_NORMAL && 3386 if (hotplug_state == TEGRA_HPD_STATE_NORMAL &&
3381 new_hpd_state != TEGRA_HPD_STATE_NORMAL && 3387 new_hpd_state != TEGRA_HPD_STATE_NORMAL &&
@@ -3389,7 +3395,6 @@ void tegra_hdmi_set_hotplug_state(struct tegra_hdmi *hdmi, int new_hpd_state)
3389 3395
3390 dc->out->hotplug_state = new_hpd_state; 3396 dc->out->hotplug_state = new_hpd_state;
3391 wmb(); 3397 wmb();
3392
3393 /* 3398 /*
3394 * sw controlled plug/unplug. 3399 * sw controlled plug/unplug.
3395 * wait for any already executing hpd worker thread. 3400 * wait for any already executing hpd worker thread.