summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sound/soc/imx/imx-3stack-cs42888.c50
1 files changed, 41 insertions, 9 deletions
diff --git a/sound/soc/imx/imx-3stack-cs42888.c b/sound/soc/imx/imx-3stack-cs42888.c
index 4d91be6effca..71f7e7403958 100644
--- a/sound/soc/imx/imx-3stack-cs42888.c
+++ b/sound/soc/imx/imx-3stack-cs42888.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
@@ -26,6 +26,7 @@
#include <sound/soc-dapm.h>
#include <sound/initval.h>
#include <sound/soc-dai.h>
+#include <sound/pcm_params.h>
#include <mach/hardware.h>
#include <mach/clock.h>
@@ -64,6 +65,41 @@ struct asrc_esai {
static struct asrc_esai asrc_esai_data;
+static int get_format_width(struct snd_pcm_hw_params *params)
+{
+ switch (params_format(params)) {
+ case SNDRV_PCM_FORMAT_S8:
+ case SNDRV_PCM_FORMAT_U8:
+ return 8;
+
+ case SNDRV_PCM_FORMAT_U16:
+ case SNDRV_PCM_FORMAT_S16_LE:
+ case SNDRV_PCM_FORMAT_S16_BE:
+ return 16;
+
+ case SNDRV_PCM_FORMAT_S20_3LE:
+ case SNDRV_PCM_FORMAT_S20_3BE:
+ case SNDRV_PCM_FORMAT_S24_3LE:
+ case SNDRV_PCM_FORMAT_S24_3BE:
+ case SNDRV_PCM_FORMAT_S24_BE:
+ case SNDRV_PCM_FORMAT_S24_LE:
+ case SNDRV_PCM_FORMAT_U24_BE:
+ case SNDRV_PCM_FORMAT_U24_LE:
+ case SNDRV_PCM_FORMAT_U24_3BE:
+ case SNDRV_PCM_FORMAT_U24_3LE:
+ return 24;
+
+ case SNDRV_PCM_FORMAT_S32:
+ case SNDRV_PCM_FORMAT_U32:
+ return 32;
+
+ default:
+ return 0;
+ }
+
+ return 0;
+}
+
#endif
struct imx_3stack_pcm_state {
@@ -84,10 +120,6 @@ static int imx_3stack_startup(struct snd_pcm_substream *substream)
struct snd_soc_dai *codec_dai = pcm_link->codec_dai;
asrc_esai_data.cpu_dai_rates = cpu_dai->playback.rates;
asrc_esai_data.codec_dai_rates = codec_dai->playback.rates;
- cpu_dai->playback.rates =
- SNDRV_PCM_RATE_8000_192000 | SNDRV_PCM_RATE_KNOT;
- codec_dai->playback.rates =
- SNDRV_PCM_RATE_8000_192000 | SNDRV_PCM_RATE_KNOT;
}
#endif
@@ -134,7 +166,7 @@ static int imx_3stack_surround_hw_params(struct snd_pcm_substream *substream,
unsigned int asrc_input_rate = rate;
struct mxc_runtime_data *pcm_data =
substream->runtime->private_data;
- struct asrc_config config;
+ struct asrc_config config = {0};
int retVal = 0;;
retVal = asrc_req_pair(channel, &asrc_esai_data.asrc_index);
@@ -148,7 +180,7 @@ static int imx_3stack_surround_hw_params(struct snd_pcm_substream *substream,
config.input_sample_rate = asrc_input_rate;
config.output_sample_rate = asrc_esai_data.output_sample_rate;
config.inclk = INCLK_NONE;
- config.word_width = 32;
+ config.word_width = get_format_width(params);
config.outclk = OUTCLK_ESAI_TX;
retVal = asrc_config_pair(&config);
if (retVal < 0) {
@@ -277,7 +309,7 @@ static int asrc_set_rate(struct snd_kcontrol *kcontrol,
return 0;
asrc_func = ucontrol->value.enumerated.item[0];
- asrc_esai_data.output_sample_rate = asrc_rates[asrc_func + 4];
+ asrc_esai_data.output_sample_rate = asrc_rates[asrc_func];
return 1;
}
@@ -301,7 +333,7 @@ static int imx_3stack_cs42888_init(struct snd_soc_codec *codec)
if (ret < 0)
return ret;
}
- asrc_esai_data.output_sample_rate = asrc_rates[asrc_func + 4];
+ asrc_esai_data.output_sample_rate = asrc_rates[asrc_func];
#endif
snd_soc_dapm_new_controls(codec, imx_3stack_dapm_widgets,