Support multiple endpoints on cs42L51 codec port
when used in of_graph context.

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

Example:

STM32MP157C-DK2 board uses CS42L51 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 (CS42L51)
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:
cs42l51_port: port {
        cs42l51_tx_endpoint: endpoint@0 {
                remote-endpoint = <&sai2a_endpoint>;
        };
        cs42l51_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: Olivier Moysan <olivier.moy...@st.com>
---
 sound/soc/codecs/cs42l51.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/sound/soc/codecs/cs42l51.c b/sound/soc/codecs/cs42l51.c
index fd2bd74024c1..80da3cd73e04 100644
--- a/sound/soc/codecs/cs42l51.c
+++ b/sound/soc/codecs/cs42l51.c
@@ -464,6 +464,13 @@ static int cs42l51_dai_mute(struct snd_soc_dai *dai, int 
mute)
        return snd_soc_component_write(component, CS42L51_DAC_OUT_CTL, reg);
 }
 
+static int cs42l51_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_dai_ops cs42l51_dai_ops = {
        .hw_params      = cs42l51_hw_params,
        .set_sysclk     = cs42l51_set_dai_sysclk,
@@ -526,6 +533,7 @@ static const struct snd_soc_component_driver 
soc_component_device_cs42l51 = {
        .num_dapm_widgets       = ARRAY_SIZE(cs42l51_dapm_widgets),
        .dapm_routes            = cs42l51_routes,
        .num_dapm_routes        = ARRAY_SIZE(cs42l51_routes),
+       .of_xlate_dai_id        = cs42l51_of_xlate_dai_id,
        .idle_bias_on           = 1,
        .use_pmdown_time        = 1,
        .endianness             = 1,
-- 
2.7.4

Reply via email to