@@ -384,13 +384,55 @@ static void dcn30_hpo_hdmi_stream_enc_setup_stream_attribute(
384384 REG_UPDATE (HDMI_TB_ENC_GC_CONTROL , HDMI_GC_AVMUTE , 0 );
385385}
386386
387+ struct frl_audio_clock_info {
388+ uint32_t frl_lane_rate ;
389+ /* N - 32KHz audio */
390+ uint32_t n_32khz ;
391+ /* CTS - 32KHz audio*/
392+ uint32_t cts_32khz ;
393+ uint32_t n_44khz ;
394+ uint32_t cts_44khz ;
395+ uint32_t n_48khz ;
396+ uint32_t cts_48khz ;
397+ };
398+
399+ /* Values set by the Windows driver seem to depend only on FRL rate*/
400+ static const struct frl_audio_clock_info frl_audio_clock_info_table [5 ] = {
401+ {3 , 4224 , 171875 , 5292 , 156250 , 5760 , 156250 },
402+ {6 , 4032 , 328125 , 5292 , 312500 , 6048 , 328125 },
403+ {8 , 4032 , 437500 , 3969 , 312500 , 6048 , 437500 },
404+ {10 , 3456 , 468750 , 3969 , 390625 , 5184 , 468750 },
405+ {12 , 3072 , 500000 , 3969 , 468750 , 4752 , 515625 },
406+ };
407+
408+ static void get_frl_audio_clock_info (
409+ struct frl_audio_clock_info * audio_clock_info ,
410+ uint8_t frl_rate )
411+ {
412+ uint32_t index ;
413+ uint32_t frl_lane_rates [] = { 3 , 6 , 8 , 10 , 12 };
414+ uint32_t frl_lane_rate ;
415+
416+ ASSERT (frl_rate >= 0 && frl_rate <= 6 );
417+
418+ frl_lane_rate = frl_lane_rates [frl_rate - 1 ];
419+
420+ /* search for FRL rate in table */
421+ for (index = 0 ; index < sizeof (frl_lane_rates ) / sizeof (uint32_t ); index ++ )
422+ if (frl_audio_clock_info_table [index ].frl_lane_rate == frl_lane_rate )
423+ * audio_clock_info = frl_audio_clock_info_table [index ];
424+
425+ /* Should never happen */
426+ * audio_clock_info = frl_audio_clock_info_table [0 ];
427+ }
428+
387429static void setup_hdmi_audio (struct hpo_hdmi_stream_encoder * enc ,
388- const struct audio_crtc_info * crtc_info )
430+ const struct audio_crtc_info * crtc_info , uint8_t frl_rate )
389431{
390432 struct dcn30_hpo_hdmi_stream_encoder * enc3 =
391433 DCN3_0_HPO_HDMI_STREAM_ENC_FROM_HPO_STREAM_ENC (enc );
392434
393- struct audio_clock_info audio_clock_info = { 0 };
435+ struct frl_audio_clock_info audio_clock_info = { 0 };
394436
395437 /* Setup audio in AFMT - program AFMT block associated with HPO */
396438 ASSERT (enc -> afmt );
@@ -400,14 +442,7 @@ static void setup_hdmi_audio(struct hpo_hdmi_stream_encoder *enc,
400442 HDMI_ACR_SOURCE , 0 , HDMI_ACR_AUDIO_PRIORITY , 0 );
401443
402444 /* Program audio clock sample/regeneration parameters */
403- get_audio_clock_info (crtc_info -> color_depth ,
404- crtc_info -> requested_pixel_clock_100Hz ,
405- crtc_info -> calculated_pixel_clock_100Hz ,
406- & audio_clock_info );
407- DC_LOG_HW_AUDIO ("\n%s:Input::requested_pixel_clock_100Hz = %d"
408- "calculated_pixel_clock_100Hz = %d \n" ,
409- __func__ , crtc_info -> requested_pixel_clock_100Hz ,
410- crtc_info -> calculated_pixel_clock_100Hz );
445+ get_frl_audio_clock_info (& audio_clock_info , frl_rate );
411446
412447 REG_UPDATE (HDMI_TB_ENC_ACR_32_0 , HDMI_ACR_CTS_32 ,
413448 audio_clock_info .cts_32khz );
@@ -427,9 +462,10 @@ static void setup_hdmi_audio(struct hpo_hdmi_stream_encoder *enc,
427462
428463static void dcn30_hpo_hdmi_stream_enc_hdmi_audio_setup (
429464 struct hpo_hdmi_stream_encoder * enc , unsigned int az_inst ,
430- struct audio_info * info , struct audio_crtc_info * audio_crtc_info )
465+ struct audio_info * info , struct audio_crtc_info * audio_crtc_info ,
466+ uint8_t frl_rate )
431467{
432- setup_hdmi_audio (enc , audio_crtc_info );
468+ setup_hdmi_audio (enc , audio_crtc_info , frl_rate );
433469 ASSERT (enc -> afmt );
434470 enc -> afmt -> funcs -> se_audio_setup (enc -> afmt , az_inst , info );
435471}
0 commit comments