static int imx_ssi_hw_tx_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 stccr, stcr, sier; if (cpu_dai->id == IMX_DAI_SSI0 || cpu_dai->id == IMX_DAI_SSI1) { stccr = SSI1_STCCR & ~SSI_STCCR_WL_MASK; stcr = SSI1_STCR; sier = SSI1_SIER; } else { stccr = SSI2_STCCR & ~SSI_STCCR_WL_MASK; stcr = SSI2_STCR; sier = SSI2_SIER; } /* DAI data (word) size */ switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: stccr |= SSI_STCCR_WL(16); break; case SNDRV_PCM_FORMAT_S20_3LE: stccr |= SSI_STCCR_WL(20); break; case SNDRV_PCM_FORMAT_S24_LE: stccr |= SSI_STCCR_WL(24); break; } /* enable interrupts */ if (cpu_dai->id == IMX_DAI_SSI0 || cpu_dai->id == IMX_DAI_SSI2) stcr |= SSI_STCR_TFEN0; else stcr |= SSI_STCR_TFEN1; sier |= SSI_SIER_TDMAE | SSI_SIER_TIE | SSI_SIER_TUE0_EN; if (cpu_dai->id == IMX_DAI_SSI0 || cpu_dai->id == IMX_DAI_SSI1) { SSI1_STCR = stcr; SSI1_STCCR = stccr; SSI1_SIER = sier; } else { SSI2_STCR = stcr; SSI2_STCCR = stccr; SSI2_SIER = sier; } return 0; }
static int imx_ssi_hw_tx_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *cpu_dai) { struct imx_ssi *priv = (struct imx_ssi *)cpu_dai->private_data; void __iomem *ioaddr = priv->ioaddr; u32 stccr, stcr, sier; stccr = __raw_readl(ioaddr + SSI_STCCR) & ~SSI_STCCR_WL_MASK; stcr = __raw_readl(ioaddr + SSI_STCR); sier = __raw_readl(ioaddr + SSI_SIER); /* DAI data (word) size */ switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: stccr |= SSI_STCCR_WL(16); break; case SNDRV_PCM_FORMAT_S20_3LE: stccr |= SSI_STCCR_WL(20); break; case SNDRV_PCM_FORMAT_S24_LE: stccr |= SSI_STCCR_WL(24); break; } /* enable interrupts */ if ((cpu_dai->id & 0x1) == 0) stcr |= SSI_STCR_TFEN0; else stcr |= SSI_STCR_TFEN1; sier |= SSI_SIER_TDMAE | SSI_SIER_TIE | SSI_SIER_TUE0_EN; __raw_writel(stcr, ioaddr + SSI_STCR); __raw_writel(stccr, ioaddr + SSI_STCCR); __raw_writel(sier, ioaddr + SSI_SIER); return 0; }