Merge remote-tracking branches 'asoc/topic/cs47l24', 'asoc/topic/cx20442', 'asoc...
[sfrench/cifs-2.6.git] / sound / soc / soc-core.c
index b9ca939fd05c302eb5853b63c1102c2e3461faf3..01fd7c472ea4584e1d8c7cab327c16f31577a892 100644 (file)
@@ -590,14 +590,23 @@ struct snd_soc_component *snd_soc_rtdcom_lookup(struct snd_soc_pcm_runtime *rtd,
 {
        struct snd_soc_rtdcom_list *rtdcom;
 
+       if (!driver_name)
+               return NULL;
+
        for_each_rtdcom(rtd, rtdcom) {
-               if ((rtdcom->component->driver->name == driver_name) ||
-                   strcmp(rtdcom->component->driver->name, driver_name) == 0)
+               const char *component_name = rtdcom->component->driver->name;
+
+               if (!component_name)
+                       continue;
+
+               if ((component_name == driver_name) ||
+                   strcmp(component_name, driver_name) == 0)
                        return rtdcom->component;
        }
 
        return NULL;
 }
+EXPORT_SYMBOL_GPL(snd_soc_rtdcom_lookup);
 
 struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card,
                const char *dai_link, int stream)
@@ -1392,6 +1401,16 @@ static int soc_init_dai_link(struct snd_soc_card *card,
        return 0;
 }
 
+void snd_soc_disconnect_sync(struct device *dev)
+{
+       struct snd_soc_component *component = snd_soc_lookup_component(dev, NULL);
+
+       if (!component || !component->card)
+               return;
+
+       snd_card_disconnect_sync(component->card->snd_card);
+}
+
 /**
  * snd_soc_add_dai_link - Add a DAI link dynamically
  * @card: The ASoC card to which the DAI link is added
@@ -3151,7 +3170,7 @@ static struct snd_soc_dai *soc_add_dai(struct snd_soc_component *component,
        if (!dai->driver->ops)
                dai->driver->ops = &null_dai_ops;
 
-       list_add(&dai->list, &component->dai_list);
+       list_add_tail(&dai->list, &component->dai_list);
        component->num_dai++;
 
        dev_dbg(dev, "ASoC: Registered DAI '%s'\n", dai->name);
@@ -3178,8 +3197,6 @@ static int snd_soc_register_dais(struct snd_soc_component *component,
 
        dev_dbg(dev, "ASoC: dai register %s #%zu\n", dev_name(dev), count);
 
-       component->dai_drv = dai_drv;
-
        for (i = 0; i < count; i++) {
 
                dai = soc_add_dai(component, dai_drv + i,
@@ -4356,6 +4373,7 @@ int snd_soc_get_dai_name(struct of_phandle_args *args,
                                                             args,
                                                             dai_name);
                } else {
+                       struct snd_soc_dai *dai;
                        int id = -1;
 
                        switch (args->args_count) {
@@ -4377,7 +4395,14 @@ int snd_soc_get_dai_name(struct of_phandle_args *args,
 
                        ret = 0;
 
-                       *dai_name = pos->dai_drv[id].name;
+                       /* find target DAI */
+                       list_for_each_entry(dai, &pos->dai_list, list) {
+                               if (id == 0)
+                                       break;
+                               id--;
+                       }
+
+                       *dai_name = dai->driver->name;
                        if (!*dai_name)
                                *dai_name = pos->name;
                }