diff options
author | Jorge Eduardo Candelaria <jorge.candelaria@ti.com> | 2010-04-28 17:50:46 -0500 |
---|---|---|
committer | Jorge Eduardo Candelaria <jorge.candelaria@ti.com> | 2010-06-17 18:26:59 -0500 |
commit | 2e05b159360f8d80c7ce1e78fc9556a4f0733066 (patch) | |
tree | 4e21afe275e35f307646046700a4a3e35ec80cbb /sound | |
parent | a79d629828ef4fd9ae34ba9cb7137c6ecacd13f7 (diff) |
ASoC: ABE: Support for mono playback
Some mono samples at specific rates were played at 2x speed. Adding
support for 1 channel on ABE fixes this issue.
Signed-off-by: Jorge Eduardo Candelaria <jorge.candelaria@ti.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/codecs/abe-twl6040.c | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/sound/soc/codecs/abe-twl6040.c b/sound/soc/codecs/abe-twl6040.c index f82177618108..6bea27055c27 100644 --- a/sound/soc/codecs/abe-twl6040.c +++ b/sound/soc/codecs/abe-twl6040.c @@ -1150,6 +1150,7 @@ static int abe_mm_hw_params(struct snd_pcm_substream *substream, struct twl6040_data *priv = codec->private_data; u8 lppllctl; int rate; + int channels; unsigned int sysclk; abe_data_format_t format; abe_dma_t dma_sink; @@ -1172,13 +1173,25 @@ static int abe_mm_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } + channels = params_channels(params); + switch (channels) { + case 1: + format.samp_format = MONO_MSB; + break; + case 2: + format.samp_format = STEREO_MSB; + break; + default: + dev_err(codec->dev, "%d channels not supported", channels); + return -EINVAL; + } + if (priv->pll == TWL6040_LPPLL_ID) { priv->sysclk = sysclk; twl6040_write(codec, TWL6040_REG_LPPLLCTL, lppllctl); } format.f = rate; - format.samp_format = STEREO_MSB; if (!substream->stream) abe_connect_cbpr_dmareq_port(MM_DL_PORT, &format, ABE_CBPR0_IDX, &dma_sink); else @@ -1260,6 +1273,7 @@ static int abe_tones_hw_params(struct snd_pcm_substream *substream, struct twl6040_data *priv = codec->private_data; u8 lppllctl; int rate; + int channels; unsigned int sysclk; abe_data_format_t format; abe_dma_t dma_sink; @@ -1282,13 +1296,25 @@ static int abe_tones_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } + channels = params_channels(params); + switch (channels) { + case 1: + format.samp_format = MONO_MSB; + break; + case 2: + format.samp_format = STEREO_MSB; + break; + default: + dev_err(codec->dev, "%d channels not supported", channels); + return -EINVAL; + } + if (priv->pll == TWL6040_LPPLL_ID) { priv->sysclk = sysclk; twl6040_write(codec, TWL6040_REG_LPPLLCTL, lppllctl); } format.f = rate; - format.samp_format = STEREO_MSB; if (!substream->stream) abe_connect_cbpr_dmareq_port(TONES_DL_PORT, &format, ABE_CBPR5_IDX, &dma_sink); @@ -1347,6 +1373,7 @@ static int abe_voice_hw_params(struct snd_pcm_substream *substream, struct twl6040_data *priv = codec->private_data; u8 lppllctl; int rate; + int channels; abe_data_format_t format; abe_dma_t dma_sink; @@ -1367,8 +1394,20 @@ static int abe_voice_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } + channels = params_channels(params); + switch (channels) { + case 1: + format.samp_format = MONO_MSB; + break; + case 2: + format.samp_format = STEREO_MSB; + break; + default: + dev_err(codec->dev, "%d channels not supported", channels); + return -EINVAL; + } + format.f = rate; - format.samp_format = STEREO_MSB; if (!substream->stream) abe_connect_cbpr_dmareq_port(VX_DL_PORT, &format, ABE_CBPR1_IDX, &dma_sink); else |