When registering a component, make sure that the driver names are unique. This will ensure that the snd_soc_rtdcom_lookup() function returns the right component based on the name.
Signed-off-by: Ranjani Sridharan ranjani.sridharan@linux.intel.com --- sound/soc/soc-core.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-)
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 8321e75ff244..00c1f8ce46af 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -286,14 +286,6 @@ struct snd_soc_component *snd_soc_rtdcom_lookup(struct snd_soc_pcm_runtime *rtd, if (!driver_name) return NULL;
- /* - * NOTE - * - * snd_soc_rtdcom_lookup() will find component from rtd by using - * specified driver name. - * But, if many components which have same driver name are connected - * to 1 rtd, this function will return 1st found component. - */ for_each_rtd_components(rtd, i, component) { const char *component_name = component->driver->name;
@@ -2640,6 +2632,22 @@ int snd_soc_add_component(struct device *dev, } EXPORT_SYMBOL_GPL(snd_soc_add_component);
+static bool +snd_soc_component_driver_name_is_unique(const struct snd_soc_component_driver *component_driver) +{ + struct snd_soc_component *component; + + mutex_lock(&client_mutex); + for_each_component(component) + if (!strcmp(component->driver->name, component_driver->name)) { + mutex_unlock(&client_mutex); + return false; + } + + mutex_unlock(&client_mutex); + return true; +} + int snd_soc_register_component(struct device *dev, const struct snd_soc_component_driver *component_driver, struct snd_soc_dai_driver *dai_drv, @@ -2647,6 +2655,13 @@ int snd_soc_register_component(struct device *dev, { struct snd_soc_component *component;
+ if (component_driver->name && + !snd_soc_component_driver_name_is_unique(component_driver)) { + dev_err(dev, "component driver name %s is not unique\n", + component_driver->name); + return -EINVAL; + } + component = devm_kzalloc(dev, sizeof(*component), GFP_KERNEL); if (!component) return -ENOMEM;