diff options
author | Benoit Cousson <bcousson@baylibre.com> | 2014-07-08 17:19:38 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-07-16 18:06:27 -0400 |
commit | 93e6958a3674d2fa42e2c24ad5156e65da1d8621 (patch) | |
tree | 15b50754451784b8c65707975cfbebe304bf8bb6 | |
parent | 8151d5e60232d31f35e04f4e49a5b0d98b00a737 (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.h | 4 | ||||
-rw-r--r-- | sound/soc/soc-dapm.c | 28 | ||||
-rw-r--r-- | sound/soc/soc-pcm.c | 43 |
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, | |||
436 | int snd_soc_platform_trigger(struct snd_pcm_substream *substream, | 436 | int 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 | ||
439 | int 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 */ |
440 | int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type, | 444 | int 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 | ||
792 | int 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); |