[alsa-devel] [PATCH v8] ASoC: dapm: add code to configure dai link parameters

Charles Keepax ckeepax at opensource.wolfsonmicro.com
Fri Jan 16 15:46:35 CET 2015


On Thu, Jan 15, 2015 at 02:07:11PM +0000, Nikesh Oswal wrote:
> dai-link params for codec-codec links were fixed. The fixed
> link between codec and another chip which may be another codec,
> baseband, bluetooth codec etc may require run time configuaration
> changes. This change provides an optional alsa control to select
> one of the params from a list of params.
> 
> Signed-off-by: Nikesh Oswal <nikesh at opensource.wolfsonmicro.com>
> ---
>  include/sound/soc-dapm.h |    3 +
>  include/sound/soc.h      |    1 +
>  sound/soc/soc-core.c     |    6 +-
>  sound/soc/soc-dapm.c     |  155 ++++++++++++++++++++++++++++++++++++++++++++--
>  4 files changed, 157 insertions(+), 8 deletions(-)
> 
> diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h
> index 5c0a798..a2098e4 100644
> @@ -3299,14 +3363,52 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
>  	struct snd_soc_dapm_widget *w;
>  	size_t len;
>  	char *link_name;
> -	int ret;
> +	int ret, count;
> +	unsigned long private_value;
> +	const char **w_param_text;
> +	struct soc_enum w_param_enum[] = {
> +		SOC_ENUM_SINGLE(0, 0, 0, NULL),
> +	};
> +	struct snd_kcontrol_new kcontrol_dai_link[] = {
> +		SOC_ENUM_EXT(NULL, w_param_enum[0],
> +			     snd_soc_dapm_dai_link_get,
> +			     snd_soc_dapm_dai_link_put),
> +	};
> +	const struct snd_soc_pcm_stream *config = params;
> +
> +	w_param_text = devm_kcalloc(card->dev, num_params,
> +					sizeof(char *), GFP_KERNEL);
> +	if (!w_param_text)
> +		return -ENOMEM;
>  
>  	len = strlen(source->name) + strlen(sink->name) + 2;
>  	link_name = devm_kzalloc(card->dev, len, GFP_KERNEL);
> -	if (!link_name)
> -		return -ENOMEM;
> +	if (!link_name) {
> +		ret = -ENOMEM;
> +		goto outfree_w_param;
> +	}
>  	snprintf(link_name, len, "%s-%s", source->name, sink->name);
>  
> +	for (count = 0 ; count < num_params; count++) {
> +		if (!config->stream_name) {
> +			dev_warn(card->dapm.dev,
> +				"ASoC: anonymous config %d for dai link %s\n",
> +				count, link_name);

The ALSA core doesn't like one of the string in the enum text
links being a NULL pointer so you will want to add some sort of
default text or something in this case.

> +		} else {
> +			w_param_text[count] = devm_kmemdup(card->dev,
> +						config->stream_name,
> +						strlen(config->stream_name) + 1,
> +						GFP_KERNEL);
> +			if (!w_param_text[count]) {
> +				ret = -ENOMEM;
> +				goto outfree_link_name;
> +			}
> +		}
> +		config++;
> +	}
> +	w_param_enum[0].items = num_params;
> +	w_param_enum[0].texts = w_param_text;
> +
>  	memset(&template, 0, sizeof(template));
>  	template.reg = SND_SOC_NOPM;
>  	template.id = snd_soc_dapm_dai_link;

Thanks,
Charles


More information about the Alsa-devel mailing list