Skip to content

Commit

Permalink
ASoC: pcm: Add soc_dai_hw_params helper
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Benoit Cousson authored and Mark Brown committed Jul 16, 2014
1 parent 8151d5e commit 93e6958
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 39 deletions.
4 changes: 4 additions & 0 deletions include/sound/soc.h
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,10 @@ int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
int snd_soc_platform_trigger(struct snd_pcm_substream *substream,
int cmd, struct snd_soc_platform *platform);

int soc_dai_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai);

/* Jack reporting */
int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type,
struct snd_soc_jack *jack);
Expand Down
28 changes: 8 additions & 20 deletions sound/soc/soc-dapm.c
Original file line number Diff line number Diff line change
Expand Up @@ -3214,27 +3214,15 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,

switch (event) {
case SND_SOC_DAPM_PRE_PMU:
if (source->driver->ops && source->driver->ops->hw_params) {
substream.stream = SNDRV_PCM_STREAM_CAPTURE;
ret = source->driver->ops->hw_params(&substream,
params, source);
if (ret != 0) {
dev_err(source->dev,
"ASoC: hw_params() failed: %d\n", ret);
goto out;
}
}
substream.stream = SNDRV_PCM_STREAM_CAPTURE;
ret = soc_dai_hw_params(&substream, params, source);
if (ret < 0)
goto out;

if (sink->driver->ops && sink->driver->ops->hw_params) {
substream.stream = SNDRV_PCM_STREAM_PLAYBACK;
ret = sink->driver->ops->hw_params(&substream, params,
sink);
if (ret != 0) {
dev_err(sink->dev,
"ASoC: hw_params() failed: %d\n", ret);
goto out;
}
}
substream.stream = SNDRV_PCM_STREAM_PLAYBACK;
ret = soc_dai_hw_params(&substream, params, sink);
if (ret < 0)
goto out;
break;

case SND_SOC_DAPM_POST_PMU:
Expand Down
43 changes: 24 additions & 19 deletions sound/soc/soc-pcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -832,32 +850,19 @@ 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);
codec_dai->sample_bits = snd_pcm_format_physical_width(
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);
Expand Down

0 comments on commit 93e6958

Please sign in to comment.