[alsa-devel] [PATCH] ASoC: davinci-mcasp: add support for unsigned PCM formats
Liam Girdwood
lrg at ti.com
Sun Aug 28 19:39:24 CEST 2011
On 26/08/11 17:02, Ben Gardiner wrote:
> Although the McASP supports sign-extending samples in RX or TX [1]; the
> davinci-mcasp driver does not touch the {R,X}PBIT or {R,X}PAD field of the
> {R,X}FMT registers meaning that the McASP will serialize the bytes it is given
> regardless of their signedness. So supporting unsigned formats is as simple
> as adding them to the metadata of the davinci-mcasp driver.
>
> Update the FMTBITs reported in the snd_soc_dai_driver and also update the case
> statements in davinci-mcasp's hw_params() function so that the McASP can be
> connected to CODECs that use unsigned values.
>
> [1] http://www.ti.com/lit/ug/sprufm1/sprufm1.pdf
>
> Signed-off-by: Ben Gardiner <bengardiner at nanometrics.ca>
Acked-by: Liam Girdwood <lrg at ti.com>
>
> ---
>
> Tested with a logic analyzer on da850evm where an unsigned 16bit codec was
> registered with the mcasp and a 16bit signed file was played to it. ALSA's
> plug pcm mapped to unsigned and the samples serialized as unsigned 16bit --
> as expected.
> ---
> sound/soc/davinci/davinci-mcasp.c | 20 +++++++++++++-------
> 1 files changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
> index 8566238..7173df2 100644
> --- a/sound/soc/davinci/davinci-mcasp.c
> +++ b/sound/soc/davinci/davinci-mcasp.c
> @@ -732,16 +732,19 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
> davinci_hw_param(dev, substream->stream);
>
> switch (params_format(params)) {
> + case SNDRV_PCM_FORMAT_U8:
> case SNDRV_PCM_FORMAT_S8:
> dma_params->data_type = 1;
> word_length = DAVINCI_AUDIO_WORD_8;
> break;
>
> + case SNDRV_PCM_FORMAT_U16_LE:
> case SNDRV_PCM_FORMAT_S16_LE:
> dma_params->data_type = 2;
> word_length = DAVINCI_AUDIO_WORD_16;
> break;
>
> + case SNDRV_PCM_FORMAT_U32_LE:
> case SNDRV_PCM_FORMAT_S32_LE:
> dma_params->data_type = 4;
> word_length = DAVINCI_AUDIO_WORD_32;
> @@ -818,6 +821,13 @@ static struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
>
> };
>
> +#define DAVINCI_MCASP_PCM_FMTS (SNDRV_PCM_FMTBIT_S8 | \
> + SNDRV_PCM_FMTBIT_U8 | \
> + SNDRV_PCM_FMTBIT_S16_LE | \
> + SNDRV_PCM_FMTBIT_U16_LE | \
> + SNDRV_PCM_FMTBIT_S32_LE | \
> + SNDRV_PCM_FMTBIT_U32_LE)
> +
> static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
> {
> .name = "davinci-mcasp.0",
> @@ -825,17 +835,13 @@ static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
> .channels_min = 2,
> .channels_max = 2,
> .rates = DAVINCI_MCASP_RATES,
> - .formats = SNDRV_PCM_FMTBIT_S8 |
> - SNDRV_PCM_FMTBIT_S16_LE |
> - SNDRV_PCM_FMTBIT_S32_LE,
> + .formats = DAVINCI_MCASP_PCM_FMTS,
> },
> .capture = {
> .channels_min = 2,
> .channels_max = 2,
> .rates = DAVINCI_MCASP_RATES,
> - .formats = SNDRV_PCM_FMTBIT_S8 |
> - SNDRV_PCM_FMTBIT_S16_LE |
> - SNDRV_PCM_FMTBIT_S32_LE,
> + .formats = DAVINCI_MCASP_PCM_FMTS,
> },
> .ops = &davinci_mcasp_dai_ops,
>
> @@ -846,7 +852,7 @@ static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
> .channels_min = 1,
> .channels_max = 384,
> .rates = DAVINCI_MCASP_RATES,
> - .formats = SNDRV_PCM_FMTBIT_S16_LE,
> + .formats = DAVINCI_MCASP_PCM_FMTS,
> },
> .ops = &davinci_mcasp_dai_ops,
> },
More information about the Alsa-devel
mailing list