ASoC: core: Add platform DAI widget mapping
authorLiam Girdwood <lrg@ti.com>
Wed, 7 Mar 2012 11:47:41 +0000 (11:47 +0000)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Sun, 1 Apr 2012 10:28:21 +0000 (11:28 +0100)
Add platform driver support for CPU DAI DAPM widgets.

Signed-off-by: Liam Girdwood <lrg@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
include/sound/soc-dai.h
sound/soc/soc-core.c

index c429f248cf4e995a6a8aa20eaa1ec8af71ddfe74..3248fbc3326a6be5e19257b8bf2dc760094fc673 100644 (file)
@@ -241,6 +241,7 @@ struct snd_soc_dai {
 
        struct snd_soc_dapm_widget *playback_widget;
        struct snd_soc_dapm_widget *capture_widget;
+       struct snd_soc_dapm_context dapm;
 
        /* DAI DMA data */
        void *playback_dma_data;
index 4a145cb430183304e5d9c038e366d3a695ffa8b2..42ce14485b92ee291fb2b5870d538e8439c1e1d8 100644 (file)
@@ -1074,6 +1074,7 @@ static int soc_probe_platform(struct snd_soc_card *card,
 {
        int ret = 0;
        const struct snd_soc_platform_driver *driver = platform->driver;
+       struct snd_soc_dai *dai;
 
        platform->card = card;
        platform->dapm.card = card;
@@ -1087,6 +1088,14 @@ static int soc_probe_platform(struct snd_soc_card *card,
                snd_soc_dapm_new_controls(&platform->dapm,
                        driver->dapm_widgets, driver->num_dapm_widgets);
 
+       /* Create DAPM widgets for each DAI stream */
+       list_for_each_entry(dai, &dai_list, list) {
+               if (dai->dev != platform->dev)
+                       continue;
+
+               snd_soc_dapm_new_dai_widgets(&platform->dapm, dai);
+       }
+
        if (driver->probe) {
                ret = driver->probe(platform);
                if (ret < 0) {
@@ -1222,9 +1231,12 @@ static int soc_probe_dai_link(struct snd_soc_card *card, int num, int order)
        /* probe the cpu_dai */
        if (!cpu_dai->probed &&
                        cpu_dai->driver->probe_order == order) {
+               cpu_dai->dapm.card = card;
                if (!try_module_get(cpu_dai->dev->driver->owner))
                        return -ENODEV;
 
+               snd_soc_dapm_new_dai_widgets(&cpu_dai->dapm, cpu_dai);
+
                if (cpu_dai->driver->probe) {
                        ret = cpu_dai->driver->probe(cpu_dai);
                        if (ret < 0) {
@@ -3242,6 +3254,7 @@ int snd_soc_register_dai(struct device *dev,
 
        dai->dev = dev;
        dai->driver = dai_drv;
+       dai->dapm.dev = dev;
        if (!dai->driver->ops)
                dai->driver->ops = &null_dai_ops;
 
@@ -3318,6 +3331,7 @@ int snd_soc_register_dais(struct device *dev,
                        dai->id = dai->driver->id;
                else
                        dai->id = i;
+               dai->dapm.dev = dev;
                if (!dai->driver->ops)
                        dai->driver->ops = &null_dai_ops;