On Tue, 03 Sep 2019 10:00:22 +0200, Kuninori Morimoto wrote:
Hi ALSA ML
I got below error when I unbind/bind CPU DAI. It seems we need to have some kind of lock ?
No, this kind of error usually is due to the missing initialization of the lock object. In this case, the work hasn't been initialized before calling the flush_delayed_work().
I suppose it's an error path at snd_soc_bind_card(), and the patch like below might fix the issue.
Takashi
--- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -371,6 +371,7 @@ struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card, EXPORT_SYMBOL_GPL(snd_soc_get_dai_substream);
static const struct snd_soc_ops null_snd_soc_ops; +static void codec2codec_close_delayed_work(struct work_struct *work);
static struct snd_soc_pcm_runtime *soc_new_pcm_runtime( struct snd_soc_card *card, struct snd_soc_dai_link *dai_link) @@ -382,6 +383,7 @@ static struct snd_soc_pcm_runtime *soc_new_pcm_runtime( return NULL;
INIT_LIST_HEAD(&rtd->component_list); + INIT_DELAYED_WORK(&rtd->delayed_work, codec2codec_close_delayed_work); rtd->card = card; rtd->dai_link = dai_link; if (!rtd->dai_link->ops) @@ -1573,9 +1575,6 @@ static int soc_probe_link_dais(struct snd_soc_card *card, rtd->num_codecs, rtd); if (ret < 0) return ret; - } else { - INIT_DELAYED_WORK(&rtd->delayed_work, - codec2codec_close_delayed_work); }
return 0;