aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenoit Cousson <bcousson@baylibre.com>2014-07-08 17:19:38 -0400
committerMark Brown <broonie@linaro.org>2014-07-16 18:06:27 -0400
commit93e6958a3674d2fa42e2c24ad5156e65da1d8621 (patch)
tree15b50754451784b8c65707975cfbebe304bf8bb6
parent8151d5e60232d31f35e04f4e49a5b0d98b00a737 (diff)
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>
-rw-r--r--include/sound/soc.h4
-rw-r--r--sound/soc/soc-dapm.c28
-rw-r--r--sound/soc/soc-pcm.c43
3 files changed, 36 insertions, 39 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h
index f2142cf3f243..98555f833ab4 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -436,6 +436,10 @@ int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
436int snd_soc_platform_trigger(struct snd_pcm_substream *substream, 436int snd_soc_platform_trigger(struct snd_pcm_substream *substream,
437 int cmd, struct snd_soc_platform *platform); 437 int cmd, struct snd_soc_platform *platform);
438 438
439int soc_dai_hw_params(struct snd_pcm_substream *substream,
440 struct snd_pcm_hw_params *params,
441 struct snd_soc_dai *dai);
442
439/* Jack reporting */ 443/* Jack reporting */
440int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type, 444int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type,
441 struct snd_soc_jack *jack); 445 struct snd_soc_jack *jack);
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 5c63c3b49f3f..9a047f360993 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -3214,27 +3214,15 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
3214 3214
3215 switch (event) { 3215 switch (event) {
3216 case SND_SOC_DAPM_PRE_PMU: 3216 case SND_SOC_DAPM_PRE_PMU:
3217 if (source->driver->ops && source->driver->ops->hw_params) { 3217 substream.stream = SNDRV_PCM_STREAM_CAPTURE;
3218 substream.stream = SNDRV_PCM_STREAM_CAPTURE; 3218 ret = soc_dai_hw_params(&substream, params, source);
3219 ret = source->driver->ops->hw_params(&substream, 3219 if (ret < 0)
3220 params, source); 3220 goto out;
3221 if (ret != 0) {
3222 dev_err(source->dev,
3223 "ASoC: hw_params() failed: %d\n", ret);
3224 goto out;
3225 }
3226 }
3227 3221
3228 if (sink->driver->ops && sink->driver->ops->hw_params) { 3222 substream.stream = SNDRV_PCM_STREAM_PLAYBACK;
3229 substream.stream = SNDRV_PCM_STREAM_PLAYBACK; 3223 ret = soc_dai_hw_params(&substream, params, sink);
3230 ret = sink->driver->ops->hw_params(&substream, params, 3224 if (ret < 0)
3231 sink); 3225 goto out;
3232 if (ret != 0) {
3233 dev_err(sink->dev,
3234 "ASoC: hw_params() failed: %d\n", ret);
3235 goto out;
3236 }
3237 }
3238 break; 3226 break;
3239 3227
3240 case SND_SOC_DAPM_POST_PMU: 3228 case SND_SOC_DAPM_POST_PMU:
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,
789 interval->max = channels; 789 interval->max = channels;
790} 790}
791 791
792int soc_dai_hw_params(struct snd_pcm_substream *substream,
793 struct snd_pcm_hw_params *params,
794 struct snd_soc_dai *dai)
795{
796 int ret;
797
798 if (dai->driver->ops && dai->driver->ops->hw_params) {
799 ret = dai->driver->ops->hw_params(substream, params, dai);
800 if (ret < 0) {
801 dev_err(dai->dev, "ASoC: can't set %s hw params: %d\n",
802 dai->name, ret);
803 return ret;
804 }
805 }
806
807 return 0;
808}
809
792/* 810/*
793 * Called by ALSA when the hardware params are set by application. This 811 * Called by ALSA when the hardware params are set by application. This
794 * function can also be called multiple times and can allocate buffers 812 * 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,
832 soc_pcm_codec_params_fixup(&codec_params, 850 soc_pcm_codec_params_fixup(&codec_params,
833 codec_dai->rx_mask); 851 codec_dai->rx_mask);
834 852
835 if (codec_dai->driver->ops && 853 ret = soc_dai_hw_params(substream, &codec_params, codec_dai);
836 codec_dai->driver->ops->hw_params) { 854 if(ret < 0)
837 ret = codec_dai->driver->ops->hw_params(substream, 855 goto codec_err;
838 &codec_params, codec_dai);
839 if (ret < 0) {
840 dev_err(codec_dai->dev,
841 "ASoC: can't set %s hw params: %d\n",
842 codec_dai->name, ret);
843 goto codec_err;
844 }
845 }
846 856
847 codec_dai->rate = params_rate(&codec_params); 857 codec_dai->rate = params_rate(&codec_params);
848 codec_dai->channels = params_channels(&codec_params); 858 codec_dai->channels = params_channels(&codec_params);
@@ -850,14 +860,9 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
850 params_format(&codec_params)); 860 params_format(&codec_params));
851 } 861 }
852 862
853 if (cpu_dai->driver->ops && cpu_dai->driver->ops->hw_params) { 863 ret = soc_dai_hw_params(substream, params, cpu_dai);
854 ret = cpu_dai->driver->ops->hw_params(substream, params, cpu_dai); 864 if (ret < 0)
855 if (ret < 0) { 865 goto interface_err;
856 dev_err(cpu_dai->dev, "ASoC: %s hw params failed: %d\n",
857 cpu_dai->name, ret);
858 goto interface_err;
859 }
860 }
861 866
862 if (platform->driver->ops && platform->driver->ops->hw_params) { 867 if (platform->driver->ops && platform->driver->ops->hw_params) {
863 ret = platform->driver->ops->hw_params(substream, params); 868 ret = platform->driver->ops->hw_params(substream, params);