summaryrefslogtreecommitdiff
path: root/sound/soc/soc-pcm.c
diff options
context:
space:
mode:
authorBenoit Cousson <bcousson@baylibre.com>2014-07-09 01:19:38 +0400
committerMark Brown <broonie@linaro.org>2014-07-17 02:06:27 +0400
commit93e6958a3674d2fa42e2c24ad5156e65da1d8621 (patch)
tree15b50754451784b8c65707975cfbebe304bf8bb6 /sound/soc/soc-pcm.c
parent8151d5e60232d31f35e04f4e49a5b0d98b00a737 (diff)
downloadlinux-93e6958a3674d2fa42e2c24ad5156e65da1d8621.tar.xz
ASoC: pcm: Add soc_dai_hw_params helper
Add a function helper to factorize the hw_params code. Suggested by Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Benoit Cousson <bcousson@baylibre.com> Tested-by: Lars-Peter Clausen <lars@metafoo.de> Reviewed-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound/soc/soc-pcm.c')
-rw-r--r--sound/soc/soc-pcm.c43
1 files changed, 24 insertions, 19 deletions
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index ec56d1831a86..3ec87d8aa181 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -789,6 +789,24 @@ static void soc_pcm_codec_params_fixup(struct snd_pcm_hw_params *params,
interval->max = channels;
}
+int soc_dai_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params,
+ struct snd_soc_dai *dai)
+{
+ int ret;
+
+ if (dai->driver->ops && dai->driver->ops->hw_params) {
+ ret = dai->driver->ops->hw_params(substream, params, dai);
+ if (ret < 0) {
+ dev_err(dai->dev, "ASoC: can't set %s hw params: %d\n",
+ dai->name, ret);
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
/*
* Called by ALSA when the hardware params are set by application. This
* function can also be called multiple times and can allocate buffers
@@ -832,17 +850,9 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
soc_pcm_codec_params_fixup(&codec_params,
codec_dai->rx_mask);
- if (codec_dai->driver->ops &&
- codec_dai->driver->ops->hw_params) {
- ret = codec_dai->driver->ops->hw_params(substream,
- &codec_params, codec_dai);
- if (ret < 0) {
- dev_err(codec_dai->dev,
- "ASoC: can't set %s hw params: %d\n",
- codec_dai->name, ret);
- goto codec_err;
- }
- }
+ ret = soc_dai_hw_params(substream, &codec_params, codec_dai);
+ if(ret < 0)
+ goto codec_err;
codec_dai->rate = params_rate(&codec_params);
codec_dai->channels = params_channels(&codec_params);
@@ -850,14 +860,9 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
params_format(&codec_params));
}
- if (cpu_dai->driver->ops && cpu_dai->driver->ops->hw_params) {
- ret = cpu_dai->driver->ops->hw_params(substream, params, cpu_dai);
- if (ret < 0) {
- dev_err(cpu_dai->dev, "ASoC: %s hw params failed: %d\n",
- cpu_dai->name, ret);
- goto interface_err;
- }
- }
+ ret = soc_dai_hw_params(substream, params, cpu_dai);
+ if (ret < 0)
+ goto interface_err;
if (platform->driver->ops && platform->driver->ops->hw_params) {
ret = platform->driver->ops->hw_params(substream, params);