mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 09:59:32 +00:00
ASoC: soc-pcm: add soc_hw_sanity_check()
Current soc_pcm_open() is checking runtime->hw parameters, but having such function is very helpful for reading code. This patch adds new soc_hw_sanity_check() and checks runtime->hw parameters there. And print its debug message there, too. Debug message print out timing is exchanged after this patch, but it is not a big deal, because it is for debug. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Link: https://lore.kernel.org/r/87eegpuob1.wl-kuninori.morimoto.gx@renesas.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
68cbc55737
commit
c393281a3c
1 changed files with 40 additions and 27 deletions
|
@ -689,6 +689,44 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
|
|||
return soc_pcm_clean(substream, 0);
|
||||
}
|
||||
|
||||
static int soc_hw_sanity_check(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_pcm_hardware *hw = &substream->runtime->hw;
|
||||
const char *name_cpu = soc_cpu_dai_name(rtd);
|
||||
const char *name_codec = soc_codec_dai_name(rtd);
|
||||
const char *err_msg;
|
||||
struct device *dev = rtd->dev;
|
||||
|
||||
err_msg = "rates";
|
||||
if (!hw->rates)
|
||||
goto config_err;
|
||||
|
||||
err_msg = "formats";
|
||||
if (!hw->formats)
|
||||
goto config_err;
|
||||
|
||||
err_msg = "channels";
|
||||
if (!hw->channels_min || !hw->channels_max ||
|
||||
hw->channels_min > hw->channels_max)
|
||||
goto config_err;
|
||||
|
||||
dev_dbg(dev, "ASoC: %s <-> %s info:\n", name_codec,
|
||||
name_cpu);
|
||||
dev_dbg(dev, "ASoC: rate mask 0x%x\n", hw->rates);
|
||||
dev_dbg(dev, "ASoC: ch min %d max %d\n", hw->channels_min,
|
||||
hw->channels_max);
|
||||
dev_dbg(dev, "ASoC: rate min %d max %d\n", hw->rate_min,
|
||||
hw->rate_max);
|
||||
|
||||
return 0;
|
||||
|
||||
config_err:
|
||||
dev_err(dev, "ASoC: %s <-> %s No matching %s\n",
|
||||
name_codec, name_cpu, err_msg);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called by ALSA when a PCM substream is opened, the runtime->hw record is
|
||||
* then initialized and any private data can be allocated. This also calls
|
||||
|
@ -697,11 +735,8 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
|
|||
static int soc_pcm_open(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_component *component;
|
||||
struct snd_soc_dai *dai;
|
||||
const char *codec_dai_name = soc_codec_dai_name(rtd);
|
||||
const char *cpu_dai_name = soc_cpu_dai_name(rtd);
|
||||
int i, ret = 0;
|
||||
|
||||
for_each_rtd_components(rtd, i, component)
|
||||
|
@ -742,23 +777,9 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
|
|||
|
||||
soc_pcm_update_symmetry(substream);
|
||||
|
||||
ret = -EINVAL;
|
||||
if (!runtime->hw.rates) {
|
||||
printk(KERN_ERR "ASoC: %s <-> %s No matching rates\n",
|
||||
codec_dai_name, cpu_dai_name);
|
||||
ret = soc_hw_sanity_check(substream);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
}
|
||||
if (!runtime->hw.formats) {
|
||||
printk(KERN_ERR "ASoC: %s <-> %s No matching formats\n",
|
||||
codec_dai_name, cpu_dai_name);
|
||||
goto err;
|
||||
}
|
||||
if (!runtime->hw.channels_min || !runtime->hw.channels_max ||
|
||||
runtime->hw.channels_min > runtime->hw.channels_max) {
|
||||
printk(KERN_ERR "ASoC: %s <-> %s No matching channels\n",
|
||||
codec_dai_name, cpu_dai_name);
|
||||
goto err;
|
||||
}
|
||||
|
||||
soc_pcm_apply_msb(substream);
|
||||
|
||||
|
@ -768,14 +789,6 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
|
|||
if (ret != 0)
|
||||
goto err;
|
||||
}
|
||||
|
||||
pr_debug("ASoC: %s <-> %s info:\n",
|
||||
codec_dai_name, cpu_dai_name);
|
||||
pr_debug("ASoC: rate mask 0x%x\n", runtime->hw.rates);
|
||||
pr_debug("ASoC: min ch %d max ch %d\n", runtime->hw.channels_min,
|
||||
runtime->hw.channels_max);
|
||||
pr_debug("ASoC: min rate %d max rate %d\n", runtime->hw.rate_min,
|
||||
runtime->hw.rate_max);
|
||||
dynamic:
|
||||
snd_soc_runtime_activate(rtd, substream->stream);
|
||||
ret = 0;
|
||||
|
|
Loading…
Reference in a new issue