diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-04-26 19:12:21 +0100 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-04-27 18:38:32 +0100 |
commit | 9747cec21e2d55ee996249b01ec30dd32389c0ba (patch) | |
tree | ecda4e95a91430cc538e312f9083dfa0a6248736 /sound/soc/soc-dapm.c | |
parent | 3a334adab04e60f2bfc449721aaad289a72ce9cc (diff) |
ASoC: dapm: Move CODEC<->CODEC params off stack
Reduce our stack consumption by moving the params off the stack, they
are reasonably large and might be an issue on platforms with small stacks.
Reported-by: Liam Girdwood <lrg@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Ackeded-by: Liam Girdwood <lrg@ti.com>
Diffstat (limited to 'sound/soc/soc-dapm.c')
-rw-r--r-- | sound/soc/soc-dapm.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 02db2c09076b..3f12f481aa7e 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c @@ -2989,7 +2989,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w, struct snd_soc_dai *source, *sink; const struct snd_soc_pcm_stream *config = w->params; struct snd_pcm_substream substream; - struct snd_pcm_hw_params params; + struct snd_pcm_hw_params *params = NULL; u64 fmt; int ret; @@ -3019,17 +3019,21 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w, } /* Currently very limited parameter selection */ - memset(¶ms, 0, sizeof(params)); - snd_mask_set(hw_param_mask(¶ms, SNDRV_PCM_HW_PARAM_FORMAT), fmt); + params = kzalloc(sizeof(*params), GFP_KERNEL); + if (!params) { + ret = -ENOMEM; + goto out; + } + snd_mask_set(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), fmt); - hw_param_interval(¶ms, SNDRV_PCM_HW_PARAM_RATE)->min = + hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE)->min = config->rate_min; - hw_param_interval(¶ms, SNDRV_PCM_HW_PARAM_RATE)->max = + hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE)->max = config->rate_max; - hw_param_interval(¶ms, SNDRV_PCM_HW_PARAM_CHANNELS)->min + hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS)->min = config->channels_min; - hw_param_interval(¶ms, SNDRV_PCM_HW_PARAM_CHANNELS)->max + hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS)->max = config->channels_max; memset(&substream, 0, sizeof(substream)); @@ -3039,22 +3043,22 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w, if (source->driver->ops && source->driver->ops->hw_params) { substream.stream = SNDRV_PCM_STREAM_CAPTURE; ret = source->driver->ops->hw_params(&substream, - ¶ms, source); + params, source); if (ret != 0) { dev_err(source->dev, "hw_params() failed: %d\n", ret); - return ret; + goto out; } } if (sink->driver->ops && sink->driver->ops->hw_params) { substream.stream = SNDRV_PCM_STREAM_PLAYBACK; - ret = sink->driver->ops->hw_params(&substream, ¶ms, + ret = sink->driver->ops->hw_params(&substream, params, sink); if (ret != 0) { dev_err(sink->dev, "hw_params() failed: %d\n", ret); - return ret; + goto out; } } break; @@ -3063,12 +3067,14 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w, ret = snd_soc_dai_digital_mute(sink, 0); if (ret != 0 && ret != -ENOTSUPP) dev_warn(sink->dev, "Failed to unmute: %d\n", ret); + ret = 0; break; case SND_SOC_DAPM_PRE_PMD: ret = snd_soc_dai_digital_mute(sink, 1); if (ret != 0 && ret != -ENOTSUPP) dev_warn(sink->dev, "Failed to mute: %d\n", ret); + ret = 0; break; default: @@ -3076,7 +3082,9 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w, return -EINVAL; } - return 0; +out: + kfree(params); + return ret; } int snd_soc_dapm_new_pcm(struct snd_soc_card *card, |