[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