[alsa-devel] [RFC] ASoC: core: Allow DAI links to be specified by using ACPI names

Rafael J. Wysocki rjw at rjwysocki.net
Fri Oct 4 08:53:33 CEST 2013


On Thursday, October 03, 2013 03:33:56 PM Jarkko Nikula wrote:
> This patch adds alternative way to specify DAI links by using ACPI names.
> ACPI name here is considered to be used as an alias for device name during
> DAI link binding time.

What's DAI?

> Rationale behind this is that device name especially with bus connected
> codecs may not be constant enough to be used in machines with dynamic and
> variable amount of bus controllers due changing bus/adapter number.
> 
> One way to solve this problem on ACPI 5 based systems is to use ACPI names
> of those devices that are enumerated by the ACPI subsystem.
> 
> For instance, matchine drivers could specify codec in DAI link by using:
> 	.codec_name = "INT33CA:00",
> instead of
> 	.codec_name = "rt5640.0-001c",
> 
> Note that ACPI name is used just an alias during bind time and core
> continues to use device name. In fact, machine drivers could use either
> names.
> 
> Thanks to Mika Westerberg for initial idea to use ACPI handles for binding.
> Author extended and simplified the idea so that struct snd_soc_dai_link
> doesn't need a new field, machine drivers don't need any additional code
> and soc-core.c can handle matching when executing soc_bind_dai_link().
> 
> Signed-off-by: Jarkko Nikula <jarkko.nikula at linux.intel.com>
> Cc: Mika Westerberg <mika.westerberg at linux.intel.com>
> ---
> linux-acpi at vger.kernel.org cc'd if ACPI folks would like to check API usage
> here.
> ---
>  sound/soc/soc-core.c | 38 ++++++++++++++++++++++++++++++++------
>  1 file changed, 32 insertions(+), 6 deletions(-)
> 
> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> index 4280c70..5cb440e 100644
> --- a/sound/soc/soc-core.c
> +++ b/sound/soc/soc-core.c
> @@ -36,6 +36,7 @@
>  #include <linux/of.h>
>  #include <linux/gpio.h>
>  #include <linux/of_gpio.h>
> +#include <linux/acpi.h>
>  #include <sound/ac97_codec.h>
>  #include <sound/core.h>
>  #include <sound/jack.h>
> @@ -836,6 +837,27 @@ EXPORT_SYMBOL_GPL(snd_soc_resume);
>  static const struct snd_soc_dai_ops null_dai_ops = {
>  };
>  
> +static bool soc_match_name(struct device *dev,
> +			   const char *comp_name, const char *bind_name)
> +{
> +	if (!strcmp(comp_name, bind_name))
> +		return true;
> +
> +#if IS_ENABLED(CONFIG_ACPI)

That's not necessary, because ACPI_HANDLE() is defined as false for
CONFIG_ACPI unset.

> +	if (ACPI_HANDLE(dev)) {
> +		struct acpi_device *adev;
> +		if (!acpi_bus_get_device(ACPI_HANDLE(dev), &adev) &&
> +		    !strcmp(dev_name(&adev->dev), bind_name)) {
> +			dev_dbg(dev, "Matching with ACPI name %s\n",
> +				dev_name(&adev->dev));
> +			return true;
> +		}
> +	}
> +#endif
> +
> +	return false;
> +}
> +
>  static int soc_bind_dai_link(struct snd_soc_card *card, int num)
>  {
>  	struct snd_soc_dai_link *dai_link = &card->dai_link[num];
> @@ -853,10 +875,12 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
>  		    (cpu_dai->dev->of_node != dai_link->cpu_of_node))
>  			continue;
>  		if (dai_link->cpu_name &&
> -		    strcmp(dev_name(cpu_dai->dev), dai_link->cpu_name))
> +		    !soc_match_name(cpu_dai->dev, dev_name(cpu_dai->dev),
> +				    dai_link->cpu_name))
>  			continue;
>  		if (dai_link->cpu_dai_name &&
> -		    strcmp(cpu_dai->name, dai_link->cpu_dai_name))
> +		    !soc_match_name(cpu_dai->dev, cpu_dai->name,
> +				    dai_link->cpu_dai_name))
>  			continue;
>  
>  		rtd->cpu_dai = cpu_dai;
> @@ -874,7 +898,8 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
>  			if (codec->dev->of_node != dai_link->codec_of_node)
>  				continue;
>  		} else {
> -			if (strcmp(codec->name, dai_link->codec_name))
> +			if (!soc_match_name(codec->dev, codec->name,
> +					    dai_link->codec_name))
>  				continue;
>  		}
>  
> @@ -886,8 +911,8 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
>  		 */
>  		list_for_each_entry(codec_dai, &dai_list, list) {
>  			if (codec->dev == codec_dai->dev &&
> -				!strcmp(codec_dai->name,
> -					dai_link->codec_dai_name)) {
> +			    soc_match_name(codec->dev, codec_dai->name,
> +					   dai_link->codec_dai_name)) {
>  
>  				rtd->codec_dai = codec_dai;
>  			}
> @@ -918,7 +943,8 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
>  			    dai_link->platform_of_node)
>  				continue;
>  		} else {
> -			if (strcmp(platform->name, platform_name))
> +			if (!soc_match_name(platform->dev, platform->name,
> +					    platform_name))
>  				continue;
>  		}
>  

Thanks!

-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.


More information about the Alsa-devel mailing list