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