| From 8ce1cbd6ce0b1bda0c980c64fee4c1e1378355f1 Mon Sep 17 00:00:00 2001 |
| From: Jaroslav Kysela <perex@perex.cz> |
| Date: Wed, 22 Jan 2020 20:07:52 +0100 |
| Subject: ASoC: topology: fix soc_tplg_fe_link_create() - link->dobj initialization order |
| |
| From: Jaroslav Kysela <perex@perex.cz> |
| |
| commit 8ce1cbd6ce0b1bda0c980c64fee4c1e1378355f1 upstream. |
| |
| The code which checks the return value for snd_soc_add_dai_link() call |
| in soc_tplg_fe_link_create() moved the snd_soc_add_dai_link() call before |
| link->dobj members initialization. |
| |
| While it does not affect the latest kernels, the old soc-core.c code |
| in the stable kernels is affected. The snd_soc_add_dai_link() function uses |
| the link->dobj.type member to check, if the link structure is valid. |
| |
| Reorder the link->dobj initialization to make things work again. |
| It's harmless for the recent code (and the structure should be properly |
| initialized before other calls anyway). |
| |
| The problem is in stable linux-5.4.y since version 5.4.11 when the |
| upstream commit 76d270364932 was applied. |
| |
| Fixes: 76d270364932 ("ASoC: topology: Check return value for snd_soc_add_dai_link()") |
| Cc: Dragos Tarcatu <dragos_tarcatu@mentor.com> |
| Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Cc: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> |
| Cc: Mark Brown <broonie@kernel.org> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Jaroslav Kysela <perex@perex.cz> |
| Link: https://lore.kernel.org/r/20200122190752.3081016-1-perex@perex.cz |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/soc/soc-topology.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| --- a/sound/soc/soc-topology.c |
| +++ b/sound/soc/soc-topology.c |
| @@ -1906,6 +1906,10 @@ static int soc_tplg_fe_link_create(struc |
| link->num_codecs = 1; |
| link->num_platforms = 1; |
| |
| + link->dobj.index = tplg->index; |
| + link->dobj.ops = tplg->ops; |
| + link->dobj.type = SND_SOC_DOBJ_DAI_LINK; |
| + |
| if (strlen(pcm->pcm_name)) { |
| link->name = kstrdup(pcm->pcm_name, GFP_KERNEL); |
| link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL); |
| @@ -1942,9 +1946,6 @@ static int soc_tplg_fe_link_create(struc |
| goto err; |
| } |
| |
| - link->dobj.index = tplg->index; |
| - link->dobj.ops = tplg->ops; |
| - link->dobj.type = SND_SOC_DOBJ_DAI_LINK; |
| list_add(&link->dobj.list, &tplg->comp->dobj_list); |
| |
| return 0; |