[alsa-devel] [PATCH] imx-ssi.c: fix I2S slave setup
* without this fix, the waveform on the SSI port are not real I2S signal (at least on i.MX27's SSI4)
* original Freescale's driver has if (((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S) && ssi_mode->network_mode) { scr &= ~SSI_SCR_I2S_MODE_MASK; scr |= SSI_SCR_I2S_MODE_SLAVE; } So as now the SSI is set in network mode as a default when running in I2S format, it seems reasonable to also set I2S_MODE_SLAVE
Signed-off-by: Eric Bénard eric@eukrea.com --- sound/soc/imx/imx-ssi.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-)
diff --git a/sound/soc/imx/imx-ssi.c b/sound/soc/imx/imx-ssi.c index 80b4fee..c5e1626 100644 --- a/sound/soc/imx/imx-ssi.c +++ b/sound/soc/imx/imx-ssi.c @@ -83,8 +83,6 @@ static int imx_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, /* * SSI DAI format configuration. * Should only be called when port is inactive (i.e. SSIEN = 0). - * Note: We don't use the I2S modes but instead manually configure the - * SSI for I2S because the I2S mode is only a register preset. */ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { @@ -98,7 +96,7 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) 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; - scr |= SSI_SCR_NET; + scr |= SSI_SCR_NET | SSI_SCR_I2S_MODE_SLAVE; break; case SND_SOC_DAIFMT_LEFT_J: /* data on rising edge of bclk, frame high with data */
On Wed, May 26, 2010 at 06:37:53PM +0200, Eric B??nard wrote:
- without this fix, the waveform on the SSI port are not real
I2S signal (at least on i.MX27's SSI4)
As I said in reply to your previous patch the current mainline i.MX driver is not able to master the clocks at all?
Hi Mark,
Le 27/05/2010 02:57, Mark Brown a écrit :
On Wed, May 26, 2010 at 06:37:53PM +0200, Eric B??nard wrote:
- without this fix, the waveform on the SSI port are not real
I2S signal (at least on i.MX27's SSI4)
As I said in reply to your previous patch the current mainline i.MX driver is not able to master the clocks at all?
the problem in not on the clocks (which are generated by the external codec which is the master), but on the way the i.MX's SSI outputs the data vs the framesync provided by the external codec.
If this setting is not the right one (even if sound works perfectly here with it), then there is a bug somewhere else preventing the i.MX's SSI to provide he right data to my TLV320AIC23B using I2S.
Please find attached the patches which add the TLV320 support to our i.MX27 board because the bug may be there :-)
Eric
On Wed, May 26, 2010 at 06:37:53PM +0200, Eric Bénard wrote:
- without this fix, the waveform on the SSI port are not real
I2S signal (at least on i.MX27's SSI4)
- original Freescale's driver has if (((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S) && ssi_mode->network_mode) { scr &= ~SSI_SCR_I2S_MODE_MASK; scr |= SSI_SCR_I2S_MODE_SLAVE; }
So as now the SSI is set in network mode as a default when running in I2S format, it seems reasonable to also set I2S_MODE_SLAVE
Signed-off-by: Eric Bénard eric@eukrea.com
sound/soc/imx/imx-ssi.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-)
diff --git a/sound/soc/imx/imx-ssi.c b/sound/soc/imx/imx-ssi.c index 80b4fee..c5e1626 100644 --- a/sound/soc/imx/imx-ssi.c +++ b/sound/soc/imx/imx-ssi.c @@ -83,8 +83,6 @@ static int imx_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, /*
- SSI DAI format configuration.
- Should only be called when port is inactive (i.e. SSIEN = 0).
- Note: We don't use the I2S modes but instead manually configure the
*/
- SSI for I2S because the I2S mode is only a register preset.
static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { @@ -98,7 +96,7 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) 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;
scr |= SSI_SCR_NET;
scr |= SSI_SCR_NET | SSI_SCR_I2S_MODE_SLAVE;
You should also zero out the SSI_I2S_MODE_MASK in the scr = readl()... above. Otherwise I'm ok with this patch.
Sascha
participants (3)
-
Eric Bénard
-
Mark Brown
-
Sascha Hauer