diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2016-10-03 03:55:15 -0400 |
---|---|---|
committer | Jani Nikula <jani.nikula@intel.com> | 2016-10-10 09:06:42 -0400 |
commit | 1015811609c0328b5ed670d07748591b837e74eb (patch) | |
tree | 7fe139bb46bfe9648c5b7b4b8953c56baaa38b83 /drivers/gpu | |
parent | c79d7303e1ddc8260b0f385212b26cad297ff890 (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.c | 48 |
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 | ||