Skip to content

Commit

Permalink
ASoC: Define soc_add_dai() to add a DAI to a component
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Mengdong Lin authored and Mark Brown committed Jan 10, 2016
1 parent 61b0088 commit 5e4fb37
Showing 1 changed file with 52 additions and 36 deletions.
88 changes: 52 additions & 36 deletions sound/soc/soc-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
*
Expand All @@ -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;
Expand Down

0 comments on commit 5e4fb37

Please sign in to comment.