On Thu, Aug 06, 2009 at 03:55:18PM +0100, Mark Brown wrote: > * Automatically sets TDM mode for frame_width larger than 32 bits, if > the user doesn't setup the TDM slots with set_tdm_slot(). > * Reset SSCR0_EDSS and SSCR0_DSS on pxa_ssp_set_dai_fmt. > * Makes SSCR0_MOD optional. > * Clears SSCR1_RWOT case SSCR0_MOD is set. > > Signed-off-by: Daniel Ribeiro <drwyrm@xxxxxxxxx> > Signed-off-by: Mark Brown <broonie@xxxxxxxxxxxxxxxxxxxxxxxxxxx> > --- > sound/soc/pxa/pxa-ssp.c | 92 +++++++++++++++++++++++++++-------------------- > 1 files changed, 53 insertions(+), 39 deletions(-) > > diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c > index 5b9ed64..d60492e 100644 > --- a/sound/soc/pxa/pxa-ssp.c > +++ b/sound/soc/pxa/pxa-ssp.c [...] > @@ -532,48 +532,70 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream, > struct ssp_priv *priv = cpu_dai->private_data; > struct ssp_device *ssp = priv->dev.ssp; > int chn = params_channels(params); > - u32 sscr0; > - u32 sspsp; > + u32 sscr0, sscr1, sspsp; > int width = snd_pcm_format_physical_width(params_format(params)); > - int ttsa = ssp_read_reg(ssp, SSTSA) & 0xf; > + int slot_width, frame_width = 0; > + > + /* check if the user explicitly set a slot_width */ > + sscr0 = ssp_read_reg(ssp, SSCR0); > + > + if (sscr0 & (SSCR0_EDSS | SSCR0_DSS)) > + slot_width = (sscr0 & SSCR0_DSS) + > + (sscr0 & SSCR0_EDSS ? 17 : 1); > + else > + frame_width = slot_width = width * chn; > > /* generate correct DMA params */ > if (cpu_dai->dma_data) > kfree(cpu_dai->dma_data); > > - /* Network mode with one active slot (ttsa == 1) can be used > - * to force 16-bit frame width on the wire (for S16_LE), even > - * with two channels. Use 16-bit DMA transfers for this case. > - */ > - cpu_dai->dma_data = ssp_get_dma_params(ssp, > - ((chn == 2) && (ttsa != 1)) || (width == 32), > + cpu_dai->dma_data = ssp_get_dma_params(ssp, slot_width > 16, > substream->stream == SNDRV_PCM_STREAM_PLAYBACK); > > /* we can only change the settings if the port is not in use */ > - if (ssp_read_reg(ssp, SSCR0) & SSCR0_SSE) > + if (sscr0 & SSCR0_SSE) > return 0; > > - /* clear selected SSP bits */ > - sscr0 = ssp_read_reg(ssp, SSCR0) & ~(SSCR0_DSS | SSCR0_EDSS); > - ssp_write_reg(ssp, SSCR0, sscr0); > - > - /* bit size */ > - sscr0 = ssp_read_reg(ssp, SSCR0); > - switch (params_format(params)) { > - case SNDRV_PCM_FORMAT_S16_LE: > #ifdef CONFIG_PXA3xx > - if (cpu_is_pxa3xx()) > - sscr0 |= SSCR0_FPCKE; > + if (slot_width == 16 && cpu_is_pxa3xx()) And I forgot to mention that this should read ">= 16". Daniel _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel