]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: tlv320aic32x4: Add multi endpoint support
authorMarek Vasut <marex@denx.de>
Fri, 30 Aug 2024 23:09:43 +0000 (01:09 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 3 Sep 2024 20:23:58 +0000 (21:23 +0100)
Support multiple endpoints on TLV320AIC32x4 codec port when
used in of_graph context.

This patch allows to share the codec port between two CPU DAIs.

Example:

Custom STM32MP157C board uses TLV320AIC32x4 audio codec. This codec
is connected to two serial audio interfaces, which are configured
either as rx or tx.

>From AsoC point of view the topolgy is the following:
// 2 CPU DAIs (SAI2A/B), 1 Codec (TLV320AIC32x4)
Playback: CPU-A-DAI(slave) -> (master)CODEC-DAI/port0
Record:   CPU-B-DAI(slave) <- (master)CODEC-DAI/port0

In the DT two endpoints have to be associated to the codec port:
tlv320aic32x4_port: port {
    tlv320aic32x4_tx_endpoint: endpoint@0 {
            remote-endpoint = <&sai2a_endpoint>;
    };
    tlv320aic32x4_rx_endpoint: endpoint@1 {
            remote-endpoint = <&sai2b_endpoint>;
    };
};

However, when the audio graph card parses the codec nodes, it expects
to find DAI interface indexes matching the endpoints indexes.

The current patch forces the use of DAI id 0 for both endpoints,
which allows to share the codec DAI between the two CPU DAIs
for playback and capture streams respectively.

Signed-off-by: Marek Vasut <marex@denx.de>
Link: https://patch.msgid.link/20240830231007.205707-1-marex@denx.de
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/tlv320aic32x4.c

index 5c0c81da06dba2924ceccb02205d53c82308a2da..54ea4bc58c276d9ab39a15d312287dfb300dbab9 100644 (file)
@@ -1073,6 +1073,13 @@ static int aic32x4_component_probe(struct snd_soc_component *component)
        return 0;
 }
 
+static int aic32x4_of_xlate_dai_id(struct snd_soc_component *component,
+                                  struct device_node *endpoint)
+{
+       /* return dai id 0, whatever the endpoint index */
+       return 0;
+}
+
 static const struct snd_soc_component_driver soc_component_dev_aic32x4 = {
        .probe                  = aic32x4_component_probe,
        .set_bias_level         = aic32x4_set_bias_level,
@@ -1082,6 +1089,7 @@ static const struct snd_soc_component_driver soc_component_dev_aic32x4 = {
        .num_dapm_widgets       = ARRAY_SIZE(aic32x4_dapm_widgets),
        .dapm_routes            = aic32x4_dapm_routes,
        .num_dapm_routes        = ARRAY_SIZE(aic32x4_dapm_routes),
+       .of_xlate_dai_id        = aic32x4_of_xlate_dai_id,
        .suspend_bias_off       = 1,
        .idle_bias_on           = 1,
        .use_pmdown_time        = 1,
@@ -1203,6 +1211,7 @@ static const struct snd_soc_component_driver soc_component_dev_aic32x4_tas2505 =
        .num_dapm_widgets       = ARRAY_SIZE(aic32x4_tas2505_dapm_widgets),
        .dapm_routes            = aic32x4_tas2505_dapm_routes,
        .num_dapm_routes        = ARRAY_SIZE(aic32x4_tas2505_dapm_routes),
+       .of_xlate_dai_id        = aic32x4_of_xlate_dai_id,
        .suspend_bias_off       = 1,
        .idle_bias_on           = 1,
        .use_pmdown_time        = 1,