From: Mark Brown <broonie@opensource.wolfsonmicro.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: alsa-devel@alsa-project.org,
Mark Brown <broonie@opensource.wolfsonmicro.com>
Subject: [PATCH 16/18] ASoC: Initial framework for dynamic card instantiation
Date: Tue, 9 Dec 2008 14:01:40 +0000 [thread overview]
Message-ID: <1228831302-17605-16-git-send-email-broonie@opensource.wolfsonmicro.com> (raw)
In-Reply-To: <1228831302-17605-15-git-send-email-broonie@opensource.wolfsonmicro.com>
Use the lists of platforms, platform DAIs and cards to check to see that
everything has registered. Since relationships are still specified by
direct references to the structures in the drivers and the drivers all
register everything at modprobe there should be no practical effect yet.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
sound/soc/soc-core.c | 97 ++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 78 insertions(+), 19 deletions(-)
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index ffae370..717db0e 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -780,30 +780,54 @@ static int soc_resume(struct platform_device *pdev)
#define soc_resume NULL
#endif
-/* probes a new socdev */
-static int soc_probe(struct platform_device *pdev)
-{
- int ret = 0, i;
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_card *card = socdev->card;
- struct snd_soc_platform *platform = card->platform;
- struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
-
- /* Bodge while we push things out of socdev */
- card->socdev = socdev;
+static void snd_soc_instantiate_card(struct snd_soc_card *card)
+{
+ struct platform_device *pdev = container_of(card->dev,
+ struct platform_device,
+ dev);
+ struct snd_soc_codec_device *codec_dev = card->socdev->codec_dev;
+ struct snd_soc_platform *platform;
+ struct snd_soc_dai *dai;
+ int i, found, ret;
+
+ if (card->instantiated)
+ return;
+
+ found = 0;
+ list_for_each_entry(platform, &platform_list, list)
+ if (card->platform == platform) {
+ found = 1;
+ break;
+ }
+ if (!found) {
+ dev_dbg(card->dev, "Platform %s not registered\n",
+ card->platform->name);
+ return;
+ }
- /* Bodge while we unpick instantiation */
- card->dev = &pdev->dev;
- ret = snd_soc_register_card(card);
- if (ret != 0) {
- dev_err(&pdev->dev, "Failed to register card\n");
- return ret;
+ for (i = 0; i < card->num_links; i++) {
+ found = 0;
+ list_for_each_entry(dai, &dai_list, list)
+ if (card->dai_link[i].cpu_dai == dai) {
+ found = 1;
+ break;
+ }
+ if (!found) {
+ dev_dbg(card->dev, "DAI %s not registered\n",
+ card->dai_link[i].cpu_dai->name);
+ return;
+ }
}
+ /* Note that we do not current check for codec components */
+
+ dev_dbg(card->dev, "All components present, instantiating\n");
+
+ /* Found everything, bring it up */
if (card->probe) {
ret = card->probe(pdev);
if (ret < 0)
- return ret;
+ return;
}
for (i = 0; i < card->num_links; i++) {
@@ -834,7 +858,9 @@ static int soc_probe(struct platform_device *pdev)
INIT_WORK(&card->deferred_resume_work, soc_resume_deferred);
#endif
- return 0;
+ card->instantiated = 1;
+
+ return;
platform_err:
if (codec_dev->remove)
@@ -849,8 +875,38 @@ cpu_dai_err:
if (card->remove)
card->remove(pdev);
+}
- return ret;
+/*
+ * Attempt to initialise any uninitalised cards. Must be called with
+ * client_mutex.
+ */
+static void snd_soc_instantiate_cards(void)
+{
+ struct snd_soc_card *card;
+ list_for_each_entry(card, &card_list, list)
+ snd_soc_instantiate_card(card);
+}
+
+/* probes a new socdev */
+static int soc_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+ struct snd_soc_card *card = socdev->card;
+
+ /* Bodge while we push things out of socdev */
+ card->socdev = socdev;
+
+ /* Bodge while we unpick instantiation */
+ card->dev = &pdev->dev;
+ ret = snd_soc_register_card(card);
+ if (ret != 0) {
+ dev_err(&pdev->dev, "Failed to register card\n");
+ return ret;
+ }
+
+ return 0;
}
/* removes a socdev */
@@ -1994,6 +2050,7 @@ static int snd_soc_register_card(struct snd_soc_card *card)
mutex_lock(&client_mutex);
list_add(&card->list, &card_list);
+ snd_soc_instantiate_cards();
mutex_unlock(&client_mutex);
dev_dbg(card->dev, "Registered card '%s'\n", card->name);
@@ -2039,6 +2096,7 @@ int snd_soc_register_dai(struct snd_soc_dai *dai)
mutex_lock(&client_mutex);
list_add(&dai->list, &dai_list);
+ snd_soc_instantiate_cards();
mutex_unlock(&client_mutex);
pr_debug("Registered DAI '%s'\n", dai->name);
@@ -2117,6 +2175,7 @@ int snd_soc_register_platform(struct snd_soc_platform *platform)
mutex_lock(&client_mutex);
list_add(&platform->list, &platform_list);
+ snd_soc_instantiate_cards();
mutex_unlock(&client_mutex);
pr_debug("Registered platform '%s'\n", platform->name);
--
1.5.6.5
next prev parent reply other threads:[~2008-12-09 14:01 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-09 14:01 [PATCH 00/18] ASoC updates Mark Brown
2008-12-09 14:01 ` [PATCH 01/18] ASoC: TWL4030: Correct DAPM_DAC with power control Mark Brown
2008-12-09 14:01 ` [PATCH 02/18] ASoC: TWL4030: Add Analog PGA control switch to DAPM Mark Brown
2008-12-09 14:01 ` [PATCH 03/18] ASoC: TWL4030: Add DAPM event handler for output MUX selection Mark Brown
2008-12-09 14:01 ` [PATCH 04/18] ASoC: TWL4030: DAPM mapping of the Earpiece output Mark Brown
2008-12-09 14:01 ` [PATCH 05/18] ASoC: TWL4030: DAPM mapping of the PreDriv outputs Mark Brown
2008-12-09 14:01 ` [PATCH 06/18] ASoC: TWL4030: DAPM mapping of the Headset outputs Mark Brown
2008-12-09 14:01 ` [PATCH 07/18] ASoC: TWL4030: DAPM mapping of the Carkit outputs Mark Brown
2008-12-09 14:01 ` [PATCH 08/18] ASoC: TWL4030: DAPM mapping of the Handsfree outputs Mark Brown
2008-12-09 14:01 ` [PATCH 09/18] ASoC: TWL4030: Do not alter the Headset output volume on power-up/down Mark Brown
2008-12-09 14:01 ` [PATCH 10/18] ASoC: Add card registration API Mark Brown
2008-12-09 14:01 ` [PATCH 11/18] ASoC: Add DAI " Mark Brown
2008-12-09 14:01 ` [PATCH 12/18] ASoC: Register platform DAIs Mark Brown
2008-12-09 14:01 ` [PATCH 13/18] ASoC: Add platform registration API Mark Brown
2008-12-09 14:01 ` [PATCH 14/18] ASoC: Register platform drivers Mark Brown
2008-12-09 14:01 ` [PATCH 15/18] ASoC: Register non-AC97 codec DAIs Mark Brown
2008-12-09 14:01 ` Mark Brown [this message]
2008-12-09 14:01 ` [PATCH 17/18] ASoC: Wait for non-AC97 codec DAIs before instantiating Mark Brown
2008-12-09 14:01 ` [PATCH 18/18] ASoC: Convert WM8900 to allow registration by machine code Mark Brown
2008-12-09 14:38 ` [PATCH 14/18] ASoC: Register platform drivers Takashi Iwai
2008-12-09 14:40 ` [PATCH 12/18] ASoC: Register platform DAIs Takashi Iwai
2008-12-09 14:17 ` [PATCH 10/18] ASoC: Add card registration API Takashi Iwai
2008-12-09 14:24 ` Takashi Iwai
2008-12-10 8:27 ` [PATCH 06/18] ASoC: TWL4030: DAPM mapping of the Headset outputs stanley.miao
2008-12-10 9:19 ` Peter Ujfalusi
2008-12-09 14:39 ` [PATCH 00/18] ASoC updates Takashi Iwai
2008-12-09 15:01 ` Mark Brown
2008-12-09 15:03 ` [PATCH] ASoC: Fix typos in Atmel module registration Mark Brown
2008-12-09 15:06 ` [PATCH 00/18] ASoC updates Takashi Iwai
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=1228831302-17605-16-git-send-email-broonie@opensource.wolfsonmicro.com \
--to=broonie@opensource.wolfsonmicro.com \
--cc=alsa-devel@alsa-project.org \
--cc=tiwai@suse.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox