[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