summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorJorge Eduardo Candelaria <jorge.candelaria@ti.com>2010-04-28 17:50:46 -0500
committerJorge Eduardo Candelaria <jorge.candelaria@ti.com>2010-06-17 18:26:59 -0500
commit2e05b159360f8d80c7ce1e78fc9556a4f0733066 (patch)
tree4e21afe275e35f307646046700a4a3e35ec80cbb /sound
parenta79d629828ef4fd9ae34ba9cb7137c6ecacd13f7 (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.c45
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