summaryrefslogtreecommitdiffstats
path: root/drivers/video/tegra/dc/dp.c
diff options
context:
space:
mode:
authorAnimesh Kishore <ankishore@nvidia.com>2015-08-12 07:37:35 -0400
committerAnimesh Kishore <ankishore@nvidia.com>2015-10-08 08:18:32 -0400
commit5de7ff569233c3eac51025cb53424ac33d438d24 (patch)
tree8c5e5f7ca870823c5c92299453c714013798de17 /drivers/video/tegra/dc/dp.c
parent68b6aedb7d08b46a59d44b885af01d24ee748d2c (diff)
video: tegra: dp: Fix CTS 4.2.2.2
CTS description: DPCD sink capability read upon HPD Bug 200103501 Change-Id: Iba000486c4fd72e651394710037eebd17dd02eec Signed-off-by: Animesh Kishore <ankishore@nvidia.com> Reviewed-on: http://git-master/r/782416 (cherry picked from commit 8e2de69e87a4194a73cb929b6057a5f850478d46) Reviewed-on: http://git-master/r/812194 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
Diffstat (limited to 'drivers/video/tegra/dc/dp.c')
-rw-r--r--drivers/video/tegra/dc/dp.c75
1 files changed, 54 insertions, 21 deletions
diff --git a/drivers/video/tegra/dc/dp.c b/drivers/video/tegra/dc/dp.c
index 740c8cab9..7eeeac387 100644
--- a/drivers/video/tegra/dc/dp.c
+++ b/drivers/video/tegra/dc/dp.c
@@ -1536,8 +1536,11 @@ static int tegra_dp_init_max_link_cfg(struct tegra_dc_dp_data *dp,
1536 u8 dpcd_data; 1536 u8 dpcd_data;
1537 int ret; 1537 int ret;
1538 1538
1539 CHECK_RET(tegra_dc_dp_dpcd_read(dp, NV_DPCD_MAX_LANE_COUNT, 1539 if (dp->sink_cap_valid)
1540 &dpcd_data)); 1540 dpcd_data = dp->sink_cap[NV_DPCD_MAX_LANE_COUNT];
1541 else
1542 CHECK_RET(tegra_dc_dp_dpcd_read(dp,
1543 NV_DPCD_MAX_LANE_COUNT, &dpcd_data));
1541 1544
1542 cfg->max_lane_count = dpcd_data & NV_DPCD_MAX_LANE_COUNT_MASK; 1545 cfg->max_lane_count = dpcd_data & NV_DPCD_MAX_LANE_COUNT_MASK;
1543 if (dp->pdata && dp->pdata->lanes && 1546 if (dp->pdata && dp->pdata->lanes &&
@@ -1545,28 +1548,36 @@ static int tegra_dp_init_max_link_cfg(struct tegra_dc_dp_data *dp,
1545 cfg->max_lane_count = dp->pdata->lanes; 1548 cfg->max_lane_count = dp->pdata->lanes;
1546 1549
1547 cfg->tps3_supported = 1550 cfg->tps3_supported =
1548 (dpcd_data & NV_DPCD_MAX_LANE_COUNT_TPS3_SUPPORTED_YES) ? 1551 (dpcd_data &
1549 true : false; 1552 NV_DPCD_MAX_LANE_COUNT_TPS3_SUPPORTED_YES) ?
1550 1553 true : false;
1551 cfg->support_enhanced_framing = 1554 cfg->support_enhanced_framing =
1552 (dpcd_data & NV_DPCD_MAX_LANE_COUNT_ENHANCED_FRAMING_YES) ? 1555 (dpcd_data & NV_DPCD_MAX_LANE_COUNT_ENHANCED_FRAMING_YES) ?
1553 true : false; 1556 true : false;
1554 1557
1555 CHECK_RET(tegra_dc_dp_dpcd_read(dp, NV_DPCD_MAX_DOWNSPREAD, 1558 if (dp->sink_cap_valid)
1556 &dpcd_data)); 1559 dpcd_data = dp->sink_cap[NV_DPCD_MAX_DOWNSPREAD];
1560 else
1561 CHECK_RET(tegra_dc_dp_dpcd_read(dp,
1562 NV_DPCD_MAX_DOWNSPREAD, &dpcd_data));
1557 cfg->downspread = 1563 cfg->downspread =
1558 (dpcd_data & NV_DPCD_MAX_DOWNSPREAD_VAL_0_5_PCT) ? 1564 (dpcd_data & NV_DPCD_MAX_DOWNSPREAD_VAL_0_5_PCT) ?
1559 true : false; 1565 true : false;
1560
1561 cfg->support_fast_lt = (dpcd_data & 1566 cfg->support_fast_lt = (dpcd_data &
1562 NV_DPCD_MAX_DOWNSPREAD_NO_AUX_HANDSHAKE_LT_T) ? true : false; 1567 NV_DPCD_MAX_DOWNSPREAD_NO_AUX_HANDSHAKE_LT_T) ?
1568 true : false;
1563 1569
1564 CHECK_RET(tegra_dc_dp_dpcd_read(dp, 1570 CHECK_RET(tegra_dc_dp_dpcd_read(dp,
1565 NV_DPCD_TRAINING_AUX_RD_INTERVAL, &dpcd_data)); 1571 NV_DPCD_TRAINING_AUX_RD_INTERVAL, &dpcd_data));
1566 cfg->aux_rd_interval = dpcd_data; 1572 cfg->aux_rd_interval = dpcd_data;
1567 1573
1568 CHECK_RET(tegra_dc_dp_dpcd_read(dp, NV_DPCD_MAX_LINK_BANDWIDTH, 1574 if (dp->sink_cap_valid)
1569 &cfg->max_link_bw)); 1575 cfg->max_link_bw =
1576 dp->sink_cap[NV_DPCD_MAX_LINK_BANDWIDTH];
1577 else
1578 CHECK_RET(tegra_dc_dp_dpcd_read(dp,
1579 NV_DPCD_MAX_LINK_BANDWIDTH,
1580 &cfg->max_link_bw));
1570 if (dp->pdata && dp->pdata->link_bw && 1581 if (dp->pdata && dp->pdata->link_bw &&
1571 dp->pdata->link_bw < cfg->max_link_bw) 1582 dp->pdata->link_bw < cfg->max_link_bw)
1572 cfg->max_link_bw = dp->pdata->link_bw; 1583 cfg->max_link_bw = dp->pdata->link_bw;
@@ -1574,15 +1585,14 @@ static int tegra_dp_init_max_link_cfg(struct tegra_dc_dp_data *dp,
1574 CHECK_RET(tegra_dc_dp_dpcd_read(dp, NV_DPCD_EDP_CONFIG_CAP, 1585 CHECK_RET(tegra_dc_dp_dpcd_read(dp, NV_DPCD_EDP_CONFIG_CAP,
1575 &dpcd_data)); 1586 &dpcd_data));
1576 cfg->alt_scramber_reset_cap = 1587 cfg->alt_scramber_reset_cap =
1577 (dpcd_data & NV_DPCD_EDP_CONFIG_CAP_ASC_RESET_YES) ? 1588 (dpcd_data & NV_DPCD_EDP_CONFIG_CAP_ASC_RESET_YES) ?
1578 true : false; 1589 true : false;
1579 1590 cfg->only_enhanced_framing = (dpcd_data &
1580 cfg->only_enhanced_framing = 1591 NV_DPCD_EDP_CONFIG_CAP_FRAMING_CHANGE_YES) ?
1581 (dpcd_data & NV_DPCD_EDP_CONFIG_CAP_FRAMING_CHANGE_YES) ? 1592 true : false;
1582 true : false;
1583
1584 cfg->edp_cap = (dpcd_data & 1593 cfg->edp_cap = (dpcd_data &
1585 NV_DPCD_EDP_CONFIG_CAP_DISPLAY_CONTROL_CAP_YES) ? true : false; 1594 NV_DPCD_EDP_CONFIG_CAP_DISPLAY_CONTROL_CAP_YES) ?
1595 true : false;
1586 } 1596 }
1587 1597
1588 cfg->bits_per_pixel = dp->dc->out->depth ? : 24; 1598 cfg->bits_per_pixel = dp->dc->out->depth ? : 24;
@@ -2170,6 +2180,27 @@ void tegra_dp_update_link_config(struct tegra_dc_dp_data *dp)
2170 tegra_dp_tu_config(dp, cfg); 2180 tegra_dp_tu_config(dp, cfg);
2171} 2181}
2172 2182
2183static void tegra_dp_read_sink_cap(struct tegra_dc_dp_data *dp)
2184{
2185 struct tegra_dc *dc = dp->dc;
2186 u32 sink_cap_rd_size = DP_DPCD_SINK_CAP_SIZE;
2187 u32 aux_stat = 0;
2188 u8 start_offset = 0;
2189 int err;
2190
2191 tegra_dc_io_start(dc);
2192
2193 dp->sink_cap_valid = false;
2194
2195 err = tegra_dc_dpaux_read(dp, DPAUX_DP_AUXCTL_CMD_AUXRD,
2196 start_offset, dp->sink_cap, &sink_cap_rd_size,
2197 &aux_stat);
2198 if (!err)
2199 dp->sink_cap_valid = true;
2200
2201 tegra_dc_io_end(dc);
2202}
2203
2173static void tegra_dp_hpd_op_edid_ready(void *drv_data) 2204static void tegra_dp_hpd_op_edid_ready(void *drv_data)
2174{ 2205{
2175 struct tegra_dc_dp_data *dp = drv_data; 2206 struct tegra_dc_dp_data *dp = drv_data;
@@ -2187,6 +2218,8 @@ static void tegra_dp_hpd_op_edid_ready(void *drv_data)
2187 */ 2218 */
2188 dc->out->width = dc->out->width ? : dc->out->h_size; 2219 dc->out->width = dc->out->width ? : dc->out->h_size;
2189 dc->out->height = dc->out->height ? : dc->out->v_size; 2220 dc->out->height = dc->out->height ? : dc->out->v_size;
2221
2222 tegra_dp_read_sink_cap(dp);
2190} 2223}
2191 2224
2192static void tegra_dp_hpd_op_edid_recheck(void *drv_data) 2225static void tegra_dp_hpd_op_edid_recheck(void *drv_data)