@@ -61,8 +61,9 @@ bool dc_link_perform_frl_training(struct dc_link *link,
6161 uint8_t frl_rate = link -> cur_link_settings .frl_rate ;
6262 uint8_t sink_version ;
6363 uint8_t update ;
64- uint8_t status ;
64+ uint8_t status = 0 ;
6565 uint16_t ltp_req ;
66+ uint8_t patterns [FRL_MAX_LANES ] = {0 , 0 , 0 , 0 };
6667 uint8_t write_buffer [2 ];
6768 int poll ;
6869 int lane ;
@@ -202,21 +203,11 @@ bool dc_link_perform_frl_training(struct dc_link *link,
202203 }
203204 }
204205
205- /* Program requested training patterns */
206- pr_err ("FRL DEBUG: programming training patterns\n" );
207- enc -> funcs -> set_training_patterns (enc ,
208- ((ltp_req >> 0 ) & 0xF ) - 1 ,
209- ((ltp_req >> 4 ) & 0xF ) - 1 ,
210- ((ltp_req >> 8 ) & 0xF ) - 1 ,
211- ((ltp_req >> 12 ) & 0xF ) - 1 );
212-
213- /* Detect LOWER_RATE / NEXT_FFE */
206+ /* Check for special LTP requests before programming patterns */
214207 for (lane = 0 ; lane < lane_count ; lane ++ ) {
215208 uint8_t ltp = (ltp_req >> (lane * 4 )) & 0xF ;
216209
217210 if (ltp == HDMI_LTP_LOWER_RATE ) {
218- pr_err ("FRL DEBUG: lane %d requested LOWER_RATE\n" ,
219- lane );
220211 DC_LOG_ERROR (
221212 "FRL: sink requested lower rate (unsupported)\n" );
222213 goto fail ;
@@ -228,6 +219,19 @@ bool dc_link_perform_frl_training(struct dc_link *link,
228219 }
229220 }
230221
222+ /* Update per-lane patterns; preserve current pattern for passing lanes */
223+ for (lane = 0 ; lane < lane_count ; lane ++ ) {
224+ uint8_t ltp = (ltp_req >> (lane * 4 )) & 0xF ;
225+
226+ if (ltp != HDMI_LTP_PASS && ltp != HDMI_LTP_NEXT_FFE )
227+ patterns [lane ] = ltp - 1 ;
228+ }
229+
230+ pr_err ("FRL DEBUG: programming training patterns\n" );
231+ enc -> funcs -> set_training_patterns (enc ,
232+ patterns [0 ], patterns [1 ],
233+ patterns [2 ], patterns [3 ]);
234+
231235 msleep (FRL_POLL_DELAY_MS );
232236 }
233237
0 commit comments