[alsa-devel] [RFC PATCH 5/5] ASoC: simplify the SSP DMA parameters settings by run-time generation
Eric Miao
eric.y.miao at gmail.com
Thu Apr 23 11:02:14 CEST 2009
>> + snprintf(dma->name, 20, "SSP%d PCM %s %s", ssp->port_id,
>> + stereo ? "Stereo" : "Mono", out ? "out" : "in");
>
> Should we change Stereo/Mono to 32-bit/16-bit here?
>
Depends on Mark, the dma->name and the comments below doesn't
actually match very well ...
>> +
>> + dma->params.name = dma->name;
>> + dma->params.drcmr = &DRCMR(out ? ssp->drcmr_tx : ssp->drcmr_rx);
>> + dma->params.dcmd = (out ? (DCMD_INCSRCADDR | DCMD_FLOWTRG) :
>> + (DCMD_INCTRGADDR | DCMD_FLOWSRC)) |
>> + (stereo ? DCMD_WIDTH4 : DCMD_WIDTH2) | DCMD_BURST16;
>> + dma->params.dev_addr = ssp->phys_base + SSDR;
>> +
>> + return &dma->params;
>> +}
>> +
>> static int pxa_ssp_startup(struct snd_pcm_substream *substream,
>> struct snd_soc_dai *dai)
>> {
>> @@ -225,6 +100,11 @@ static int pxa_ssp_startup(struct
>> snd_pcm_substream *substream,
>> clk_enable(priv->ssp->clk);
>> ssp_disable(priv->ssp);
>> }
>> +
>> + if (cpu_dai->dma_data) {
>> + kfree(cpu_dai->dma_data);
>> + cpu_dai->dma_data = NULL;
>> + }
>> return ret;
>> }
>>
>> @@ -239,6 +119,11 @@ static void pxa_ssp_shutdown(struct
>> snd_pcm_substream *substream,
>> ssp_disable(priv->ssp);
>> clk_disable(priv->ssp->clk);
>> }
>> +
>> + if (cpu_dai->dma_data) {
>> + kfree(cpu_dai->dma_data);
>> + cpu_dai->dma_data = NULL;
>> + }
>> }
>>
>> #ifdef CONFIG_PM
>> @@ -611,25 +496,20 @@ static int pxa_ssp_hw_params(struct
>> snd_pcm_substream *substream,
>> struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
>> struct ssp_priv *priv = cpu_dai->private_data;
>> struct ssp_device *ssp = priv->ssp;
>> - int dma = 0, chn = params_channels(params);
>> + int chn = params_channels(params);
>> u32 sscr0;
>> u32 sspsp;
>> int width = snd_pcm_format_physical_width(params_format(params));
>> int ttsa = ssp_read_reg(ssp, SSTSA) & 0xf;
>>
>> - /* select correct DMA params */
>> - if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
>> - dma = 1; /* capture DMA offset is 1,3 */
>> - /* 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.
>> - */
>
> Do you think the ttsa bit below is obvious enough to warrant removal
> of the above comment?
Yes, sorry. This is a nice comment, I removed it by accident.
>
>> - if (((chn == 2) && (ttsa != 1)) || (width == 32))
>> - dma += 2; /* 32-bit DMA offset is 2, 16-bit is 0 */
>> -
>> - cpu_dai->dma_data = ssp_dma_params[cpu_dai->id][dma];
>> + printk("%s\n", __func__);
>> + /* generate correct DMA params */
>> + if (cpu_dai->dma_data)
>> + kfree(cpu_dai->dma_data);
>>
>> - dev_dbg(&ssp->pdev->dev, "pxa_ssp_hw_params: dma %d\n", dma);
>> + cpu_dai->dma_data = ssp_get_dma_params(ssp,
>> + ((chn == 2) && (ttsa != 1)) || (width == 32),
>> + 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)
>> --
>> 1.6.0.4
>>
>
> regards
> Philipp
>
--
Cheers
- eric
More information about the Alsa-devel
mailing list