[alsa-devel] [PATCH] ASoC: imx-ssi: Fix DAI hardware signal inversions

Benoît Thébaudeau benoit.thebaudeau.dev at gmail.com
Mon Sep 28 21:36:49 CEST 2015


Hi all,

On Thu, Sep 17, 2015 at 7:59 PM, Nicolin Chen <nicoleotsuka at gmail.com> wrote:
> 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
>>

Adding the ASoC maintainers to the Cc list.

Best regards,
Benoît


More information about the Alsa-devel mailing list