aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2016-10-03 03:55:15 -0400
committerJani Nikula <jani.nikula@intel.com>2016-10-10 09:06:42 -0400
commit1015811609c0328b5ed670d07748591b837e74eb (patch)
tree7fe139bb46bfe9648c5b7b4b8953c56baaa38b83 /drivers/gpu
parentc79d7303e1ddc8260b0f385212b26cad297ff890 (diff)
drm/i915: Move long hpd handling into the hotplug work
We can't rely on connector->status in the detect() hook if the long hpd was already handled by the dig_port_work as that won't update connector->status. Thus we have to defer the long hpd handling entirely until the hotplug work runs to avoid the double long hpd handling the "detect_done" flag is trying to prevent. We'll start to depend on connector->status being up to date in a following patch. Cc: Damien Cassou <damien@cassou.me> Cc: freedesktop.org@gp.mailgun.org Cc: Arno <blouin.arno@gmail.com> Cc: Shubhangi Shrivastava <shubhangi.shrivastava@intel.com> Cc: Sivakumar Thulasimani <sivakumar.thulasimani@intel.com> Cc: Ander Conselvan de Oliveira <conselvan2@gmail.com> Cc: stable@vger.kernel.org Tested-by: Arno <blouin.arno@gmail.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=83348 Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1475481316-8194-1-git-send-email-ville.syrjala@linux.intel.com Reviewed-by: Ander Conselvan de Oliveira <conselvan2@gmail.com> (cherry picked from commit 27d4efc5591a5853de54713bc717de73c8951e17) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c48
1 files changed, 23 insertions, 25 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index acd0c51f74d5..43d6fd3c460b 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -4831,36 +4831,34 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
4831 port_name(intel_dig_port->port), 4831 port_name(intel_dig_port->port),
4832 long_hpd ? "long" : "short"); 4832 long_hpd ? "long" : "short");
4833 4833
4834 if (long_hpd) {
4835 intel_dp->detect_done = false;
4836 return IRQ_NONE;
4837 }
4838
4834 power_domain = intel_display_port_aux_power_domain(intel_encoder); 4839 power_domain = intel_display_port_aux_power_domain(intel_encoder);
4835 intel_display_power_get(dev_priv, power_domain); 4840 intel_display_power_get(dev_priv, power_domain);
4836 4841
4837 if (long_hpd) { 4842 if (intel_dp->is_mst) {
4838 intel_dp_long_pulse(intel_dp->attached_connector); 4843 if (intel_dp_check_mst_status(intel_dp) == -EINVAL) {
4839 if (intel_dp->is_mst) 4844 /*
4840 ret = IRQ_HANDLED; 4845 * If we were in MST mode, and device is not
4841 goto put_power; 4846 * there, get out of MST mode
4842 4847 */
4843 } else { 4848 DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
4844 if (intel_dp->is_mst) { 4849 intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
4845 if (intel_dp_check_mst_status(intel_dp) == -EINVAL) { 4850 intel_dp->is_mst = false;
4846 /* 4851 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
4847 * If we were in MST mode, and device is not 4852 intel_dp->is_mst);
4848 * there, get out of MST mode 4853 intel_dp->detect_done = false;
4849 */ 4854 goto put_power;
4850 DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
4851 intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
4852 intel_dp->is_mst = false;
4853 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
4854 intel_dp->is_mst);
4855 goto put_power;
4856 }
4857 } 4855 }
4856 }
4858 4857
4859 if (!intel_dp->is_mst) { 4858 if (!intel_dp->is_mst) {
4860 if (!intel_dp_short_pulse(intel_dp)) { 4859 if (!intel_dp_short_pulse(intel_dp)) {
4861 intel_dp_long_pulse(intel_dp->attached_connector); 4860 intel_dp->detect_done = false;
4862 goto put_power; 4861 goto put_power;
4863 }
4864 } 4862 }
4865 } 4863 }
4866 4864