LKML Archive on lore.kernel.org
 help / color / Atom feed
From: Jerome Brunet <jbrunet@baylibre.com>
To: Samuel Holland <samuel@sholland.org>,
	Liam Girdwood <lgirdwood@gmail.com>,
	Mark Brown <broonie@kernel.org>, Rob Herring <robh+dt@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
	Jonathan Corbet <corbet@lwn.net>
Cc: alsa-devel@alsa-project.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org
Subject: Re: [PATCH 4/4] ASoC: simple-card: Add support for codec-to-codec dai_links
Date: Thu, 13 Feb 2020 10:18:53 +0100
Message-ID: <1jpneialqa.fsf@starbuckisacylon.baylibre.com> (raw)
In-Reply-To: <20200213061147.29386-5-samuel@sholland.org>


On Thu 13 Feb 2020 at 07:11, Samuel Holland <samuel@sholland.org> wrote:

> For now we assume there are only a few sets of valid PCM stream
> parameters, to avoid needing to specify them in the device tree. We
> also assume they are the same in both directions. We calculate the
> common subset of parameters, and then the existing code automatically
> chooses the highest quality of the remaining values.
>
> Signed-off-by: Samuel Holland <samuel@sholland.org>
> ---
>  .../devicetree/bindings/sound/simple-card.txt |  1 +
>  Documentation/sound/soc/codec-to-codec.rst    |  9 ++++-
>  include/sound/simple_card_utils.h             |  1 +
>  sound/soc/generic/simple-card-utils.c         | 39 +++++++++++++++++++
>  sound/soc/generic/simple-card.c               | 12 ++++++
>  5 files changed, 60 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/sound/simple-card.txt b/Documentation/devicetree/bindings/sound/simple-card.txt
> index 79954cd6e37b..18a62e404a30 100644
> --- a/Documentation/devicetree/bindings/sound/simple-card.txt
> +++ b/Documentation/devicetree/bindings/sound/simple-card.txt
> @@ -63,6 +63,7 @@ Optional dai-link subnode properties:
>  - mclk-fs             			: Multiplication factor between stream
>  					  rate and codec mclk, applied only for
>  					  the dai-link.
> +- codec-to-codec			: Indicates a codec-to-codec
> dai-link.

I wonder if such property could be viewed as a Linux implementation
detail ?

Similar discussion around DPCM:

* https://lore.kernel.org/linux-devicetree/20191014115635.GB4826@sirena.co.uk/#t
* https://alsa-devel.alsa-project.narkive.com/NCs4MsqL/simle-card-dt-style-for-dpcm#post4

Should the card figure out the codec-to-codec links on its own or is it
something generic enough to put in DT ?

In the Amlogic card driver, I'm using the compatible string of the
device to figure out if CPU is a CODEC.
It is ad-hoc and, to be honest, I'm not entirely happy with this
solution but I could not figure out a better one yet.

>  
>  For backward compatibility the frame-master and bitclock-master
>  properties can be used as booleans in codec subnode to indicate if the
> diff --git a/Documentation/sound/soc/codec-to-codec.rst b/Documentation/sound/soc/codec-to-codec.rst
> index 810109d7500d..efe0a8c07933 100644
> --- a/Documentation/sound/soc/codec-to-codec.rst
> +++ b/Documentation/sound/soc/codec-to-codec.rst
> @@ -104,5 +104,10 @@ Make sure to name your corresponding cpu and codec playback and capture
>  dai names ending with "Playback" and "Capture" respectively as dapm core
>  will link and power those dais based on the name.
>  
> -Note that in current device tree there is no way to mark a dai_link
> -as codec to codec. However, it may change in future.
> +A dai_link in a "simple-audio-card" can be marked as codec to codec in
> +the device tree by adding the "codec-to-codec" property. The dai_link
> +will be initialized with the subset of stream parameters (channels,
> +format, sample rate) supported by all DAIs on the link. Since there is
> +no way to provide these parameters in the device tree, this is mostly
> +useful for communication with simple fixed-function codecs, such as a
> +Bluetooth controller or cellular modem.
> diff --git a/include/sound/simple_card_utils.h b/include/sound/simple_card_utils.h
> index bbdd1542d6f1..80b60237b3cd 100644
> --- a/include/sound/simple_card_utils.h
> +++ b/include/sound/simple_card_utils.h
> @@ -49,6 +49,7 @@ struct asoc_simple_priv {
>  		struct asoc_simple_data adata;
>  		struct snd_soc_codec_conf *codec_conf;
>  		unsigned int mclk_fs;
> +		bool codec_to_codec;
>  	} *dai_props;
>  	struct asoc_simple_jack hp_jack;
>  	struct asoc_simple_jack mic_jack;
> diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c
> index 9b794775df53..2de4cfead790 100644
> --- a/sound/soc/generic/simple-card-utils.c
> +++ b/sound/soc/generic/simple-card-utils.c
> @@ -331,6 +331,41 @@ static int asoc_simple_init_dai(struct snd_soc_dai *dai,
>  	return 0;
>  }
>  
> +static int asoc_simple_init_dai_link_params(struct snd_soc_pcm_runtime *rtd,
> +					    struct simple_dai_props *dai_props)
> +{
> +	struct snd_soc_dai_link *dai_link = rtd->dai_link;
> +	struct snd_soc_pcm_stream *params;
> +	struct snd_pcm_hardware hw;
> +	int ret;
> +
> +	if (!dai_props->codec_to_codec)
> +		return 0;
> +
> +	/* Assumes the hardware capabilities are the same in both directions */
> +	ret = snd_soc_runtime_calc_hw(rtd, &hw, SNDRV_PCM_STREAM_PLAYBACK);
> +	if (ret < 0) {
> +		dev_err(rtd->dev, "simple-card: no valid dai_link params\n");
> +		return ret;
> +	}
> +
> +	params = devm_kzalloc(rtd->dev, sizeof(*params), GFP_KERNEL);
> +	if (!params)
> +		return -ENOMEM;
> +
> +	params->formats = hw.formats;
> +	params->rates = hw.rates;
> +	params->rate_min = hw.rate_min;
> +	params->rate_max = hw.rate_max;
> +	params->channels_min = hw.channels_min;
> +	params->channels_max = hw.channels_max;
> +
> +	dai_link->params = params;
> +	dai_link->num_params = 1;
> +
> +	return 0;
> +}
> +
>  int asoc_simple_dai_init(struct snd_soc_pcm_runtime *rtd)
>  {
>  	struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(rtd->card);
> @@ -347,6 +382,10 @@ int asoc_simple_dai_init(struct snd_soc_pcm_runtime *rtd)
>  	if (ret < 0)
>  		return ret;
>  
> +	ret = asoc_simple_init_dai_link_params(rtd, dai_props);
> +	if (ret < 0)
> +		return ret;
> +
>  	return 0;
>  }
>  EXPORT_SYMBOL_GPL(asoc_simple_dai_init);
> diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
> index 55e9f8800b3e..179ab4482d10 100644
> --- a/sound/soc/generic/simple-card.c
> +++ b/sound/soc/generic/simple-card.c
> @@ -77,6 +77,16 @@ static int asoc_simple_parse_dai(struct device_node *node,
>  	return 0;
>  }
>  
> +static void simple_parse_codec_to_codec(struct device_node *node,
> +					struct simple_dai_props *props,
> +					char *prefix)
> +{
> +	char prop[128];
> +
> +	snprintf(prop, sizeof(prop), "%scodec-to-codec", prefix);
> +	props->codec_to_codec = of_property_read_bool(node, prop);
> +}
> +
>  static void simple_parse_convert(struct device *dev,
>  				 struct device_node *np,
>  				 struct asoc_simple_data *adata)
> @@ -217,6 +227,7 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
>  					     "prefix");
>  	}
>  
> +	simple_parse_codec_to_codec(node, dai_props, prefix);
>  	simple_parse_convert(dev, np, &dai_props->adata);
>  	simple_parse_mclk_fs(top, np, codec, dai_props, prefix);
>  
> @@ -292,6 +303,7 @@ static int simple_dai_link_of(struct asoc_simple_priv *priv,
>  	if (ret < 0)
>  		goto dai_link_of_err;
>  
> +	simple_parse_codec_to_codec(node, dai_props, prefix);
>  	simple_parse_mclk_fs(top, cpu, codec, dai_props, prefix);
>  
>  	ret = asoc_simple_parse_cpu(cpu, dai_link, &single_cpu);


  reply index

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-13  6:11 [PATCH 0/4] simple-audio-card codec2codec support Samuel Holland
2020-02-13  6:11 ` [PATCH 1/4] ASoC: codec2codec: avoid invalid/double-free of pcm runtime Samuel Holland
2020-02-13  8:37   ` Jerome Brunet
2020-02-13 11:37     ` Mark Brown
2020-02-13 13:37       ` Jerome Brunet
2020-02-13 13:31   ` Applied "ASoC: codec2codec: avoid invalid/double-free of pcm runtime" to the asoc tree Mark Brown
2020-02-13  6:11 ` [PATCH 2/4] ALSA: pcm: Make snd_pcm_limit_hw_rates take hw directly Samuel Holland
2020-02-13  6:30   ` Takashi Iwai
2020-02-15  3:19     ` Samuel Holland
2020-02-13  6:11 ` [PATCH 3/4] ASoC: pcm: Export parameter intersection logic Samuel Holland
2020-02-13  6:11 ` [PATCH 4/4] ASoC: simple-card: Add support for codec-to-codec dai_links Samuel Holland
2020-02-13  9:18   ` Jerome Brunet [this message]
2020-02-13 11:38     ` Mark Brown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1jpneialqa.fsf@starbuckisacylon.baylibre.com \
    --to=jbrunet@baylibre.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=corbet@lwn.net \
    --cc=devicetree@vger.kernel.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=perex@perex.cz \
    --cc=robh+dt@kernel.org \
    --cc=samuel@sholland.org \
    --cc=tiwai@suse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

LKML Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/lkml/0 lkml/git/0.git
	git clone --mirror https://lore.kernel.org/lkml/1 lkml/git/1.git
	git clone --mirror https://lore.kernel.org/lkml/2 lkml/git/2.git
	git clone --mirror https://lore.kernel.org/lkml/3 lkml/git/3.git
	git clone --mirror https://lore.kernel.org/lkml/4 lkml/git/4.git
	git clone --mirror https://lore.kernel.org/lkml/5 lkml/git/5.git
	git clone --mirror https://lore.kernel.org/lkml/6 lkml/git/6.git
	git clone --mirror https://lore.kernel.org/lkml/7 lkml/git/7.git
	git clone --mirror https://lore.kernel.org/lkml/8 lkml/git/8.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 lkml lkml/ https://lore.kernel.org/lkml \
		linux-kernel@vger.kernel.org
	public-inbox-index lkml

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-kernel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git