static int jz_pcm_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct device *dev = dai->dev; struct jz_pcm *jz_pcm = dev_get_drvdata(dai->dev); PCM_DEBUG_MSG("enter %s, substream = %s\n", __func__, (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? "playback" : "capture"); if (!jz_pcm->pcm_mode) { clk_enable(jz_pcm->clk_gate); #if 1 __pcm_as_slaver(dev); #else clk_set_rate(jz_pcm->clk, 9600000); clk_enable(jz_pcm->clk); __pcm_as_master(dev); __pcm_set_clkdiv(dev, 9600000/20/8000 - 1); __pcm_set_syndiv(dev, 20 - 1); #endif __pcm_set_msb_one_shift_in(dev); __pcm_set_msb_one_shift_out(dev); __pcm_play_lastsample(dev); __pcm_enable(dev); __pcm_clock_enable(dev); } if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { __pcm_disable_transmit_dma(dev); __pcm_disable_replay(dev); __pcm_clear_tur(dev); jz_pcm->pcm_mode |= PCM_WRITE; } else { __pcm_disable_receive_dma(dev); __pcm_disable_record(dev); __pcm_clear_ror(dev); jz_pcm->pcm_mode |= PCM_READ; } printk("start set PCM register....\n"); return 0; }
static int pcm_clk_init(struct platform_device *pdev) { struct clk *epll_clk = NULL; struct clk *pcm_sysclk = NULL; struct clk *pcmclk = NULL; epll_clk = clk_get(&pdev->dev,"mpll"); if (IS_ERR(epll_clk)) { printk(KERN_ERR"pcm get epll_clk fail\n"); goto __err_epll_clk_get; } pcm_priv->cpm_epll_clk = clk_get_rate(epll_clk); pcmclk = clk_get(&pdev->dev, "pcm"); if (IS_ERR(pcmclk)) { dev_dbg(&pdev->dev, "pcm clk_get failed\n"); goto __err_pcmsys_clk_get; } clk_enable(pcmclk); if (pcm_priv->pcm_device_mode == PCM_MASTER) calculate_pcm_clk(); if (pcm_priv->pcm_sysclk != 0) { pcm_sysclk = clk_get(&pdev->dev, "cgu_pcm"); if (IS_ERR(pcm_sysclk)) { printk(KERN_ERR"CGU pcm clk_get failed\n"); goto __err_pcmclk; } clk_set_rate(pcm_sysclk, pcm_priv->pcm_sysclk); if (clk_get_rate(pcm_sysclk) > pcm_priv->pcm_sysclk) { printk("codec interface set rate fail clk_get_rate(pcm_sysclk) = %ld ,pcm_priv->pcm_sysclk = %ld\n", clk_get_rate(pcm_sysclk),pcm_priv->pcm_sysclk); } clk_enable(pcm_sysclk); } if (pcm_priv->pcm_device_mode == PCM_MASTER) { __pcm_as_master(); pcm_set_pcmclk(pcm_priv->pcmclk); if (pcm_priv->pcm_sync_len > (0x3f+1)) pcm_priv->pcm_sync_len = (0x3f+1); __pcm_set_sync((pcm_priv->pcm_sync_len - 1) & 0x3f); } else __pcm_as_slaver(); if (pcm_priv->pcm_slot_num < 4) { if (pcm_priv->pcm_slot_num == 0) pcm_priv->pcm_slot_num = 1; __pcm_set_slot(((pcm_priv->pcm_slot_num-1) & 0x3)); } if (pcm_priv->pcm_imsb_pos == ONE_SHIFT_MODE) __pcm_set_msb_one_shift_in(); else __pcm_set_msb_normal_in(); if (pcm_priv->pcm_imsb_pos == ONE_SHIFT_MODE) __pcm_set_msb_one_shift_out(); else __pcm_set_msb_normal_in(); return 0; __err_pcmclk: clk_put(pcm_sysclk); __err_pcmsys_clk_get: clk_put(epll_clk); __err_epll_clk_get: return -1; }