int rk30_hdmi_config_audio(struct hdmi_audio *audio) { int value, rate, N; char word_length, channel; if(audio->channel < 3) channel = I2S_CHANNEL_1_2; else if(audio->channel < 5) channel = I2S_CHANNEL_3_4; else if(audio->channel < 7) channel = I2S_CHANNEL_5_6; else channel = I2S_CHANNEL_7_8; switch(audio->rate) { case HDMI_AUDIO_FS_32000: rate = AUDIO_32K; N = N_32K; break; case HDMI_AUDIO_FS_44100: rate = AUDIO_441K; N = N_441K; break; case HDMI_AUDIO_FS_48000: rate = AUDIO_48K; N = N_48K; break; case HDMI_AUDIO_FS_88200: rate = AUDIO_882K; N = N_882K; break; case HDMI_AUDIO_FS_96000: rate = AUDIO_96K; N = N_96K; break; case HDMI_AUDIO_FS_176400: rate = AUDIO_1764K; N = N_1764K; break; case HDMI_AUDIO_FS_192000: rate = AUDIO_192K; N = N_192K; break; default: hdmi_err(hdmi->dev, "[%s] not support such sample rate %d\n", __FUNCTION__, audio->rate); return -ENOENT; } // switch(audio->word_length) // { // case HDMI_AUDIO_WORD_LENGTH_16bit: // word_length = 0x02; // break; // case HDMI_AUDIO_WORD_LENGTH_20bit: // word_length = 0x0a; // break; // case HDMI_AUDIO_WORD_LENGTH_24bit: // word_length = 0x0b; // break; // default: // hdmi_err(hdmi->dev, "[%s] not support such word length %d\n", __FUNCTION__, audio->word_length); // return -ENOENT; // } //set_audio_if I2S HDMIWrReg(AUDIO_CTRL1, 0x00); //internal CTS, disable down sample, i2s input, disable MCLK HDMIWrReg(AUDIO_CTRL2, 0x40); HDMIWrReg(I2S_AUDIO_CTRL, v_I2S_MODE(I2S_MODE_STANDARD) | v_I2S_CHANNEL(channel) ); HDMIWrReg(I2S_INPUT_SWAP, 0x00); //no swap HDMIMskReg(value, AV_CTRL1, m_AUDIO_SAMPLE_RATE, v_AUDIO_SAMPLE_RATE(rate)) // HDMIWrReg(SRC_NUM_AUDIO_LEN, word_length); //Set N value 6144, fs=48kHz HDMIWrReg(N_1, N & 0xFF); HDMIWrReg(N_2, (N >> 8) & 0xFF); HDMIWrReg(LR_SWAP_N3, (N >> 16) & 0x0F); rk30_hdmi_config_aai(); return 0; }
static int rk2928_hdmi_config_audio(struct hdmi_audio *audio) { int rate, N, channel, mclk_fs; if(audio->channel < 3) channel = I2S_CHANNEL_1_2; else if(audio->channel < 5) channel = I2S_CHANNEL_3_4; else if(audio->channel < 7) channel = I2S_CHANNEL_5_6; else channel = I2S_CHANNEL_7_8; switch(audio->rate) { case HDMI_AUDIO_FS_32000: rate = AUDIO_32K; N = N_32K; mclk_fs = MCLK_384FS; break; case HDMI_AUDIO_FS_44100: rate = AUDIO_441K; N = N_441K; mclk_fs = MCLK_256FS; break; case HDMI_AUDIO_FS_48000: rate = AUDIO_48K; N = N_48K; mclk_fs = MCLK_256FS; break; case HDMI_AUDIO_FS_88200: rate = AUDIO_882K; N = N_882K; mclk_fs = MCLK_128FS; break; case HDMI_AUDIO_FS_96000: rate = AUDIO_96K; N = N_96K; mclk_fs = MCLK_128FS; break; case HDMI_AUDIO_FS_176400: rate = AUDIO_1764K; N = N_1764K; mclk_fs = MCLK_128FS; break; case HDMI_AUDIO_FS_192000: rate = AUDIO_192K; N = N_192K; mclk_fs = MCLK_128FS; break; default: dev_err(hdmi->dev, "[%s] not support such sample rate %d\n", __FUNCTION__, audio->rate); return -ENOENT; } //set_audio source I2S HDMIWrReg(AUDIO_CTRL1, 0x00); //internal CTS, disable down sample, i2s input, disable MCLK HDMIWrReg(AUDIO_SAMPLE_RATE, rate); HDMIWrReg(AUDIO_I2S_MODE, v_I2S_MODE(I2S_STANDARD) | v_I2S_CHANNEL(channel) ); HDMIWrReg(AUDIO_I2S_MAP, 0x00); HDMIWrReg(AUDIO_I2S_SWAPS_SPDIF, 0); // no swap //Set N value HDMIWrReg(AUDIO_N_H, (N >> 16) & 0x0F); HDMIWrReg(AUDIO_N_M, (N >> 8) & 0xFF); HDMIWrReg(AUDIO_N_L, N & 0xFF); rk2928_hdmi_config_aai(); return 0; }