示例#1
0
static int imx_ssi_hw_rx_params(struct snd_pcm_substream *substream,
				struct snd_pcm_hw_params *params)
{
	struct snd_soc_pcm_link *pcm_link = substream->private_data;
	struct snd_soc_dai *cpu_dai = pcm_link->cpu_dai;
	u32 srccr, srcr, sier;
	bool sync_mode;

	if (cpu_dai->id == IMX_DAI_SSI0 || cpu_dai->id == IMX_DAI_SSI1) {
		sync_mode = ((SSI1_SCR & SSI_SCR_SYN) ? true : false);
		srccr = sync_mode ? SSI1_STCCR : SSI1_SRCCR;
		srcr = SSI1_SRCR;
		sier = SSI1_SIER;
	} else {
		sync_mode = ((SSI2_SCR & SSI_SCR_SYN) ? true : false);
		srccr = sync_mode ? SSI2_STCCR : SSI2_SRCCR;
		srcr = SSI2_SRCR;
		sier = SSI2_SIER;
	}
	srccr &= ~SSI_SRCCR_WL_MASK;

	/* DAI data (word) size */
	switch (params_format(params)) {
	case SNDRV_PCM_FORMAT_S16_LE:
		srccr |= SSI_SRCCR_WL(16);
		break;
	case SNDRV_PCM_FORMAT_S20_3LE:
		srccr |= SSI_SRCCR_WL(20);
		break;
	case SNDRV_PCM_FORMAT_S24_LE:
		srccr |= SSI_SRCCR_WL(24);
		break;
	}

	/* enable interrupts */
	if (cpu_dai->id == IMX_DAI_SSI0 || cpu_dai->id == IMX_DAI_SSI2)
		srcr |= SSI_SRCR_RFEN0;
	else
		srcr |= SSI_SRCR_RFEN1;
	sier |= SSI_SIER_RDMAE | SSI_SIER_RIE | SSI_SIER_ROE0_EN;

	if (cpu_dai->id == IMX_DAI_SSI0 || cpu_dai->id == IMX_DAI_SSI1) {
		SSI1_SRCR = srcr;
		if (sync_mode)
			SSI1_STCCR = srccr;
		else
			SSI1_SRCCR = srccr;
		SSI1_SIER = sier;
	} else {
		SSI2_SRCR = srcr;
		if (sync_mode)
			SSI2_STCCR = srccr;
		else
			SSI2_SRCCR = srccr;
		SSI2_SIER = sier;
	}
	return 0;
}
示例#2
0
static int imx_ssi_hw_rx_params(struct snd_pcm_substream *substream,
				struct snd_pcm_hw_params *params,
				struct snd_soc_dai *cpu_dai)
{
	u32 srccr, srcr, sier;
	struct imx_ssi *priv = (struct imx_ssi *)cpu_dai->private_data;
	void __iomem *ioaddr = priv->ioaddr;
	bool sync_mode = priv->sync_mode;

	srccr =
	    sync_mode ? __raw_readl(ioaddr + SSI_STCCR) :
	    __raw_readl(ioaddr + SSI_SRCCR);
	srcr = __raw_readl(ioaddr + SSI_SRCR);
	sier = __raw_readl(ioaddr + SSI_SIER);
	srccr &= ~SSI_SRCCR_WL_MASK;

	/* DAI data (word) size */
	switch (params_format(params)) {
	case SNDRV_PCM_FORMAT_S16_LE:
		srccr |= SSI_SRCCR_WL(16);
		break;
	case SNDRV_PCM_FORMAT_S20_3LE:
		srccr |= SSI_SRCCR_WL(20);
		break;
	case SNDRV_PCM_FORMAT_S24_LE:
		srccr |= SSI_SRCCR_WL(24);
		break;
	}

	/* enable interrupts */
	if ((cpu_dai->id & 0x1) == 0)
		srcr |= SSI_SRCR_RFEN0;
	else
		srcr |= SSI_SRCR_RFEN1;
	sier |= SSI_SIER_RDMAE | SSI_SIER_RIE | SSI_SIER_ROE0_EN;

	__raw_writel(srcr, ioaddr + SSI_SRCR);
	if (sync_mode)
		__raw_writel(srccr, ioaddr + SSI_STCCR);
	else
		__raw_writel(srccr, ioaddr + SSI_SRCCR);
	__raw_writel(sier, ioaddr + SSI_SIER);

	return 0;
}
static int imx_ssi_hw_rx_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->dai->cpu_dai;
	u32 srccr, srcr, sier;
	bool sync_mode;

	if (cpu_dai->id == IMX_DAI_SSI0 || cpu_dai->id == IMX_DAI_SSI1) {
		sync_mode =
		    (__raw_readl(SSI1_SCR) & SSI_SCR_SYN) ? true : false;
		srccr =
		    sync_mode ? __raw_readl(SSI1_STCCR) :
		    __raw_readl(SSI1_SRCCR);
		srcr = __raw_readl(SSI1_SRCR);
		sier = __raw_readl(SSI1_SIER);
	} else {
		sync_mode =
		    (__raw_readl(SSI2_SCR) & SSI_SCR_SYN) ? true : false;
		srccr =
		    sync_mode ? __raw_readl(SSI2_STCCR) :
		    __raw_readl(SSI2_SRCCR);
		srcr = __raw_readl(SSI2_SRCR);
		sier = __raw_readl(SSI2_SIER);
	}
	srccr &= ~SSI_SRCCR_WL_MASK;

	/* DAI data (word) size */
	switch (params_format(params)) {
	case SNDRV_PCM_FORMAT_S16_LE:
		srccr |= SSI_SRCCR_WL(16);
		break;
	case SNDRV_PCM_FORMAT_S20_3LE:
		srccr |= SSI_SRCCR_WL(20);
		break;
	case SNDRV_PCM_FORMAT_S24_LE:
		srccr |= SSI_SRCCR_WL(24);
		break;
	}

	/* enable interrupts */
	if (cpu_dai->id == IMX_DAI_SSI0 || cpu_dai->id == IMX_DAI_SSI2)
		srcr |= SSI_SRCR_RFEN0;
	else
		srcr |= SSI_SRCR_RFEN1;
	sier |= SSI_SIER_RDMAE | SSI_SIER_RIE | SSI_SIER_ROE0_EN;

	if (cpu_dai->id == IMX_DAI_SSI0 || cpu_dai->id == IMX_DAI_SSI1) {
		__raw_writel(srcr, SSI1_SRCR);
		if (sync_mode)
			__raw_writel(srccr, SSI1_STCCR);
		else
			__raw_writel(srccr, SSI1_SRCCR);
		__raw_writel(sier, SSI1_SIER);
	} else {
		__raw_writel(srcr, SSI2_SRCR);
		if (sync_mode)
			__raw_writel(srccr, SSI2_STCCR);
		else
			__raw_writel(srccr, SSI2_SRCCR);
		__raw_writel(sier, SSI2_SIER);
	}
	return 0;
}