[alsa-devel] [PATCH] ASoC: imx-ssi: Fix DAI hardware signal inversions
Nicolin Chen
nicoleotsuka at gmail.com
Thu Sep 17 19:59:27 CEST 2015
On Thu, Sep 17, 2015 at 05:46:54PM +0200, Benoît Thébaudeau wrote:
> SND_SOC_DAIFMT_{IB|NB}_{IF|NF} are defined as inverting or not BCLK or
> FRM relatively to what is standard for the specified DAI hardware audio
> format. Consequently, the absolute polarities of these signals cannot be
> derived only from these settings as this driver did. The format has to
> be taken into account too.
>
> This fixes inverted left/right channels in I²S mode.
>
> Signed-off-by: Benoît Thébaudeau <benoit at wsystem.com>
Looks like the same configurations of fsl_ssi, so it should be fine:
Acked-by: Nicolin Chen <nicoleotsuka at gmail.com>
> ---
> sound/soc/fsl/imx-ssi.c | 19 +++++++++----------
> 1 file changed, 9 insertions(+), 10 deletions(-)
>
> diff --git a/sound/soc/fsl/imx-ssi.c b/sound/soc/fsl/imx-ssi.c
> index 48b2d24..b95132e 100644
> --- a/sound/soc/fsl/imx-ssi.c
> +++ b/sound/soc/fsl/imx-ssi.c
> @@ -95,7 +95,8 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
> switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
> case SND_SOC_DAIFMT_I2S:
> /* data on rising edge of bclk, frame low 1clk before data */
> - strcr |= SSI_STCR_TFSI | SSI_STCR_TEFS | SSI_STCR_TXBIT0;
> + strcr |= SSI_STCR_TXBIT0 | SSI_STCR_TSCKP | SSI_STCR_TFSI |
> + SSI_STCR_TEFS;
> scr |= SSI_SCR_NET;
> if (ssi->flags & IMX_SSI_USE_I2S_SLAVE) {
> scr &= ~SSI_I2S_MODE_MASK;
> @@ -104,33 +105,31 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
> break;
> case SND_SOC_DAIFMT_LEFT_J:
> /* data on rising edge of bclk, frame high with data */
> - strcr |= SSI_STCR_TXBIT0;
> + strcr |= SSI_STCR_TXBIT0 | SSI_STCR_TSCKP;
> break;
> case SND_SOC_DAIFMT_DSP_B:
> /* data on rising edge of bclk, frame high with data */
> - strcr |= SSI_STCR_TFSL | SSI_STCR_TXBIT0;
> + strcr |= SSI_STCR_TXBIT0 | SSI_STCR_TSCKP | SSI_STCR_TFSL;
> break;
> case SND_SOC_DAIFMT_DSP_A:
> /* data on rising edge of bclk, frame high 1clk before data */
> - strcr |= SSI_STCR_TFSL | SSI_STCR_TXBIT0 | SSI_STCR_TEFS;
> + strcr |= SSI_STCR_TXBIT0 | SSI_STCR_TSCKP | SSI_STCR_TFSL |
> + SSI_STCR_TEFS;
> break;
> }
>
> /* DAI clock inversion */
> switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
> case SND_SOC_DAIFMT_IB_IF:
> - strcr |= SSI_STCR_TFSI;
> - strcr &= ~SSI_STCR_TSCKP;
> + strcr ^= SSI_STCR_TSCKP | SSI_STCR_TFSI;
> break;
> case SND_SOC_DAIFMT_IB_NF:
> - strcr &= ~(SSI_STCR_TSCKP | SSI_STCR_TFSI);
> + strcr ^= SSI_STCR_TSCKP;
> break;
> case SND_SOC_DAIFMT_NB_IF:
> - strcr |= SSI_STCR_TFSI | SSI_STCR_TSCKP;
> + strcr ^= SSI_STCR_TFSI;
> break;
> case SND_SOC_DAIFMT_NB_NF:
> - strcr &= ~SSI_STCR_TFSI;
> - strcr |= SSI_STCR_TSCKP;
> break;
> }
>
> --
> 2.1.4
>
More information about the Alsa-devel
mailing list