All of lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: Lars-Peter Clausen <lars@metafoo.de>
Cc: Simon <horms@verge.net.au>,
	Linux-ALSA <alsa-devel@alsa-project.org>,
	Mark Brown <broonie@kernel.org>,
	Liam Girdwood <lgirdwood@gmail.com>,
	Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Subject: Re: [PATCH 4/4] ASoC: soc-core: call snd_soc_remove_card() when component del
Date: Mon, 09 Feb 2015 14:07:21 +0100	[thread overview]
Message-ID: <s5hpp9jtera.wl-tiwai@suse.de> (raw)
In-Reply-To: <54D8994A.5090906@metafoo.de>

At Mon, 09 Feb 2015 12:26:02 +0100,
Lars-Peter Clausen wrote:
> 
> On 02/09/2015 11:48 AM, Takashi Iwai wrote:
> > At Mon, 9 Feb 2015 08:52:49 +0000,
> > Kuninori Morimoto wrote:
> >>
> >> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> >>
> >> ASoC devices are organized as CPU-CARD-CODEC. Then, CPU/CODEC
> >> are based on component structure. Now, each CARD device knows
> >> connected component. But CARD doesn't notice if connected component
> >> was removed when user called rmmod or unbind in current implementation.
> >> Thus, CARD which lost some components still exist in system.
> >> And then, ALSA sound card will have some problem if user used this CARD
> >> in such timing. This patch temporarily removes CARD from system
> >> if connected component was removed, and re-add it if some component
> >> was added.
> >>
> >> Reported-by: Nguyen Viet Dung <nv-dung@jinso.co.jp>
> >> Reported-by: Bui Duc Phuc <bd-phuc@jinso.co.jp>
> >> Reported-by: Cao Minh Hiep <cm-hiep@jinso.co.jp>
> >> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> >> ---
> >>   include/sound/soc.h  |    1 +
> >>   sound/soc/soc-core.c |   26 ++++++++++++++++++++++++++
> >>   2 files changed, 27 insertions(+)
> >>
> >> diff --git a/include/sound/soc.h b/include/sound/soc.h
> >> index b4fca9a..a90eff4 100644
> >> --- a/include/sound/soc.h
> >> +++ b/include/sound/soc.h
> >> @@ -1083,6 +1083,7 @@ struct snd_soc_card {
> >>   	struct list_head paths;
> >>   	struct list_head dapm_list;
> >>   	struct list_head dapm_dirty;
> >> +	struct list_head unbinded_list;
> >>
> >>   	/* Generic DAPM context for the card */
> >>   	struct snd_soc_dapm_context dapm;
> >> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> >> index b7ab676..f8d5498 100644
> >> --- a/sound/soc/soc-core.c
> >> +++ b/sound/soc/soc-core.c
> >> @@ -56,6 +56,7 @@ static DEFINE_MUTEX(client_mutex);
> >>   static LIST_HEAD(platform_list);
> >>   static LIST_HEAD(codec_list);
> >>   static LIST_HEAD(component_list);
> >> +static LIST_HEAD(unbinded_card_list);
> >>
> >>   /*
> >>    * This is a timeout to do a DAPM powerdown after a stream is closed().
> >> @@ -2406,6 +2407,10 @@ int snd_soc_unregister_card(struct snd_soc_card *card)
> >>   		dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name);
> >>   	}
> >>
> >> +	mutex_lock(&client_mutex);
> >> +	list_del(&card->unbinded_list);
> >> +	mutex_unlock(&client_mutex);
> >> +
> >>   	return 0;
> >>   }
> >>   EXPORT_SYMBOL_GPL(snd_soc_unregister_card);
> >> @@ -2669,6 +2674,9 @@ EXPORT_SYMBOL_GPL(snd_soc_component_exit_regmap);
> >>
> >>   static void snd_soc_component_add_unlocked(struct snd_soc_component *component)
> >>   {
> >> +	struct snd_soc_card *card, *_card;
> >> +	int ret;
> >> +
> >>   	if (!component->write && !component->read) {
> >>   		if (!component->regmap)
> >>   			component->regmap = dev_get_regmap(component->dev, NULL);
> >> @@ -2677,6 +2685,16 @@ static void snd_soc_component_add_unlocked(struct snd_soc_component *component)
> >>   	}
> >>
> >>   	list_add(&component->list, &component_list);
> >> +
> >> +	/* re-add temporarily removed card if exist */
> >> +	list_for_each_entry_safe(card, _card, &unbinded_card_list,
> >> +				 unbinded_list) {
> >> +		ret = snd_soc_instantiate_card(card);
> >> +		if (ret < 0)
> >> +			continue;
> >> +
> >> +		list_del(&card->unbinded_list);
> >> +	}
> >
> > [Cc'ed Lars-Peter]
> >
> > This would instantiate a card even if it's irrelevant with the given
> > component?  If so, it looks fragile, and possibly racy, when there are
> > multiple cards.
> 
> That shouldn't be a problem. snd_soc_instantiate_card() does the proper 
> locking and will return an error if not all components are ready yet.

But there is no check of card->instantiated there, so the whole path
can be called again even if the card was already instantiated?


Takashi

  reply	other threads:[~2015-02-09 13:07 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-09  8:51 [PATCH 0/4 v3] ASoC: rsnd: tidyup .remove method Kuninori Morimoto
2015-02-09  8:52 ` [PATCH 1/4] ASoC: soc-core: add snd_soc_remove_card() Kuninori Morimoto
2015-02-09  8:52 ` [PATCH 2/4] ASoC: soc-core: deactivate pins in snd_soc_instantiate_card() Kuninori Morimoto
2015-02-09  8:52 ` [PATCH 3/4] ASoC: soc-core: call soc_cleanup_card_debugfs() from snd_soc_unregister_card() Kuninori Morimoto
2015-02-09  8:52 ` [PATCH 4/4] ASoC: soc-core: call snd_soc_remove_card() when component del Kuninori Morimoto
2015-02-09 10:48   ` Takashi Iwai
2015-02-09 11:26     ` Lars-Peter Clausen
2015-02-09 13:07       ` Takashi Iwai [this message]
2015-02-09 13:09         ` Lars-Peter Clausen
2015-02-09 13:35           ` Takashi Iwai
2015-02-09 14:11             ` Lars-Peter Clausen
2015-02-10  0:44       ` Kuninori Morimoto
2015-02-10 12:28         ` Lars-Peter Clausen
2015-02-13  0:24           ` Kuninori Morimoto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=s5hpp9jtera.wl-tiwai@suse.de \
    --to=tiwai@suse.de \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=horms@verge.net.au \
    --cc=kuninori.morimoto.gx@renesas.com \
    --cc=lars@metafoo.de \
    --cc=lgirdwood@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.