示例#1
0
static int jz_spdif_set_rate(struct device *aic ,struct jz_aic* jz_aic, unsigned long sample_rate){
	unsigned long sysclk;
	struct clk* cgu_aic_clk = jz_aic->clk;
	__i2s_stop_bitclk(aic);
#ifndef CONFIG_PRODUCT_X1000_FPGA
	sysclk = calculate_cgu_aic_rate(clk_get_rate(cgu_aic_clk->parent), &sample_rate);
	clk_set_rate(cgu_aic_clk, (sysclk*2));
	jz_aic->sysclk = clk_get_rate(cgu_aic_clk);

	if (jz_aic->sysclk > (sysclk*2)) {
		printk("external codec set sysclk fail aic = %ld want is %ld .\n",jz_aic->sysclk,sysclk);
		return -1;
	}

	spdif_set_clk(jz_aic, jz_aic->sysclk/2, sample_rate);
#else
	audio_write((253<<13)|(4482),I2SCDR_PRE);
	*(volatile unsigned int*)0xb0000070 = *(volatile unsigned int*)0xb0000070;
	audio_write((253<<13)|(4482)|(1<<29),I2SCDR_PRE);
	audio_write(0,I2SDIV_PRE);
#endif
	__i2s_start_bitclk(aic);
	spdif_select_ori_sample_freq(aic,sample_rate);
	spdif_select_sample_freq(aic,sample_rate);

	return sample_rate;
}
示例#2
0
static int jz_spdif_set_rate(struct device *aic ,struct jz_aic* jz_aic, unsigned long sample_rate){
	struct clk* cgu_aic_clk = jz_aic->clk;
	__i2s_stop_bitclk(aic);
	clk_set_rate(cgu_aic_clk, sample_rate);
	writel(0xa,I2S_CPM_VALID);
	__i2s_start_bitclk(aic);
	spdif_select_ori_sample_freq(aic,sample_rate);
	spdif_select_sample_freq(aic,sample_rate);

	return sample_rate;
}
示例#3
0
static int jz_spdif_probe(struct snd_soc_dai *dai)
{
	struct jz_spdif *jz_spdif = dev_get_drvdata(dai->dev);
	struct device *aic = jz_spdif->aic;
	unsigned int reg_tmp;

	spdif_DEBUG_MSG("enter %s\n", __func__);


	__i2s_disable_transmit_dma(aic);
	__i2s_disable_receive_dma(aic);
	__i2s_disable_replay(aic);
	__i2s_disable_record(aic);
	__i2s_disable_loopback(aic);
	__aic_disable(aic);


	reg_tmp = jz_aic_read_reg(aic, SPCTRL);
	reg_tmp |= (SPCTRL_SPDIF_I2S_MASK | SPCTRL_M_TRIG_MASK |
			SPCTRL_M_FFUR_MASK | SPCTRL_INVALID_MASK);
	jz_aic_write_reg(aic, SPCTRL, reg_tmp);

	__i2s_stop_bitclk(aic);
	__i2s_external_codec(aic);
	__i2s_bclk_output(aic);
	__i2s_sync_output(aic);
	__aic_select_i2s(aic);
	__i2s_send_rfirst(aic);

	__spdif_set_dtype(aic,0);
	__spdif_set_ch1num(aic,0);
	__spdif_set_ch2num(aic,1);
	__spdif_set_srcnum(aic,0);

	__interface_select_spdif(aic);
	__spdif_play_lastsample(aic);
	__spdif_init_set_low(aic);
	__spdif_choose_consumer(aic);
	__spdif_clear_audion(aic);
	__spdif_set_copyn(aic);
	__spdif_clear_pre(aic);
	__spdif_choose_chmd(aic);
	__spdif_set_category_code_normal(aic);
	__spdif_set_clkacu(aic, 0);
	__spdif_set_sample_size(aic, 1);
	__spdif_set_valid(aic);
	__spdif_mask_trig(aic);
	__spdif_disable_underrun_intr(aic);
	/*select spdif trans*/
	printk("spdif cpu dai prob ok\n");

	return 0;
}