aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiam Girdwood <lrg@ti.com>2011-07-24 15:59:32 -0400
committerPaolo Pisati <paolo.pisati@canonical.com>2012-08-17 04:18:18 -0400
commitafd0cd82ca566e660792b5fa68172776fc0ff1df (patch)
treefb903a75e2c4367ca355e9470a69bb98be6b4aa7
parentfaa1dd914f94a4d0dc822f1a4a876260d34d6cf2 (diff)
Subject: [PATCH 032/104] ASoC: core - Make platform probe more like codec probe.
In preparation for ASoC dynamic PCM support (AKA ASoC DSP) Platform will also support DAPM so separate out the probe function to simplify the code (just like the codec probe). Signed-off-by: Liam Girdwood <lrg@ti.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--sound/soc/soc-core.c51
1 files changed, 36 insertions, 15 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index d754b655859..d711e254c3a 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -988,6 +988,39 @@ err_probe:
988 return ret; 988 return ret;
989} 989}
990 990
991static int soc_probe_platform(struct snd_soc_card *card,
992 struct snd_soc_platform *platform)
993{
994 int ret = 0;
995 const struct snd_soc_platform_driver *driver = platform->driver;
996
997 platform->card = card;
998
999 if (!try_module_get(platform->dev->driver->owner))
1000 return -ENODEV;
1001
1002 if (driver->probe) {
1003 ret = driver->probe(platform);
1004 if (ret < 0) {
1005 dev_err(platform->dev,
1006 "asoc: failed to probe platform %s: %d\n",
1007 platform->name, ret);
1008 goto err_probe;
1009 }
1010 }
1011
1012 /* mark platform as probed and add to card platform list */
1013 platform->probed = 1;
1014 list_add(&platform->card_list, &card->platform_dev_list);
1015
1016 return 0;
1017
1018err_probe:
1019 module_put(platform->dev->driver->owner);
1020
1021 return ret;
1022}
1023
991static void rtd_release(struct device *dev) {} 1024static void rtd_release(struct device *dev) {}
992 1025
993static int soc_post_component_init(struct snd_soc_card *card, 1026static int soc_post_component_init(struct snd_soc_card *card,
@@ -1111,21 +1144,9 @@ static int soc_probe_dai_link(struct snd_soc_card *card, int num, int order)
1111 /* probe the platform */ 1144 /* probe the platform */
1112 if (!platform->probed && 1145 if (!platform->probed &&
1113 platform->driver->probe_order == order) { 1146 platform->driver->probe_order == order) {
1114 if (!try_module_get(platform->dev->driver->owner)) 1147 ret = soc_probe_platform(card, platform);
1115 return -ENODEV; 1148 if (ret < 0)
1116 1149 return ret;
1117 if (platform->driver->probe) {
1118 ret = platform->driver->probe(platform);
1119 if (ret < 0) {
1120 printk(KERN_ERR "asoc: failed to probe platform %s\n",
1121 platform->name);
1122 module_put(platform->dev->driver->owner);
1123 return ret;
1124 }
1125 }
1126 /* mark platform as probed and add to card platform list */
1127 platform->probed = 1;
1128 list_add(&platform->card_list, &card->platform_dev_list);
1129 } 1150 }
1130 1151
1131 /* probe the CODEC DAI */ 1152 /* probe the CODEC DAI */