Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/bridge: analogix_dp: don't adjust further when clock recovery succeeded

Take a early return from the clock recovery training when the sink reports
CR_DONE for all lanes. There is no point in trying to adjust the link
parameters further.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Robert Foss <rfoss@kernel.org>
Signed-off-by: Robert Foss <rfoss@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240318203925.2837689-3-l.stach@pengutronix.de

authored by

Lucas Stach and committed by
Robert Foss
35e7a72a 3747c981

+24 -27
+24 -27
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
··· 410 410 if (retval < 0) 411 411 return retval; 412 412 413 - retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1, 414 - adjust_request, 2); 415 - if (retval < 0) 416 - return retval; 417 - 418 413 if (analogix_dp_clock_recovery_ok(link_status, lane_count) == 0) { 419 414 /* set training pattern 2 for EQ */ 420 415 analogix_dp_set_training_pattern(dp, TRAINING_PTN2); ··· 422 427 423 428 dev_dbg(dp->dev, "Link Training Clock Recovery success\n"); 424 429 dp->link_train.lt_state = EQUALIZER_TRAINING; 425 - } else { 426 - for (lane = 0; lane < lane_count; lane++) { 427 - training_lane = analogix_dp_get_lane_link_training( 428 - dp, lane); 429 - voltage_swing = analogix_dp_get_adjust_request_voltage( 430 - adjust_request, lane); 431 - pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis( 432 - adjust_request, lane); 433 430 434 - if (DPCD_VOLTAGE_SWING_GET(training_lane) == 435 - voltage_swing && 436 - DPCD_PRE_EMPHASIS_GET(training_lane) == 437 - pre_emphasis) 438 - dp->link_train.cr_loop[lane]++; 431 + return 0; 432 + } 439 433 440 - if (dp->link_train.cr_loop[lane] == MAX_CR_LOOP || 441 - voltage_swing == VOLTAGE_LEVEL_3 || 442 - pre_emphasis == PRE_EMPHASIS_LEVEL_3) { 443 - dev_err(dp->dev, "CR Max reached (%d,%d,%d)\n", 444 - dp->link_train.cr_loop[lane], 445 - voltage_swing, pre_emphasis); 446 - analogix_dp_reduce_link_rate(dp); 447 - return -EIO; 448 - } 434 + retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1, 435 + adjust_request, 2); 436 + if (retval < 0) 437 + return retval; 438 + 439 + for (lane = 0; lane < lane_count; lane++) { 440 + training_lane = analogix_dp_get_lane_link_training(dp, lane); 441 + voltage_swing = analogix_dp_get_adjust_request_voltage(adjust_request, lane); 442 + pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis(adjust_request, lane); 443 + 444 + if (DPCD_VOLTAGE_SWING_GET(training_lane) == voltage_swing && 445 + DPCD_PRE_EMPHASIS_GET(training_lane) == pre_emphasis) 446 + dp->link_train.cr_loop[lane]++; 447 + 448 + if (dp->link_train.cr_loop[lane] == MAX_CR_LOOP || 449 + voltage_swing == VOLTAGE_LEVEL_3 || 450 + pre_emphasis == PRE_EMPHASIS_LEVEL_3) { 451 + dev_err(dp->dev, "CR Max reached (%d,%d,%d)\n", 452 + dp->link_train.cr_loop[lane], 453 + voltage_swing, pre_emphasis); 454 + analogix_dp_reduce_link_rate(dp); 455 + return -EIO; 449 456 } 450 457 } 451 458