static int sunxi_sndspdif_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret = 0; unsigned long rate = params_rate(params); unsigned int fmt = 0; u32 mclk_div=0, mpll=0, bclk_div=0, mult_fs=0; get_clock_divder(rate, 32, &mclk_div, &mpll, &bclk_div, &mult_fs); if (ret < 0) return ret; #ifdef CONFIG_SND_SUNXI_SOC_SUPPORT_AUDIO_RAW /*fmt:1:pcm; >1:rawdata*/ fmt = params_raw(params); #else fmt = spdif_format; #endif if(fmt > 1){ fmt = 1; }else{ fmt = 0; } ret = snd_soc_dai_set_fmt(cpu_dai, fmt);//0:pcm,1:raw data if (ret < 0) return ret; ret = snd_soc_dai_set_sysclk(cpu_dai, 0 , mpll, 0); if (ret < 0) return ret; ret = snd_soc_dai_set_clkdiv(cpu_dai, SUNXI_DIV_MCLK, mclk_div); if (ret < 0) return ret; return 0; }
static int sndhdmi_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { if ((!substream)||(!params)) { pr_err("error:%s,line:%d\n", __func__, __LINE__); return -EAGAIN; } if(substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { hdmi_para.sample_rate = params_rate(params); hdmi_para.channel_num = params_channels(params); #ifdef CONFIG_SND_SUNXI_SOC_SUPPORT_AUDIO_RAW hdmi_para.data_raw = params_raw(params); #else hdmi_para.data_raw = hdmi_format; #endif switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: hdmi_para.sample_bit = 16; break; case SNDRV_PCM_FORMAT_S20_3LE: hdmi_para.sample_bit = 24; break; case SNDRV_PCM_FORMAT_S24_LE: hdmi_para.sample_bit = 24; break; case SNDRV_PCM_FORMAT_S32_LE: hdmi_para.sample_bit = 24; break; default: return -EINVAL; } /* PCM = 1, AC3 = 2, MPEG1 = 3, MP3 = 4, MPEG2 = 5, AAC = 6, DTS = 7, ATRAC = 8, ONE_BIT_AUDIO = 9, DOLBY_DIGITAL_PLUS = 10, DTS_HD = 11, MAT = 12, DST = 13, WMAPRO = 14. */ if (hdmi_para.data_raw > 1) { hdmi_para.sample_bit = 24; //??? TODO } if (hdmi_para.channel_num == 8) { hdmi_para.ca = 0x12; } else if ((hdmi_para.channel_num >= 3)) { hdmi_para.ca = 0x1f; } else { hdmi_para.ca = 0x0; } } return 0; }