* [RFC v2 0/2] ASoC: prepare streams on codec-to-codec links
@ 2025-01-10 21:07 Martin Blumenstingl
2025-01-10 21:07 ` [RFC v2 1/2] ASoC: soc-dai: add snd_soc_dai_prepare() and use it internally Martin Blumenstingl
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Martin Blumenstingl @ 2025-01-10 21:07 UTC (permalink / raw)
To: linux-sound, linux-amlogic
Cc: s.nawrocki, lgirdwood, broonie, linux-kernel, jbrunet,
Martin Blumenstingl
Hello,
the DRM subsystem has recently gained a HDMI audio codec framework [0].
This is already queued for Linux 6.14.
I want to implement a HDMI controller driver for the Amlogic
Meson8/8b/8m2 SoCs using the DRM HDMI audio codec framework. Internally
the DRM HDMI audio codec framework relies on hdmi-codec's .prepare
callback to be called. This unfortunately is not happening on Amlogic
Meson8/8b/8m2 platforms [1].
Jerome suggested that this may be because of the codec-to-codec link on
our Amlogic AIU audio driver [2]. He encouraged me to send this series
to allow hdmi-codec's .prepare() callback to be called - even on
platforms that connect it via a codec-to-codec link.
The reason why this series is marked as RFC is that I'm not familiar
with the ASoC subsystem and lot of the functionality and terminology
is new to me.
Also I Cc'ed Sylwester Nawrocki (Samsung maintainer) as codec-to-codec
links seem to be most heavily used on Samsung and Amlogic platforms.
Changes since v1 at [3]:
- updated patch #2 to also prepare the source side of the link for
consistency reasons (as suggested by Jerome and Mark)
[0] https://lore.kernel.org/dri-devel/20241224-drm-bridge-hdmi-connector-v10-0-dc89577cd438@linaro.org/
[1] https://lore.kernel.org/linux-amlogic/CAFBinCDdiJ3UNVUcShjq=7U2=oUwT3ciYdKSuZ5TdcrikxFBpg@mail.gmail.com/
[2] https://lore.kernel.org/linux-amlogic/1ja5c4b4rt.fsf@starbuckisacylon.baylibre.com/
[3] https://lore.kernel.org/linux-sound/20250106141316.375984-1-martin.blumenstingl@googlemail.com/
Martin Blumenstingl (2):
ASoC: soc-dai: add snd_soc_dai_prepare() and use it internally
ASoC: dapm: add support for preparing streams
include/sound/soc-dai.h | 3 +++
sound/soc/soc-dai.c | 27 +++++++++++++++++++--------
sound/soc/soc-dapm.c | 12 ++++++++++++
3 files changed, 34 insertions(+), 8 deletions(-)
--
2.47.1
^ permalink raw reply [flat|nested] 6+ messages in thread* [RFC v2 1/2] ASoC: soc-dai: add snd_soc_dai_prepare() and use it internally 2025-01-10 21:07 [RFC v2 0/2] ASoC: prepare streams on codec-to-codec links Martin Blumenstingl @ 2025-01-10 21:07 ` Martin Blumenstingl 2025-01-13 14:13 ` Charles Keepax 2025-01-10 21:07 ` [RFC v2 2/2] ASoC: dapm: add support for preparing streams Martin Blumenstingl 2025-01-13 14:53 ` [RFC v2 0/2] ASoC: prepare streams on codec-to-codec links Jerome Brunet 2 siblings, 1 reply; 6+ messages in thread From: Martin Blumenstingl @ 2025-01-10 21:07 UTC (permalink / raw) To: linux-sound, linux-amlogic Cc: s.nawrocki, lgirdwood, broonie, linux-kernel, jbrunet, Martin Blumenstingl Add a new snd_soc_dai_prepare() which can be used (in an upcoming patch) by soc-dapm.c. Use this new function internally in snd_soc_pcm_dai_prepare() to avoid duplicating code. Suggested-by: Jerome Brunet <jbrunet@baylibre.com> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- Changes since v1: - none include/sound/soc-dai.h | 3 +++ sound/soc/soc-dai.c | 27 +++++++++++++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h index aab57c19f62b..a11501752637 100644 --- a/include/sound/soc-dai.h +++ b/include/sound/soc-dai.h @@ -193,6 +193,9 @@ int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai, int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate); +int snd_soc_dai_prepare(struct snd_soc_dai *dai, + struct snd_pcm_substream *substream); + /* Digital Audio Interface mute */ int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute, int direction); diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c index 34ba1a93a4c9..ca0308f6d41c 100644 --- a/sound/soc/soc-dai.c +++ b/sound/soc/soc-dai.c @@ -360,6 +360,22 @@ int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate) } EXPORT_SYMBOL_GPL(snd_soc_dai_set_tristate); +int snd_soc_dai_prepare(struct snd_soc_dai *dai, + struct snd_pcm_substream *substream) +{ + int ret = 0; + + if (!snd_soc_dai_stream_valid(dai, substream->stream)) + return 0; + + if (dai->driver->ops && + dai->driver->ops->prepare) + ret = dai->driver->ops->prepare(substream, dai); + + return soc_dai_ret(dai, ret); +} +EXPORT_SYMBOL_GPL(snd_soc_dai_prepare); + /** * snd_soc_dai_digital_mute - configure DAI system or master clock. * @dai: DAI @@ -577,14 +593,9 @@ int snd_soc_pcm_dai_prepare(struct snd_pcm_substream *substream) int i, ret; for_each_rtd_dais(rtd, i, dai) { - if (!snd_soc_dai_stream_valid(dai, substream->stream)) - continue; - if (dai->driver->ops && - dai->driver->ops->prepare) { - ret = dai->driver->ops->prepare(substream, dai); - if (ret < 0) - return soc_dai_ret(dai, ret); - } + ret = snd_soc_dai_prepare(dai, substream); + if (ret < 0) + return ret; } return 0; -- 2.47.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [RFC v2 1/2] ASoC: soc-dai: add snd_soc_dai_prepare() and use it internally 2025-01-10 21:07 ` [RFC v2 1/2] ASoC: soc-dai: add snd_soc_dai_prepare() and use it internally Martin Blumenstingl @ 2025-01-13 14:13 ` Charles Keepax 0 siblings, 0 replies; 6+ messages in thread From: Charles Keepax @ 2025-01-13 14:13 UTC (permalink / raw) To: Martin Blumenstingl Cc: linux-sound, linux-amlogic, s.nawrocki, lgirdwood, broonie, linux-kernel, jbrunet On Fri, Jan 10, 2025 at 10:07:29PM +0100, Martin Blumenstingl wrote: > Add a new snd_soc_dai_prepare() which can be used (in an upcoming patch) > by soc-dapm.c. Use this new function internally in > snd_soc_pcm_dai_prepare() to avoid duplicating code. > > Suggested-by: Jerome Brunet <jbrunet@baylibre.com> > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > --- Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com> Thanks, Charles ^ permalink raw reply [flat|nested] 6+ messages in thread
* [RFC v2 2/2] ASoC: dapm: add support for preparing streams 2025-01-10 21:07 [RFC v2 0/2] ASoC: prepare streams on codec-to-codec links Martin Blumenstingl 2025-01-10 21:07 ` [RFC v2 1/2] ASoC: soc-dai: add snd_soc_dai_prepare() and use it internally Martin Blumenstingl @ 2025-01-10 21:07 ` Martin Blumenstingl 2025-01-13 14:14 ` Charles Keepax 2025-01-13 14:53 ` [RFC v2 0/2] ASoC: prepare streams on codec-to-codec links Jerome Brunet 2 siblings, 1 reply; 6+ messages in thread From: Martin Blumenstingl @ 2025-01-10 21:07 UTC (permalink / raw) To: linux-sound, linux-amlogic Cc: s.nawrocki, lgirdwood, broonie, linux-kernel, jbrunet, Martin Blumenstingl Codec driver can implement .hw_params and/or .prepare from struct snd_soc_dai_ops. For codec-to-codec links only the former (.hw_params) callback has been called. On platforms like Amlogic Meson8/8b/8m2 the SoC's sound card (sound/soc/meson/gx-card.c) uses a codec-to-codec link for the HDMI codec output because further digital routing is required after the backend. The new DRM HDMI (audio) codec framework (which internally uses sound/soc/codecs/hdmi-codec.c) relies on the .prepare callback of the hdmi-codec to be called. Implement calls to snd_soc_dai_prepare() so the .prepare callback is called. In this case the mandatory part is the call to prepare the sink (which is the hdmi-codec on those platforms). Also call snd_soc_dai_prepare() for the source to stay consistent with the rest of the code (even though it's not strictly necessary to make the DRM HDMI codec framework work on Amlogic Meson8/8b/8m2). For platforms or sound cards without a codec-to-codec link with additional parameters (which applies to most hardware) this changes nothing as the .prepare callback is already called via snd_pcm_do_prepare() (as well as dpcm_fe_dai_prepare() and dpcm_be_dai_prepare()) on those. Suggested-by: Jerome Brunet <jbrunet@baylibre.com> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- Changes since v1: - also call snd_soc_dai_prepare() as suggested by Jerome/Mark for the source to keep things symmetrical (this is not strictly necessary for the Amlogic Meson SoC as it doesn't implement the .prepare callback in the platform drivers - but having it symmetrical means less confusion for future platform maintainers) sound/soc/soc-dapm.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 99521c784a9b..ebb181aac7b7 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c @@ -4013,6 +4013,18 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w, break; case SND_SOC_DAPM_POST_PMU: + snd_soc_dapm_widget_for_each_source_path(w, path) { + source = path->source->priv; + + snd_soc_dai_prepare(source, substream); + } + + snd_soc_dapm_widget_for_each_sink_path(w, path) { + sink = path->sink->priv; + + snd_soc_dai_prepare(sink, substream); + } + snd_soc_dapm_widget_for_each_sink_path(w, path) { sink = path->sink->priv; -- 2.47.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [RFC v2 2/2] ASoC: dapm: add support for preparing streams 2025-01-10 21:07 ` [RFC v2 2/2] ASoC: dapm: add support for preparing streams Martin Blumenstingl @ 2025-01-13 14:14 ` Charles Keepax 0 siblings, 0 replies; 6+ messages in thread From: Charles Keepax @ 2025-01-13 14:14 UTC (permalink / raw) To: Martin Blumenstingl Cc: linux-sound, linux-amlogic, s.nawrocki, lgirdwood, broonie, linux-kernel, jbrunet On Fri, Jan 10, 2025 at 10:07:30PM +0100, Martin Blumenstingl wrote: > Codec driver can implement .hw_params and/or .prepare from struct > snd_soc_dai_ops. For codec-to-codec links only the former (.hw_params) > callback has been called. > > On platforms like Amlogic Meson8/8b/8m2 the SoC's sound card > (sound/soc/meson/gx-card.c) uses a codec-to-codec link for the HDMI > codec output because further digital routing is required after the > backend. The new DRM HDMI (audio) codec framework (which internally > uses sound/soc/codecs/hdmi-codec.c) relies on the .prepare callback > of the hdmi-codec to be called. Implement calls to > snd_soc_dai_prepare() so the .prepare callback is called. In this > case the mandatory part is the call to prepare the sink (which is > the hdmi-codec on those platforms). Also call snd_soc_dai_prepare() > for the source to stay consistent with the rest of the code (even > though it's not strictly necessary to make the DRM HDMI codec > framework work on Amlogic Meson8/8b/8m2). > > For platforms or sound cards without a codec-to-codec link with > additional parameters (which applies to most hardware) this changes > nothing as the .prepare callback is already called via > snd_pcm_do_prepare() (as well as dpcm_fe_dai_prepare() and > dpcm_be_dai_prepare()) on those. > > Suggested-by: Jerome Brunet <jbrunet@baylibre.com> > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > --- Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com> Thanks, Charles ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC v2 0/2] ASoC: prepare streams on codec-to-codec links 2025-01-10 21:07 [RFC v2 0/2] ASoC: prepare streams on codec-to-codec links Martin Blumenstingl 2025-01-10 21:07 ` [RFC v2 1/2] ASoC: soc-dai: add snd_soc_dai_prepare() and use it internally Martin Blumenstingl 2025-01-10 21:07 ` [RFC v2 2/2] ASoC: dapm: add support for preparing streams Martin Blumenstingl @ 2025-01-13 14:53 ` Jerome Brunet 2 siblings, 0 replies; 6+ messages in thread From: Jerome Brunet @ 2025-01-13 14:53 UTC (permalink / raw) To: Martin Blumenstingl Cc: linux-sound, linux-amlogic, s.nawrocki, lgirdwood, broonie, linux-kernel On Fri 10 Jan 2025 at 22:07, Martin Blumenstingl <martin.blumenstingl@googlemail.com> wrote: > Hello, > > the DRM subsystem has recently gained a HDMI audio codec framework [0]. > This is already queued for Linux 6.14. > > I want to implement a HDMI controller driver for the Amlogic > Meson8/8b/8m2 SoCs using the DRM HDMI audio codec framework. Internally > the DRM HDMI audio codec framework relies on hdmi-codec's .prepare > callback to be called. This unfortunately is not happening on Amlogic > Meson8/8b/8m2 platforms [1]. > > Jerome suggested that this may be because of the codec-to-codec link on > our Amlogic AIU audio driver [2]. He encouraged me to send this series > to allow hdmi-codec's .prepare() callback to be called - even on > platforms that connect it via a codec-to-codec link. > > The reason why this series is marked as RFC is that I'm not familiar > with the ASoC subsystem and lot of the functionality and terminology > is new to me. > > Also I Cc'ed Sylwester Nawrocki (Samsung maintainer) as codec-to-codec > links seem to be most heavily used on Samsung and Amlogic platforms. > > Changes since v1 at [3]: > - updated patch #2 to also prepare the source side of the link for > consistency reasons (as suggested by Jerome and Mark) > > > [0] https://lore.kernel.org/dri-devel/20241224-drm-bridge-hdmi-connector-v10-0-dc89577cd438@linaro.org/ > [1] https://lore.kernel.org/linux-amlogic/CAFBinCDdiJ3UNVUcShjq=7U2=oUwT3ciYdKSuZ5TdcrikxFBpg@mail.gmail.com/ > [2] https://lore.kernel.org/linux-amlogic/1ja5c4b4rt.fsf@starbuckisacylon.baylibre.com/ > [3] https://lore.kernel.org/linux-sound/20250106141316.375984-1-martin.blumenstingl@googlemail.com/ > > > Martin Blumenstingl (2): > ASoC: soc-dai: add snd_soc_dai_prepare() and use it internally > ASoC: dapm: add support for preparing streams Reviewed-by: Jerome Brunet <jbrunet@baylibre.com> Not sure the RFC tag was necessary, this could go in as it is I suppose. Thanks Martin ! > > include/sound/soc-dai.h | 3 +++ > sound/soc/soc-dai.c | 27 +++++++++++++++++++-------- > sound/soc/soc-dapm.c | 12 ++++++++++++ > 3 files changed, 34 insertions(+), 8 deletions(-) -- Jerome ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-01-13 14:53 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-01-10 21:07 [RFC v2 0/2] ASoC: prepare streams on codec-to-codec links Martin Blumenstingl 2025-01-10 21:07 ` [RFC v2 1/2] ASoC: soc-dai: add snd_soc_dai_prepare() and use it internally Martin Blumenstingl 2025-01-13 14:13 ` Charles Keepax 2025-01-10 21:07 ` [RFC v2 2/2] ASoC: dapm: add support for preparing streams Martin Blumenstingl 2025-01-13 14:14 ` Charles Keepax 2025-01-13 14:53 ` [RFC v2 0/2] ASoC: prepare streams on codec-to-codec links Jerome Brunet
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox