drm/i915/dp: For PCON TMDS mode set only the relavant bits in config DPCD
authorAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Wed, 10 Nov 2021 07:29:47 +0000 (12:59 +0530)
committerUma Shankar <uma.shankar@intel.com>
Thu, 11 Nov 2021 09:15:09 +0000 (14:45 +0530)
Currently we reset the whole PCON linkConfig DPCD to set the TMDS mode.
This also resets the Source control bit and HDMI link enable bit and
goes to autonomous mode of operation, which is seen to spoil the PCONs
internal state.

This patch avoids resetting the PCON link config register and sets only
the source control bit, with FRL Enable bit set to 0 (TMDS mode) in the
configuration DPCD. It then enables the HDMI Link Enable bit.

v2: Removed the redundant resetting of the bits as the buffer is already
initialized to 0. (Uma)
Updated comments and commit message.

v3: Rebase

Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Reviewed-by: Uma Shankar <uma.shankar@intel.com>
Signed-off-by: Uma Shankar <uma.shankar@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211110072947.171659-3-ankit.k.nautiyal@intel.com
drivers/gpu/drm/i915/display/intel_dp.c

index f5fd106..a0ff16b 100644 (file)
@@ -2287,6 +2287,28 @@ static bool intel_dp_is_hdmi_2_1_sink(struct intel_dp *intel_dp)
        return false;
 }
 
+static
+int intel_dp_pcon_set_tmds_mode(struct intel_dp *intel_dp)
+{
+       int ret;
+       u8 buf = 0;
+
+       /* Set PCON source control mode */
+       buf |= DP_PCON_ENABLE_SOURCE_CTL_MODE;
+
+       ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, buf);
+       if (ret < 0)
+               return ret;
+
+       /* Set HDMI LINK ENABLE */
+       buf |= DP_PCON_ENABLE_HDMI_LINK;
+       ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, buf);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
 void intel_dp_check_frl_training(struct intel_dp *intel_dp)
 {
        struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
@@ -2305,7 +2327,7 @@ void intel_dp_check_frl_training(struct intel_dp *intel_dp)
                int ret, mode;
 
                drm_dbg(&dev_priv->drm, "Couldn't set FRL mode, continuing with TMDS mode\n");
-               ret = drm_dp_pcon_reset_frl_config(&intel_dp->aux);
+               ret = intel_dp_pcon_set_tmds_mode(intel_dp);
                mode = drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, NULL);
 
                if (ret < 0 || mode != DP_PCON_HDMI_MODE_TMDS)