From 9af9987d3d1e082f18d6381567cbfc4051170225 Mon Sep 17 00:00:00 2001 From: Ajay Singh Parmar Date: Fri, 19 Jul 2019 10:57:53 -0700 Subject: [PATCH] disp: msm: dp: add support for test pattern #4 DP specification mandate test pattern #4 for CTS 1.4a. Add support for the same in link training #2 as per specification. CRs-Fixed: 2490128 Change-Id: I2f72fec340b56270e7fd1c2940adafe1068bab43 Signed-off-by: Ajay Singh Parmar --- msm/dp/dp_catalog.c | 26 +++++++++++++++++++------- msm/dp/dp_ctrl.c | 4 +++- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/msm/dp/dp_catalog.c b/msm/dp/dp_catalog.c index 339580c5cd..07ce6eac79 100644 --- a/msm/dp/dp_catalog.c +++ b/msm/dp/dp_catalog.c @@ -1212,6 +1212,7 @@ static void dp_catalog_ctrl_set_pattern(struct dp_catalog_ctrl *ctrl, { int bit, cnt = 10; u32 data; + const u32 link_training_offset = 3; struct dp_catalog_private *catalog; struct dp_io_data *io_data; @@ -1223,17 +1224,28 @@ static void dp_catalog_ctrl_set_pattern(struct dp_catalog_ctrl *ctrl, catalog = dp_catalog_get_priv(ctrl); io_data = catalog->io.dp_link; - bit = 1; - bit <<= (pattern - 1); - DP_DEBUG("hw: bit=%d train=%d\n", bit, pattern); - dp_write(catalog->exe_mode, io_data, DP_STATE_CTRL, bit); + switch (pattern) { + case DP_TRAINING_PATTERN_4: + bit = 3; + break; + case DP_TRAINING_PATTERN_3: + case DP_TRAINING_PATTERN_2: + case DP_TRAINING_PATTERN_1: + bit = pattern - 1; + break; + default: + DP_ERR("invalid pattern\n"); + return; + } - bit = 8; - bit <<= (pattern - 1); + DP_DEBUG("hw: bit=%d train=%d\n", bit, pattern); + dp_write(catalog->exe_mode, io_data, DP_STATE_CTRL, BIT(bit)); + + bit += link_training_offset; while (cnt--) { data = dp_read(catalog->exe_mode, io_data, DP_MAINLINK_READY); - if (data & bit) + if (data & BIT(bit)) break; } diff --git a/msm/dp/dp_ctrl.c b/msm/dp/dp_ctrl.c index 434b6a1822..f57451812c 100644 --- a/msm/dp/dp_ctrl.c +++ b/msm/dp/dp_ctrl.c @@ -453,7 +453,9 @@ static int dp_ctrl_link_training_2(struct dp_ctrl_private *ctrl) /* Make sure to clear the current pattern before starting a new one */ wmb(); - if (drm_dp_tps3_supported(ctrl->panel->dpcd)) + if (drm_dp_tps4_supported(ctrl->panel->dpcd)) + dpcd_pattern = DP_TRAINING_PATTERN_4; + else if (drm_dp_tps3_supported(ctrl->panel->dpcd)) dpcd_pattern = DP_TRAINING_PATTERN_3; else dpcd_pattern = DP_TRAINING_PATTERN_2;