Example #1
0
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;
}
Example #2
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;
}