mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
ASoC: core: Init pcm runtime work early to avoid warnings
There are cases where we fail before we reach soc_new_pcm which would init the workqueue. When we fail we attempt to flush the queue which generates warnings from the workqueue subsystem when we have not inited the queue. Solution is to use a proxy function to get around this issue. Signed-off-by: Curtis Malainey <cujomalainey@chromium.org> Reviewed-by: Takashi Iwai <tiwai@suse.de> Link: https://lore.kernel.org/r/20191203173007.46504-1-cujomalainey@chromium.org Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
d5ee9108ad
commit
4bf2e385aa
@ -1150,6 +1150,7 @@ struct snd_soc_pcm_runtime {
|
||||
unsigned int num_codecs;
|
||||
|
||||
struct delayed_work delayed_work;
|
||||
void (*close_delayed_work_func)(struct snd_soc_pcm_runtime *rtd);
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *debugfs_dpcm_root;
|
||||
#endif
|
||||
|
@ -214,10 +214,8 @@ be_err:
|
||||
* This is to ensure there are no pops or clicks in between any music tracks
|
||||
* due to DAPM power cycling.
|
||||
*/
|
||||
static void close_delayed_work(struct work_struct *work)
|
||||
static void close_delayed_work(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd =
|
||||
container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
|
||||
struct snd_soc_dai *codec_dai = rtd->codec_dai;
|
||||
|
||||
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
|
||||
@ -929,7 +927,7 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
|
||||
}
|
||||
|
||||
/* DAPM dai link stream work */
|
||||
INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
|
||||
rtd->close_delayed_work_func = close_delayed_work;
|
||||
|
||||
rtd->compr = compr;
|
||||
compr->private_data = rtd;
|
||||
|
@ -435,6 +435,15 @@ static void soc_free_pcm_runtime(struct snd_soc_pcm_runtime *rtd)
|
||||
device_unregister(rtd->dev);
|
||||
}
|
||||
|
||||
static void close_delayed_work(struct work_struct *work) {
|
||||
struct snd_soc_pcm_runtime *rtd =
|
||||
container_of(work, struct snd_soc_pcm_runtime,
|
||||
delayed_work.work);
|
||||
|
||||
if (rtd->close_delayed_work_func)
|
||||
rtd->close_delayed_work_func(rtd);
|
||||
}
|
||||
|
||||
static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
|
||||
struct snd_soc_card *card, struct snd_soc_dai_link *dai_link)
|
||||
{
|
||||
@ -470,6 +479,7 @@ static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
|
||||
|
||||
rtd->dev = dev;
|
||||
dev_set_drvdata(dev, rtd);
|
||||
INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
|
||||
|
||||
/*
|
||||
* for rtd->codec_dais
|
||||
|
@ -637,10 +637,8 @@ out:
|
||||
* This is to ensure there are no pops or clicks in between any music tracks
|
||||
* due to DAPM power cycling.
|
||||
*/
|
||||
static void close_delayed_work(struct work_struct *work)
|
||||
static void close_delayed_work(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd =
|
||||
container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
|
||||
struct snd_soc_dai *codec_dai = rtd->codec_dais[0];
|
||||
|
||||
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
|
||||
@ -660,7 +658,7 @@ static void close_delayed_work(struct work_struct *work)
|
||||
mutex_unlock(&rtd->card->pcm_mutex);
|
||||
}
|
||||
|
||||
static void codec2codec_close_delayed_work(struct work_struct *work)
|
||||
static void codec2codec_close_delayed_work(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
/*
|
||||
* Currently nothing to do for c2c links
|
||||
@ -2974,10 +2972,9 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
|
||||
|
||||
/* DAPM dai link stream work */
|
||||
if (rtd->dai_link->params)
|
||||
INIT_DELAYED_WORK(&rtd->delayed_work,
|
||||
codec2codec_close_delayed_work);
|
||||
rtd->close_delayed_work_func = codec2codec_close_delayed_work;
|
||||
else
|
||||
INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
|
||||
rtd->close_delayed_work_func = close_delayed_work;
|
||||
|
||||
pcm->nonatomic = rtd->dai_link->nonatomic;
|
||||
rtd->pcm = pcm;
|
||||
|
Loading…
Reference in New Issue
Block a user