ASoC: Define soc_add_dai() to add a DAI to a component
authorMengdong Lin <mengdong.lin@linux.intel.com>
Thu, 31 Dec 2015 08:40:20 +0000 (16:40 +0800)
committerMark Brown <broonie@kernel.org>
Sun, 10 Jan 2016 12:06:19 +0000 (12:06 +0000)
Define soc_add_dai() as a wrapper to add a single DAI to a component.
It can be reused to register a DAI dynamically by topology.

Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/soc-core.c

index 6b1982dcedf1a8c0a367ac5b71ab58c3ff082db5..1bd0b37b907f0c5cbef21dc77000f0f585b0e6ba 100644 (file)
@@ -2744,6 +2744,56 @@ static void snd_soc_unregister_dais(struct snd_soc_component *component)
        }
 }
 
+/* Create a DAI and add it to the component's DAI list */
+static struct snd_soc_dai *soc_add_dai(struct snd_soc_component *component,
+       struct snd_soc_dai_driver *dai_drv,
+       bool legacy_dai_naming)
+{
+       struct device *dev = component->dev;
+       struct snd_soc_dai *dai;
+
+       dev_dbg(dev, "ASoC: dynamically register DAI %s\n", dev_name(dev));
+
+       dai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL);
+       if (dai == NULL)
+               return NULL;
+
+       /*
+        * Back in the old days when we still had component-less DAIs,
+        * instead of having a static name, component-less DAIs would
+        * inherit the name of the parent device so it is possible to
+        * register multiple instances of the DAI. We still need to keep
+        * the same naming style even though those DAIs are not
+        * component-less anymore.
+        */
+       if (legacy_dai_naming &&
+          (dai_drv->id == 0 || dai_drv->name == NULL)) {
+               dai->name = fmt_single_name(dev, &dai->id);
+       } else {
+               dai->name = fmt_multiple_name(dev, dai_drv);
+               if (dai_drv->id)
+                       dai->id = dai_drv->id;
+               else
+                       dai->id = component->num_dai;
+       }
+       if (dai->name == NULL) {
+               kfree(dai);
+               return NULL;
+       }
+
+       dai->component = component;
+       dai->dev = dev;
+       dai->driver = dai_drv;
+       if (!dai->driver->ops)
+               dai->driver->ops = &null_dai_ops;
+
+       list_add(&dai->list, &component->dai_list);
+       component->num_dai++;
+
+       dev_dbg(dev, "ASoC: Registered DAI '%s'\n", dai->name);
+       return dai;
+}
+
 /**
  * snd_soc_register_dais - Register a DAI with the ASoC core
  *
@@ -2765,49 +2815,15 @@ 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;
-       component->num_dai = count;
 
        for (i = 0; i < count; i++) {
 
-               dai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL);
+               dai = soc_add_dai(component, dai_drv + i,
+                               count == 1 && legacy_dai_naming);
                if (dai == NULL) {
                        ret = -ENOMEM;
                        goto err;
                }
-
-               /*
-                * Back in the old days when we still had component-less DAIs,
-                * instead of having a static name, component-less DAIs would
-                * inherit the name of the parent device so it is possible to
-                * register multiple instances of the DAI. We still need to keep
-                * the same naming style even though those DAIs are not
-                * component-less anymore.
-                */
-               if (count == 1 && legacy_dai_naming &&
-                       (dai_drv[i].id == 0 || dai_drv[i].name == NULL)) {
-                       dai->name = fmt_single_name(dev, &dai->id);
-               } else {
-                       dai->name = fmt_multiple_name(dev, &dai_drv[i]);
-                       if (dai_drv[i].id)
-                               dai->id = dai_drv[i].id;
-                       else
-                               dai->id = i;
-               }
-               if (dai->name == NULL) {
-                       kfree(dai);
-                       ret = -ENOMEM;
-                       goto err;
-               }
-
-               dai->component = component;
-               dai->dev = dev;
-               dai->driver = &dai_drv[i];
-               if (!dai->driver->ops)
-                       dai->driver->ops = &null_dai_ops;
-
-               list_add(&dai->list, &component->dai_list);
-
-               dev_dbg(dev, "ASoC: Registered DAI '%s'\n", dai->name);
        }
 
        return 0;