Example #1
0
static void exynos_dp_link_start(struct exynos_dp_device *dp)
{
    u8 buf[5];
    int lane;
    int lane_count;

    lane_count = dp->link_train.lane_count;

    dp->link_train.lt_state = CLOCK_RECOVERY;
    dp->link_train.eq_loop = 0;

    for (lane = 0; lane < lane_count; lane++)
        dp->link_train.cr_loop[lane] = 0;

    /* Set sink to D0 (Sink Not Ready) mode. */
    exynos_dp_write_byte_to_dpcd(dp, DPCD_ADDR_SINK_POWER_STATE,
                                 DPCD_SET_POWER_STATE_D0);

    /* Set link rate and count as you want to establish*/
    exynos_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
    exynos_dp_set_lane_count(dp, dp->link_train.lane_count);

    /* Setup RX configuration */
    buf[0] = dp->link_train.link_rate;
    buf[1] = dp->link_train.lane_count;
    exynos_dp_write_bytes_to_dpcd(dp, DPCD_ADDR_LINK_BW_SET,
                                  2, buf);

    /* Set TX pre-emphasis to minimum */
    for (lane = 0; lane < lane_count; lane++)
        exynos_dp_set_lane_lane_pre_emphasis(dp,
                                             PRE_EMPHASIS_LEVEL_0, lane);

    /* Set training pattern 1 */
    exynos_dp_set_training_pattern(dp, TRAINING_PTN1);

    /* Set RX training pattern */
    buf[0] = DPCD_SCRAMBLING_DISABLED |
             DPCD_TRAINING_PATTERN_1;
    exynos_dp_write_byte_to_dpcd(dp,
                                 DPCD_ADDR_TRAINING_PATTERN_SET, buf[0]);

    for (lane = 0; lane < lane_count; lane++)
        buf[lane] = DPCD_PRE_EMPHASIS_PATTERN2_LEVEL0 |
                    DPCD_VOLTAGE_SWING_PATTERN1_LEVEL0;
    exynos_dp_write_bytes_to_dpcd(dp,
                                  DPCD_ADDR_TRAINING_PATTERN_SET,
                                  lane_count, buf);
}
Example #2
0
static int exynos_dp_link_start(struct exynos_dp_device *dp)
{
	u8 buf[4];
	int lane, lane_count, pll_tries, retval;

	lane_count = dp->link_train.lane_count;

	dp->link_train.lt_state = CLOCK_RECOVERY;
	dp->link_train.eq_loop = 0;

	for (lane = 0; lane < lane_count; lane++)
		dp->link_train.cr_loop[lane] = 0;

	/* Set link rate and count as you want to establish*/
	exynos_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
	exynos_dp_set_lane_count(dp, dp->link_train.lane_count);

	/* Setup RX configuration */
	buf[0] = dp->link_train.link_rate;
	buf[1] = dp->link_train.lane_count;
	retval = exynos_dp_write_bytes_to_dpcd(dp, DP_LINK_BW_SET,
				2, buf);
	if (retval)
		return retval;

	/* Set TX pre-emphasis to minimum */
	for (lane = 0; lane < lane_count; lane++)
		exynos_dp_set_lane_lane_pre_emphasis(dp,
			PRE_EMPHASIS_LEVEL_0, lane);

	/* Wait for PLL lock */
	pll_tries = 0;
	while (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
		if (pll_tries == DP_TIMEOUT_LOOP_COUNT) {
			dev_err(dp->dev, "Wait for PLL lock timed out\n");
			return -ETIMEDOUT;
		}

		pll_tries++;
		usleep_range(90, 120);
	}

	/* Set training pattern 1 */
	exynos_dp_set_training_pattern(dp, TRAINING_PTN1);

	/* Set RX training pattern */
	retval = exynos_dp_write_byte_to_dpcd(dp,
			DP_TRAINING_PATTERN_SET,
			DP_LINK_SCRAMBLING_DISABLE | DP_TRAINING_PATTERN_1);
	if (retval)
		return retval;

	for (lane = 0; lane < lane_count; lane++)
		buf[lane] = DP_TRAIN_PRE_EMPH_LEVEL_0 |
			    DP_TRAIN_VOLTAGE_SWING_LEVEL_0;

	retval = exynos_dp_write_bytes_to_dpcd(dp, DP_TRAINING_LANE0_SET,
			lane_count, buf);

	return retval;
}