Lines Matching refs:dp
82 analogix_dp_enable_rx_to_enhanced_mode(struct analogix_dp_device *dp, in analogix_dp_enable_rx_to_enhanced_mode() argument
88 ret = drm_dp_dpcd_readb(&dp->aux, DP_LANE_COUNT_SET, &data); in analogix_dp_enable_rx_to_enhanced_mode()
93 ret = drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET, in analogix_dp_enable_rx_to_enhanced_mode()
97 ret = drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET, in analogix_dp_enable_rx_to_enhanced_mode()
103 static int analogix_dp_set_enhanced_mode(struct analogix_dp_device *dp) in analogix_dp_set_enhanced_mode() argument
109 enhanced_frame_en = drm_dp_enhanced_frame_cap(dp->dpcd); in analogix_dp_set_enhanced_mode()
111 ret = analogix_dp_enable_rx_to_enhanced_mode(dp, enhanced_frame_en); in analogix_dp_set_enhanced_mode()
129 ret = drm_dp_dpcd_readb(&dp->aux, DP_EDP_CONFIGURATION_CAP, in analogix_dp_set_enhanced_mode()
137 analogix_dp_enable_enhanced_mode(dp, enhanced_frame_en); in analogix_dp_set_enhanced_mode()
142 static int analogix_dp_training_pattern_dis(struct analogix_dp_device *dp) in analogix_dp_training_pattern_dis() argument
146 analogix_dp_set_training_pattern(dp, DP_NONE); in analogix_dp_training_pattern_dis()
148 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET, in analogix_dp_training_pattern_dis()
154 static int analogix_dp_enable_sink_to_assr_mode(struct analogix_dp_device *dp, bool enable) in analogix_dp_enable_sink_to_assr_mode() argument
159 ret = drm_dp_dpcd_readb(&dp->aux, DP_EDP_CONFIGURATION_SET, &data); in analogix_dp_enable_sink_to_assr_mode()
164 ret = drm_dp_dpcd_writeb(&dp->aux, DP_EDP_CONFIGURATION_SET, in analogix_dp_enable_sink_to_assr_mode()
167 ret = drm_dp_dpcd_writeb(&dp->aux, DP_EDP_CONFIGURATION_SET, in analogix_dp_enable_sink_to_assr_mode()
173 static int analogix_dp_set_assr_mode(struct analogix_dp_device *dp) in analogix_dp_set_assr_mode() argument
178 assr_en = drm_dp_alternate_scrambler_reset_cap(dp->dpcd); in analogix_dp_set_assr_mode()
180 ret = analogix_dp_enable_sink_to_assr_mode(dp, assr_en); in analogix_dp_set_assr_mode()
184 analogix_dp_enable_assr_mode(dp, assr_en); in analogix_dp_set_assr_mode()
189 static int analogix_dp_link_start(struct analogix_dp_device *dp) in analogix_dp_link_start() argument
194 lane_count = dp->link_train.lane_count; in analogix_dp_link_start()
196 dp->link_train.lt_state = CLOCK_RECOVERY; in analogix_dp_link_start()
197 dp->link_train.eq_loop = 0; in analogix_dp_link_start()
200 dp->link_train.cr_loop[lane] = 0; in analogix_dp_link_start()
203 analogix_dp_set_link_bandwidth(dp, dp->link_train.link_rate); in analogix_dp_link_start()
204 analogix_dp_set_lane_count(dp, dp->link_train.lane_count); in analogix_dp_link_start()
206 if (dp->nr_link_rate_table) { in analogix_dp_link_start()
208 drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET, dp->link_train.lane_count); in analogix_dp_link_start()
209 drm_dp_dpcd_writeb(&dp->aux, DP_LINK_RATE_SET, dp->link_rate_select); in analogix_dp_link_start()
212 buf[0] = dp->link_train.link_rate; in analogix_dp_link_start()
213 buf[1] = dp->link_train.lane_count; in analogix_dp_link_start()
214 retval = drm_dp_dpcd_write(&dp->aux, DP_LINK_BW_SET, buf, 2); in analogix_dp_link_start()
220 buf[0] = analogix_dp_ssc_supported(dp) ? DP_SPREAD_AMP_0_5 : 0; in analogix_dp_link_start()
222 retval = drm_dp_dpcd_write(&dp->aux, DP_DOWNSPREAD_CTRL, buf, 2); in analogix_dp_link_start()
227 retval = analogix_dp_set_assr_mode(dp); in analogix_dp_link_start()
229 dev_err(dp->dev, "failed to set assr mode\n"); in analogix_dp_link_start()
234 retval = analogix_dp_set_enhanced_mode(dp); in analogix_dp_link_start()
236 dev_err(dp->dev, "failed to set enhance mode\n"); in analogix_dp_link_start()
242 dp->link_train.training_lane[lane] = in analogix_dp_link_start()
245 analogix_dp_set_lane_link_training(dp); in analogix_dp_link_start()
248 analogix_dp_set_training_pattern(dp, TRAINING_PTN1); in analogix_dp_link_start()
251 retval = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET, in analogix_dp_link_start()
260 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, buf, in analogix_dp_link_start()
327 static void analogix_dp_reduce_link_rate(struct analogix_dp_device *dp) in analogix_dp_reduce_link_rate() argument
329 analogix_dp_training_pattern_dis(dp); in analogix_dp_reduce_link_rate()
330 analogix_dp_set_enhanced_mode(dp); in analogix_dp_reduce_link_rate()
332 dp->link_train.lt_state = FAILED; in analogix_dp_reduce_link_rate()
335 static void analogix_dp_get_adjust_training_lane(struct analogix_dp_device *dp, in analogix_dp_get_adjust_training_lane() argument
341 lane_count = dp->link_train.lane_count; in analogix_dp_get_adjust_training_lane()
355 dp->link_train.training_lane[lane] = training_lane; in analogix_dp_get_adjust_training_lane()
359 static bool analogix_dp_tps3_supported(struct analogix_dp_device *dp) in analogix_dp_tps3_supported() argument
365 dp->video_info.max_link_rate == DP_LINK_BW_5_4; in analogix_dp_tps3_supported()
366 drm_dp_dpcd_readb(&dp->aux, DP_MAX_LANE_COUNT, &dpcd); in analogix_dp_tps3_supported()
372 static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp) in analogix_dp_process_clock_recovery() argument
379 drm_dp_link_train_clock_recovery_delay(dp->dpcd); in analogix_dp_process_clock_recovery()
381 lane_count = dp->link_train.lane_count; in analogix_dp_process_clock_recovery()
383 retval = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, 2); in analogix_dp_process_clock_recovery()
388 if (analogix_dp_tps3_supported(dp)) in analogix_dp_process_clock_recovery()
392 analogix_dp_set_training_pattern(dp, training_pattern); in analogix_dp_process_clock_recovery()
394 retval = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET, in analogix_dp_process_clock_recovery()
401 dev_info(dp->dev, "Link Training Clock Recovery success\n"); in analogix_dp_process_clock_recovery()
402 dp->link_train.lt_state = EQUALIZER_TRAINING; in analogix_dp_process_clock_recovery()
406 retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1, in analogix_dp_process_clock_recovery()
413 dp, lane); in analogix_dp_process_clock_recovery()
423 dp->link_train.cr_loop[lane]++; in analogix_dp_process_clock_recovery()
432 if (dp->link_train.cr_loop[lane] == MAX_CR_LOOP || in analogix_dp_process_clock_recovery()
434 dev_err(dp->dev, "CR Max reached (%d,%d,%d)\n", in analogix_dp_process_clock_recovery()
435 dp->link_train.cr_loop[lane], in analogix_dp_process_clock_recovery()
437 analogix_dp_reduce_link_rate(dp); in analogix_dp_process_clock_recovery()
443 analogix_dp_get_adjust_training_lane(dp, adjust_request); in analogix_dp_process_clock_recovery()
444 analogix_dp_set_lane_link_training(dp); in analogix_dp_process_clock_recovery()
446 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, in analogix_dp_process_clock_recovery()
447 dp->link_train.training_lane, lane_count); in analogix_dp_process_clock_recovery()
454 static int analogix_dp_process_equalizer_training(struct analogix_dp_device *dp) in analogix_dp_process_equalizer_training() argument
460 drm_dp_link_train_channel_eq_delay(dp->dpcd); in analogix_dp_process_equalizer_training()
462 lane_count = dp->link_train.lane_count; in analogix_dp_process_equalizer_training()
464 retval = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, 2); in analogix_dp_process_equalizer_training()
469 analogix_dp_reduce_link_rate(dp); in analogix_dp_process_equalizer_training()
473 retval = drm_dp_dpcd_readb(&dp->aux, DP_LANE_ALIGN_STATUS_UPDATED, &link_align); in analogix_dp_process_equalizer_training()
479 retval = analogix_dp_training_pattern_dis(dp); in analogix_dp_process_equalizer_training()
485 analogix_dp_get_link_bandwidth(dp, ®); in analogix_dp_process_equalizer_training()
486 dp->link_train.link_rate = reg; in analogix_dp_process_equalizer_training()
487 analogix_dp_get_lane_count(dp, ®); in analogix_dp_process_equalizer_training()
488 dp->link_train.lane_count = reg; in analogix_dp_process_equalizer_training()
491 dp->link_train.link_rate, dp->link_train.lane_count); in analogix_dp_process_equalizer_training()
493 dp->link_train.lt_state = FINISHED; in analogix_dp_process_equalizer_training()
499 dp->link_train.eq_loop++; in analogix_dp_process_equalizer_training()
501 if (dp->link_train.eq_loop > MAX_EQ_LOOP) { in analogix_dp_process_equalizer_training()
502 dev_dbg(dp->dev, "EQ Max loop\n"); in analogix_dp_process_equalizer_training()
503 analogix_dp_reduce_link_rate(dp); in analogix_dp_process_equalizer_training()
507 retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1, adjust_request, 2); in analogix_dp_process_equalizer_training()
511 analogix_dp_get_adjust_training_lane(dp, adjust_request); in analogix_dp_process_equalizer_training()
512 analogix_dp_set_lane_link_training(dp); in analogix_dp_process_equalizer_training()
514 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, in analogix_dp_process_equalizer_training()
515 dp->link_train.training_lane, lane_count); in analogix_dp_process_equalizer_training()
522 static bool analogix_dp_bandwidth_ok(struct analogix_dp_device *dp, in analogix_dp_bandwidth_ok() argument
564 static int analogix_dp_select_link_rate_from_table(struct analogix_dp_device *dp) in analogix_dp_select_link_rate_from_table() argument
568 u32 max_link_rate = drm_dp_bw_code_to_link_rate(dp->video_info.max_link_rate); in analogix_dp_select_link_rate_from_table()
570 for (i = 0; i < dp->nr_link_rate_table; i++) { in analogix_dp_select_link_rate_from_table()
571 bw_code = drm_dp_link_rate_to_bw_code(dp->link_rate_table[i]); in analogix_dp_select_link_rate_from_table()
573 if (!analogix_dp_bandwidth_ok(dp, &dp->video_info.mode, in analogix_dp_select_link_rate_from_table()
574 analogix_dp_get_output_bpp(dp->output_fmt), in analogix_dp_select_link_rate_from_table()
575 dp->link_rate_table[i], dp->link_train.lane_count)) in analogix_dp_select_link_rate_from_table()
578 if (dp->link_rate_table[i] <= max_link_rate && in analogix_dp_select_link_rate_from_table()
579 analogix_dp_link_config_validate(bw_code, dp->link_train.lane_count)) { in analogix_dp_select_link_rate_from_table()
580 dp->link_rate_select = i; in analogix_dp_select_link_rate_from_table()
588 static int analogix_dp_select_rx_bandwidth(struct analogix_dp_device *dp) in analogix_dp_select_rx_bandwidth() argument
590 if (dp->nr_link_rate_table) in analogix_dp_select_rx_bandwidth()
595 dp->link_train.link_rate = analogix_dp_select_link_rate_from_table(dp); in analogix_dp_select_rx_bandwidth()
601 dp->link_train.link_rate = min_t(u32, dp->link_train.link_rate, in analogix_dp_select_rx_bandwidth()
602 dp->video_info.max_link_rate); in analogix_dp_select_rx_bandwidth()
603 if (!dp->link_train.link_rate) in analogix_dp_select_rx_bandwidth()
609 static int analogix_dp_init_link_rate_table(struct analogix_dp_device *dp) in analogix_dp_init_link_rate_table() argument
615 ret = drm_dp_dpcd_read(&dp->aux, DP_SUPPORTED_LINK_RATES, link_rate_table, in analogix_dp_init_link_rate_table()
627 dp->link_rate_table[i] = (val * 20); in analogix_dp_init_link_rate_table()
629 dp->nr_link_rate_table = i; in analogix_dp_init_link_rate_table()
634 static int analogix_dp_get_max_rx_bandwidth(struct analogix_dp_device *dp, in analogix_dp_get_max_rx_bandwidth() argument
640 ret = drm_dp_dpcd_readb(&dp->aux, DP_EDP_DPCD_REV, &data); in analogix_dp_get_max_rx_bandwidth()
645 if (!dp->nr_link_rate_table) { in analogix_dp_get_max_rx_bandwidth()
646 dev_info(dp->dev, "eDP version: 0x%02x supports link rate table\n", in analogix_dp_get_max_rx_bandwidth()
649 if (analogix_dp_init_link_rate_table(dp)) in analogix_dp_get_max_rx_bandwidth()
650 dev_err(dp->dev, "failed to read link rate table: %d\n", in analogix_dp_get_max_rx_bandwidth()
653 max_link_rate = dp->link_rate_table[dp->nr_link_rate_table - 1]; in analogix_dp_get_max_rx_bandwidth()
662 ret = drm_dp_dpcd_readb(&dp->aux, DP_MAX_LINK_RATE, &data); in analogix_dp_get_max_rx_bandwidth()
672 static int analogix_dp_get_max_rx_lane_count(struct analogix_dp_device *dp, in analogix_dp_get_max_rx_lane_count() argument
682 ret = drm_dp_dpcd_readb(&dp->aux, DP_MAX_LANE_COUNT, &data); in analogix_dp_get_max_rx_lane_count()
691 static int analogix_dp_init_training(struct analogix_dp_device *dp, in analogix_dp_init_training() argument
701 analogix_dp_reset_macro(dp); in analogix_dp_init_training()
704 dp->link_train.lane_count = min_t(u32, dp->link_train.lane_count, max_lane); in analogix_dp_init_training()
707 if (analogix_dp_select_rx_bandwidth(dp)) { in analogix_dp_init_training()
708 dev_err(dp->dev, "Select rx bandwidth failed\n"); in analogix_dp_init_training()
712 drm_dp_dpcd_readb(&dp->aux, DP_MAX_DOWNSPREAD, &dpcd); in analogix_dp_init_training()
713 dp->link_train.ssc = !!(dpcd & DP_MAX_DOWNSPREAD_0_5); in analogix_dp_init_training()
716 analogix_dp_set_analog_power_down(dp, POWER_ALL, 0); in analogix_dp_init_training()
721 static int analogix_dp_sw_link_training(struct analogix_dp_device *dp) in analogix_dp_sw_link_training() argument
725 dp->link_train.lt_state = START; in analogix_dp_sw_link_training()
729 switch (dp->link_train.lt_state) { in analogix_dp_sw_link_training()
731 retval = analogix_dp_link_start(dp); in analogix_dp_sw_link_training()
733 dev_err(dp->dev, "LT link start failed!\n"); in analogix_dp_sw_link_training()
736 retval = analogix_dp_process_clock_recovery(dp); in analogix_dp_sw_link_training()
738 dev_err(dp->dev, "LT CR failed!\n"); in analogix_dp_sw_link_training()
741 retval = analogix_dp_process_equalizer_training(dp); in analogix_dp_sw_link_training()
743 dev_err(dp->dev, "LT EQ failed!\n"); in analogix_dp_sw_link_training()
756 static int analogix_dp_set_link_train(struct analogix_dp_device *dp, in analogix_dp_set_link_train() argument
762 ret = analogix_dp_init_training(dp, count, bwtype); in analogix_dp_set_link_train()
764 dev_err(dp->dev, "failed to init training\n"); in analogix_dp_set_link_train()
768 ret = analogix_dp_sw_link_training(dp); in analogix_dp_set_link_train()
776 static int analogix_dp_config_video(struct analogix_dp_device *dp) in analogix_dp_config_video() argument
781 analogix_dp_config_video_slave_mode(dp); in analogix_dp_config_video()
783 analogix_dp_set_video_color_format(dp); in analogix_dp_config_video()
785 if (analogix_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) { in analogix_dp_config_video()
786 dev_err(dp->dev, "PLL is not locked yet.\n"); in analogix_dp_config_video()
792 if (analogix_dp_is_slave_video_stream_clock_on(dp) == 0) in analogix_dp_config_video()
795 dev_err(dp->dev, "Timeout of video streamclk ok\n"); in analogix_dp_config_video()
803 analogix_dp_set_video_cr_mn(dp, CALCULATED_M, 0, 0); in analogix_dp_config_video()
806 analogix_dp_set_video_timing_mode(dp, VIDEO_TIMING_FROM_REGISTER); in analogix_dp_config_video()
809 analogix_dp_enable_video_mute(dp, 0); in analogix_dp_config_video()
812 analogix_dp_enable_video_master(dp, 0); in analogix_dp_config_video()
815 analogix_dp_start_video(dp); in analogix_dp_config_video()
821 if (analogix_dp_is_video_stream_on(dp) == 0) { in analogix_dp_config_video()
829 dev_err(dp->dev, "Timeout of video streamclk ok\n"); in analogix_dp_config_video()
839 static int analogix_dp_enable_scramble(struct analogix_dp_device *dp, in analogix_dp_enable_scramble() argument
846 analogix_dp_enable_scrambling(dp); in analogix_dp_enable_scramble()
848 ret = drm_dp_dpcd_readb(&dp->aux, DP_TRAINING_PATTERN_SET, in analogix_dp_enable_scramble()
852 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET, in analogix_dp_enable_scramble()
855 analogix_dp_disable_scrambling(dp); in analogix_dp_enable_scramble()
857 ret = drm_dp_dpcd_readb(&dp->aux, DP_TRAINING_PATTERN_SET, in analogix_dp_enable_scramble()
861 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET, in analogix_dp_enable_scramble()
867 static void analogix_dp_init_dp(struct analogix_dp_device *dp) in analogix_dp_init_dp() argument
869 analogix_dp_reset(dp); in analogix_dp_init_dp()
871 analogix_dp_swreset(dp); in analogix_dp_init_dp()
873 analogix_dp_init_analog_param(dp); in analogix_dp_init_dp()
874 analogix_dp_init_interrupt(dp); in analogix_dp_init_dp()
877 analogix_dp_enable_sw_function(dp); in analogix_dp_init_dp()
879 analogix_dp_config_interrupt(dp); in analogix_dp_init_dp()
880 analogix_dp_init_analog_func(dp); in analogix_dp_init_dp()
882 analogix_dp_init_hpd(dp); in analogix_dp_init_dp()
883 analogix_dp_init_aux(dp); in analogix_dp_init_dp()
889 struct analogix_dp_device *dp = dev_get_priv(conn->dev); in analogix_dp_connector_init() local
893 dp->dp_mode = true; in analogix_dp_connector_init()
896 dp->dp_mode = true; in analogix_dp_connector_init()
898 dp->dp_mode = false; in analogix_dp_connector_init()
900 conn_state->output_if |= dp->id ? VOP_OUTPUT_IF_eDP1 : VOP_OUTPUT_IF_eDP0; in analogix_dp_connector_init()
905 reset_assert_bulk(&dp->resets); in analogix_dp_connector_init()
907 reset_deassert_bulk(&dp->resets); in analogix_dp_connector_init()
909 conn_state->disp_info = rockchip_get_disp_info(conn_state->type, dp->id); in analogix_dp_connector_init()
910 if (dp->plat_data.support_dp_mode && dp->dp_mode) in analogix_dp_connector_init()
912 generic_phy_set_mode_ext(&dp->phy, PHY_MODE_DP, submode); in analogix_dp_connector_init()
913 generic_phy_power_on(&dp->phy); in analogix_dp_connector_init()
914 analogix_dp_init_dp(dp); in analogix_dp_connector_init()
923 struct analogix_dp_device *dp = dev_get_priv(conn->dev); in analogix_dp_connector_get_edid() local
926 conn_state->edid = drm_do_get_edid(&dp->aux.ddc); in analogix_dp_connector_get_edid()
933 static int analogix_dp_link_power_up(struct analogix_dp_device *dp) in analogix_dp_link_power_up() argument
938 if (dp->dpcd[DP_DPCD_REV] < 0x11) in analogix_dp_link_power_up()
941 ret = drm_dp_dpcd_readb(&dp->aux, DP_SET_POWER, &value); in analogix_dp_link_power_up()
948 ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, value); in analogix_dp_link_power_up()
957 static int analogix_dp_link_power_down(struct analogix_dp_device *dp) in analogix_dp_link_power_down() argument
962 if (dp->dpcd[DP_DPCD_REV] < 0x11) in analogix_dp_link_power_down()
965 ret = drm_dp_dpcd_readb(&dp->aux, DP_SET_POWER, &value); in analogix_dp_link_power_down()
972 ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, value); in analogix_dp_link_power_down()
979 static u32 analogix_dp_get_output_format(struct analogix_dp_device *dp, u32 bus_format) in analogix_dp_get_output_format() argument
996 static u32 analogix_dp_get_output_format_by_edid(struct analogix_dp_device *dp, in analogix_dp_get_output_format_by_edid() argument
1004 if (fmt->bpc > edid_data->display_info.bpc || fmt->bpc > dp->plat_data.max_bpc) in analogix_dp_get_output_format_by_edid()
1010 if (!analogix_dp_bandwidth_ok(dp, edid_data->preferred_mode, in analogix_dp_get_output_format_by_edid()
1012 drm_dp_bw_code_to_link_rate(dp->link_train.link_rate), in analogix_dp_get_output_format_by_edid()
1013 dp->link_train.lane_count)) in analogix_dp_get_output_format_by_edid()
1032 struct analogix_dp_device *dp = dev_get_priv(conn->dev); in analogix_dp_connector_enable() local
1033 struct video_info *video = &dp->video_info; in analogix_dp_connector_enable()
1047 regmap_write(dp->grf, pdata->lcdsel_grf_reg, val); in analogix_dp_connector_enable()
1051 regmap_write(dp->grf, dp->id ? RK3588_GRF_VO1_CON1 : RK3588_GRF_VO1_CON0, in analogix_dp_connector_enable()
1054 if (!dp->output_fmt) { in analogix_dp_connector_enable()
1055 fmt_id = analogix_dp_get_output_format(dp, conn_state->bus_format); in analogix_dp_connector_enable()
1056 dp->output_fmt = &possible_output_fmts[fmt_id]; in analogix_dp_connector_enable()
1059 switch (dp->output_fmt->bpc) { in analogix_dp_connector_enable()
1074 if (dp->output_fmt->color_format == DRM_COLOR_FORMAT_YCRCB444) { in analogix_dp_connector_enable()
1077 } else if (dp->output_fmt->color_format == DRM_COLOR_FORMAT_YCRCB422) { in analogix_dp_connector_enable()
1085 ret = drm_dp_dpcd_read(&dp->aux, DP_DPCD_REV, dp->dpcd, DP_RECEIVER_CAP_SIZE); in analogix_dp_connector_enable()
1087 dev_err(dp->dev, "failed to read dpcd caps: %d\n", ret); in analogix_dp_connector_enable()
1091 ret = analogix_dp_link_power_up(dp); in analogix_dp_connector_enable()
1093 dev_err(dp->dev, "failed to power up link: %d\n", ret); in analogix_dp_connector_enable()
1097 ret = analogix_dp_set_link_train(dp, dp->video_info.max_lane_count, in analogix_dp_connector_enable()
1098 dp->video_info.max_link_rate); in analogix_dp_connector_enable()
1100 dev_err(dp->dev, "unable to do link train\n"); in analogix_dp_connector_enable()
1104 ret = analogix_dp_enable_scramble(dp, 1); in analogix_dp_connector_enable()
1106 dev_err(dp->dev, "can not enable scramble\n"); in analogix_dp_connector_enable()
1110 analogix_dp_init_video(dp); in analogix_dp_connector_enable()
1115 analogix_dp_set_video_format(dp, &mode); in analogix_dp_connector_enable()
1117 if (dp->video_bist_enable) in analogix_dp_connector_enable()
1118 analogix_dp_video_bist_enable(dp); in analogix_dp_connector_enable()
1120 ret = analogix_dp_config_video(dp); in analogix_dp_connector_enable()
1122 dev_err(dp->dev, "unable to config video\n"); in analogix_dp_connector_enable()
1134 struct analogix_dp_device *dp = dev_get_priv(conn->dev); in analogix_dp_connector_disable() local
1136 if (!analogix_dp_get_plug_in_status(dp)) in analogix_dp_connector_disable()
1137 analogix_dp_link_power_down(dp); in analogix_dp_connector_disable()
1140 regmap_write(dp->grf, dp->id ? RK3588_GRF_VO1_CON1 : RK3588_GRF_VO1_CON0, in analogix_dp_connector_disable()
1149 struct analogix_dp_device *dp = dev_get_priv(conn->dev); in analogix_dp_connector_detect() local
1152 if (analogix_dp_detect(dp)) { in analogix_dp_connector_detect()
1154 ret = analogix_dp_get_max_rx_bandwidth(dp, &dp->link_train.link_rate); in analogix_dp_connector_detect()
1156 dev_err(dp->dev, "failed to read max link rate\n"); in analogix_dp_connector_detect()
1160 ret = analogix_dp_get_max_rx_lane_count(dp, &dp->link_train.lane_count); in analogix_dp_connector_detect()
1162 dev_err(dp->dev, "failed to read max lane count\n"); in analogix_dp_connector_detect()
1181 dev_err(dp->dev, "front porch or back porch can not be 0\n"); in analogix_dp_connector_mode_valid()
1188 static int analogix_dp_mode_valid(struct analogix_dp_device *dp, struct hdmi_edid_data *edid_data) in analogix_dp_mode_valid() argument
1202 max_link_rate = min_t(u32, dp->video_info.max_link_rate, dp->link_train.link_rate); in analogix_dp_mode_valid()
1203 max_lane_count = min_t(u32, dp->video_info.max_lane_count, dp->link_train.lane_count); in analogix_dp_mode_valid()
1205 if (!analogix_dp_bandwidth_ok(dp, &edid_data->mode_buf[i], min_bpp, in analogix_dp_mode_valid()
1220 struct analogix_dp_device *dp = dev_get_priv(conn->dev); in analogix_dp_connector_get_timing() local
1237 conn_state->edid = drm_do_get_edid(&dp->aux.ddc); in analogix_dp_connector_get_timing()
1263 analogix_dp_mode_valid(dp, &edid_data); in analogix_dp_connector_get_timing()
1277 fmt_id = analogix_dp_get_output_format_by_edid(dp, &edid_data); in analogix_dp_connector_get_timing()
1278 dp->output_fmt = &possible_output_fmts[fmt_id]; in analogix_dp_connector_get_timing()
1280 switch (dp->output_fmt->color_format) { in analogix_dp_connector_get_timing()
1291 conn_state->bus_format = dp->output_fmt->bus_format; in analogix_dp_connector_get_timing()
1292 conn_state->bpc = dp->output_fmt->bpc; in analogix_dp_connector_get_timing()
1294 if (dp->output_fmt->color_format == DRM_COLOR_FORMAT_RGB444) in analogix_dp_connector_get_timing()
1315 static u32 analogix_dp_parse_link_frequencies(struct analogix_dp_device *dp) in analogix_dp_parse_link_frequencies() argument
1317 struct udevice *dev = dp->dev; in analogix_dp_parse_link_frequencies()
1346 static int analogix_dp_parse_dt(struct analogix_dp_device *dp) in analogix_dp_parse_dt() argument
1348 struct udevice *dev = dp->dev; in analogix_dp_parse_dt()
1354 dp->force_hpd = dev_read_bool(dev, "force-hpd"); in analogix_dp_parse_dt()
1355 dp->video_bist_enable = dev_read_bool(dev, "analogix,video-bist-enable"); in analogix_dp_parse_dt()
1356 dp->video_info.force_stream_valid = in analogix_dp_parse_dt()
1359 max_link_rate = analogix_dp_parse_link_frequencies(dp); in analogix_dp_parse_dt()
1360 if (max_link_rate && max_link_rate < drm_dp_bw_code_to_link_rate(dp->video_info.max_link_rate)) in analogix_dp_parse_dt()
1361 dp->video_info.max_link_rate = drm_dp_link_rate_to_bw_code(max_link_rate); in analogix_dp_parse_dt()
1370 ret = dev_read_u32_array(dev, "data-lanes", dp->lane_map, in analogix_dp_parse_dt()
1375 dp->video_info.max_lane_count = num_lanes; in analogix_dp_parse_dt()
1377 dp->lane_map[0] = 0; in analogix_dp_parse_dt()
1378 dp->lane_map[1] = 1; in analogix_dp_parse_dt()
1379 dp->lane_map[2] = 2; in analogix_dp_parse_dt()
1380 dp->lane_map[3] = 3; in analogix_dp_parse_dt()
1386 static int analogix_dp_ddc_init(struct analogix_dp_device *dp) in analogix_dp_ddc_init() argument
1388 dp->aux.name = "analogix-dp"; in analogix_dp_ddc_init()
1389 dp->aux.dev = dp->dev; in analogix_dp_ddc_init()
1390 dp->aux.transfer = analogix_dp_aux_transfer; in analogix_dp_ddc_init()
1391 dp->aux.ddc.ddc_xfer = drm_dp_i2c_xfer; in analogix_dp_ddc_init()
1398 struct analogix_dp_device *dp = dev_get_priv(dev); in analogix_dp_probe() local
1404 dp->reg_base = dev_read_addr_ptr(dev); in analogix_dp_probe()
1406 dp->id = of_alias_get_id(ofnode_to_np(dev->node), "edp"); in analogix_dp_probe()
1407 if (dp->id < 0) in analogix_dp_probe()
1408 dp->id = 0; in analogix_dp_probe()
1413 dp->grf = syscon_get_regmap(syscon); in analogix_dp_probe()
1414 if (!dp->grf) in analogix_dp_probe()
1419 ret = power_domain_get(dev, &dp->pwrdom); in analogix_dp_probe()
1424 ret = power_domain_on(&dp->pwrdom); in analogix_dp_probe()
1429 ret = clk_get_bulk(dev, &dp->clks); in analogix_dp_probe()
1434 ret = clk_enable_bulk(&dp->clks); in analogix_dp_probe()
1441 ret = reset_get_bulk(dev, &dp->resets); in analogix_dp_probe()
1447 ret = gpio_request_by_name(dev, "hpd-gpios", 0, &dp->hpd_gpio, in analogix_dp_probe()
1454 generic_phy_get_by_name(dev, "dp", &dp->phy); in analogix_dp_probe()
1456 dp->plat_data.dev_type = ROCKCHIP_DP; in analogix_dp_probe()
1457 dp->plat_data.subdev_type = pdata->chip_type; in analogix_dp_probe()
1458 dp->plat_data.ssc = pdata->ssc; in analogix_dp_probe()
1459 dp->plat_data.support_dp_mode = pdata->support_dp_mode; in analogix_dp_probe()
1460 dp->plat_data.max_bpc = pdata->max_bpc ? pdata->max_bpc : 8; in analogix_dp_probe()
1462 dp->video_info.max_link_rate = pdata->max_link_rate; in analogix_dp_probe()
1463 dp->video_info.max_lane_count = pdata->max_lane_count; in analogix_dp_probe()
1465 dp->dev = dev; in analogix_dp_probe()
1467 ret = analogix_dp_parse_dt(dp); in analogix_dp_probe()
1473 analogix_dp_ddc_init(dp); in analogix_dp_probe()
1475 rockchip_connector_bind(&dp->connector, dev, dp->id, &analogix_dp_connector_funcs, in analogix_dp_probe()