static void write_indirect_azalia_reg(struct audio *audio, uint32_t reg_index, uint32_t reg_data) { struct dce_audio *aud = DCE_AUD(audio); /* AZALIA_F0_CODEC_ENDPOINT_INDEX endpoint index */ REG_SET(AZALIA_F0_CODEC_ENDPOINT_INDEX, 0, AZALIA_ENDPOINT_REG_INDEX, reg_index); /* AZALIA_F0_CODEC_ENDPOINT_DATA endpoint data */ REG_SET(AZALIA_F0_CODEC_ENDPOINT_DATA, 0, AZALIA_ENDPOINT_REG_DATA, reg_data); DC_LOG_HW_AUDIO("AUDIO:write_indirect_azalia_reg: index: %u data: %u\n", reg_index, reg_data); }
static uint32_t read_indirect_azalia_reg(struct audio *audio, uint32_t reg_index) { struct dce_audio *aud = DCE_AUD(audio); uint32_t value = 0; /* AZALIA_F0_CODEC_ENDPOINT_INDEX endpoint index */ REG_SET(AZALIA_F0_CODEC_ENDPOINT_INDEX, 0, AZALIA_ENDPOINT_REG_INDEX, reg_index); /* AZALIA_F0_CODEC_ENDPOINT_DATA endpoint data */ value = REG_READ(AZALIA_F0_CODEC_ENDPOINT_DATA); DC_LOG_HW_AUDIO("AUDIO:read_indirect_azalia_reg: index: %u data: %u\n", reg_index, value); return value; }
void dce_aud_az_enable(struct audio *audio) { uint32_t value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL); DC_LOGGER_INIT(); set_reg_field_value(value, 1, AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, CLOCK_GATING_DISABLE); set_reg_field_value(value, 1, AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, AUDIO_ENABLED); AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value); set_reg_field_value(value, 0, AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, CLOCK_GATING_DISABLE); AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value); DC_LOG_HW_AUDIO("\n\t========= AUDIO:dce_aud_az_enable: index: %u data: 0x%x\n", audio->inst, value); }
void dce_aud_wall_dto_setup( struct audio *audio, enum signal_type signal, const struct audio_crtc_info *crtc_info, const struct audio_pll_info *pll_info) { struct dce_audio *aud = DCE_AUD(audio); struct azalia_clock_info clock_info = { 0 }; if (dc_is_hdmi_signal(signal)) { uint32_t src_sel; /*DTO0 Programming goal: -generate 24MHz, 128*Fs from 24MHz -use DTO0 when an active HDMI port is connected (optionally a DP is connected) */ /* calculate DTO settings */ get_azalia_clock_info_hdmi( crtc_info->requested_pixel_clock, crtc_info->calculated_pixel_clock, &clock_info); DC_LOG_HW_AUDIO("\n%s:Input::requested_pixel_clock = %d"\ "calculated_pixel_clock =%d\n"\ "audio_dto_module = %d audio_dto_phase =%d \n\n", __func__,\ crtc_info->requested_pixel_clock,\ crtc_info->calculated_pixel_clock,\ clock_info.audio_dto_module,\ clock_info.audio_dto_phase); /* On TN/SI, Program DTO source select and DTO select before programming DTO modulo and DTO phase. These bits must be programmed first, otherwise there will be no HDMI audio at boot up. This is a HW sequence change (different from old ASICs). Caution when changing this programming sequence. HDMI enabled, using DTO0 program master CRTC for DTO0 */ src_sel = pll_info->dto_source - DTO_SOURCE_ID0; REG_UPDATE_2(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL, src_sel, DCCG_AUDIO_DTO_SEL, 0); /* module */ REG_UPDATE(DCCG_AUDIO_DTO0_MODULE, DCCG_AUDIO_DTO0_MODULE, clock_info.audio_dto_module); /* phase */ REG_UPDATE(DCCG_AUDIO_DTO0_PHASE, DCCG_AUDIO_DTO0_PHASE, clock_info.audio_dto_phase); } else { /*DTO1 Programming goal: -generate 24MHz, 512*Fs, 128*Fs from 24MHz -default is to used DTO1, and switch to DTO0 when an audio master HDMI port is connected -use as default for DP calculate DTO settings */ get_azalia_clock_info_dp( crtc_info->requested_pixel_clock, pll_info, &clock_info); /* Program DTO select before programming DTO modulo and DTO phase. default to use DTO1 */ REG_UPDATE(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO_SEL, 1); REG_UPDATE(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO_SEL, 1); /* DCCG_AUDIO_DTO2_USE_512FBR_DTO, 1) * Select 512fs for DP TODO: web register definition * does not match register header file * DCE11 version it's commented out while DCE8 it's set to 1 */ /* module */ REG_UPDATE(DCCG_AUDIO_DTO1_MODULE, DCCG_AUDIO_DTO1_MODULE, clock_info.audio_dto_module); /* phase */ REG_UPDATE(DCCG_AUDIO_DTO1_PHASE, DCCG_AUDIO_DTO1_PHASE, clock_info.audio_dto_phase); REG_UPDATE(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO2_USE_512FBR_DTO, 1); } }
static void dce110_se_setup_hdmi_audio( struct stream_encoder *enc, const struct audio_crtc_info *crtc_info) { struct dce110_stream_encoder *enc110 = DCE110STRENC_FROM_STRENC(enc); struct audio_clock_info audio_clock_info = {0}; uint32_t max_packets_per_line; /* For now still do calculation, although this field is ignored when above HDMI_PACKET_GEN_VERSION set to 1 */ max_packets_per_line = calc_max_audio_packets_per_line(crtc_info); /* HDMI_AUDIO_PACKET_CONTROL */ REG_UPDATE_2(HDMI_AUDIO_PACKET_CONTROL, HDMI_AUDIO_PACKETS_PER_LINE, max_packets_per_line, HDMI_AUDIO_DELAY_EN, 1); /* AFMT_AUDIO_PACKET_CONTROL */ REG_UPDATE(AFMT_AUDIO_PACKET_CONTROL, AFMT_60958_CS_UPDATE, 1); /* AFMT_AUDIO_PACKET_CONTROL2 */ REG_UPDATE_2(AFMT_AUDIO_PACKET_CONTROL2, AFMT_AUDIO_LAYOUT_OVRD, 0, AFMT_60958_OSF_OVRD, 0); /* HDMI_ACR_PACKET_CONTROL */ REG_UPDATE_3(HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUTO_SEND, 1, HDMI_ACR_SOURCE, 0, HDMI_ACR_AUDIO_PRIORITY, 0); /* Program audio clock sample/regeneration parameters */ get_audio_clock_info(crtc_info->color_depth, crtc_info->requested_pixel_clock, crtc_info->calculated_pixel_clock, &audio_clock_info); DC_LOG_HW_AUDIO( "\n%s:Input::requested_pixel_clock = %d" \ "calculated_pixel_clock = %d \n", __func__, \ crtc_info->requested_pixel_clock, \ crtc_info->calculated_pixel_clock); /* HDMI_ACR_32_0__HDMI_ACR_CTS_32_MASK */ REG_UPDATE(HDMI_ACR_32_0, HDMI_ACR_CTS_32, audio_clock_info.cts_32khz); /* HDMI_ACR_32_1__HDMI_ACR_N_32_MASK */ REG_UPDATE(HDMI_ACR_32_1, HDMI_ACR_N_32, audio_clock_info.n_32khz); /* HDMI_ACR_44_0__HDMI_ACR_CTS_44_MASK */ REG_UPDATE(HDMI_ACR_44_0, HDMI_ACR_CTS_44, audio_clock_info.cts_44khz); /* HDMI_ACR_44_1__HDMI_ACR_N_44_MASK */ REG_UPDATE(HDMI_ACR_44_1, HDMI_ACR_N_44, audio_clock_info.n_44khz); /* HDMI_ACR_48_0__HDMI_ACR_CTS_48_MASK */ REG_UPDATE(HDMI_ACR_48_0, HDMI_ACR_CTS_48, audio_clock_info.cts_48khz); /* HDMI_ACR_48_1__HDMI_ACR_N_48_MASK */ REG_UPDATE(HDMI_ACR_48_1, HDMI_ACR_N_48, audio_clock_info.n_48khz); /* Video driver cannot know in advance which sample rate will be used by HD Audio driver HDMI_ACR_PACKET_CONTROL__HDMI_ACR_N_MULTIPLE field is programmed below in interruppt callback */ /* AFMT_60958_0__AFMT_60958_CS_CHANNEL_NUMBER_L_MASK & AFMT_60958_0__AFMT_60958_CS_CLOCK_ACCURACY_MASK */ REG_UPDATE_2(AFMT_60958_0, AFMT_60958_CS_CHANNEL_NUMBER_L, 1, AFMT_60958_CS_CLOCK_ACCURACY, 0); /* AFMT_60958_1 AFMT_60958_CS_CHALNNEL_NUMBER_R */ REG_UPDATE(AFMT_60958_1, AFMT_60958_CS_CHANNEL_NUMBER_R, 2); /*AFMT_60958_2 now keep this settings until * Programming guide comes out*/ REG_UPDATE_6(AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_2, 3, AFMT_60958_CS_CHANNEL_NUMBER_3, 4, AFMT_60958_CS_CHANNEL_NUMBER_4, 5, AFMT_60958_CS_CHANNEL_NUMBER_5, 6, AFMT_60958_CS_CHANNEL_NUMBER_6, 7, AFMT_60958_CS_CHANNEL_NUMBER_7, 8); }