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; }
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; }
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; }