drm/i915: preserve other DP_TEST_SINK bits.
authorRodrigo Vivi <[email protected]>
Mon, 29 Sep 2014 22:29:52 +0000 (18:29 -0400)
committerDaniel Vetter <[email protected]>
Tue, 30 Sep 2014 07:39:02 +0000 (09:39 +0200)
Sink crc was implemented based on dp 1.1 spec that had all TEST_SINK bits
reserved reading all 0s. But when reviewing my latest changes on sink crc
Todd warned me that on new specs we have other valid bits on this reg that we
might want to preserve.

Cc: Todd Previte <[email protected]>
Signed-off-by: Rodrigo Vivi <[email protected]>
Reviewed-by: Todd Previte <[email protected]>
Signed-off-by: Daniel Vetter <[email protected]>
drivers/gpu/drm/i915/intel_dp.c

index 3caac0f01265c9d1645ba74f784ff316553775b9..342d624f8312599f4d7df2f430aada8c2ff24d16 100644 (file)
@@ -3817,8 +3817,9 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
        if (!(buf & DP_TEST_CRC_SUPPORTED))
                return -ENOTTY;
 
+       drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf);
        if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
-                              DP_TEST_SINK_START) < 0)
+                               buf | DP_TEST_SINK_START) < 0)
                return -EIO;
 
        drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf);
@@ -3837,7 +3838,10 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
        if (drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_CRC_R_CR, crc, 6) < 0)
                return -EIO;
 
-       drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK, 0);
+       drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf);
+       drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
+                       buf & ~DP_TEST_SINK_START);
+
        return 0;
 }