Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}