diff options
author | Animesh Kishore <ankishore@nvidia.com> | 2015-08-12 07:37:35 -0400 |
---|---|---|
committer | Animesh Kishore <ankishore@nvidia.com> | 2015-10-08 08:18:32 -0400 |
commit | 5de7ff569233c3eac51025cb53424ac33d438d24 (patch) | |
tree | 8c5e5f7ca870823c5c92299453c714013798de17 /drivers/video/tegra/dc/dp.c | |
parent | 68b6aedb7d08b46a59d44b885af01d24ee748d2c (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.c | 75 |
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 | ||
2183 | static 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 | |||
2173 | static void tegra_dp_hpd_op_edid_ready(void *drv_data) | 2204 | static 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 | ||
2192 | static void tegra_dp_hpd_op_edid_recheck(void *drv_data) | 2225 | static void tegra_dp_hpd_op_edid_recheck(void *drv_data) |