ASoC: audio-graph-card: enable playback/capture_only property
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 28 May 2024 05:05:44 +0000 (05:05 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 3 Jun 2024 14:59:40 +0000 (15:59 +0100)
Audio Graph Card2 is supporting playback/capture_only property,
let's follow Audio Graph Card, too.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://msgid.link/r/87zfsafrvb.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/generic/audio-graph-card.c

index c60f00146859113b737ba2eaa1d2b828407f24f9..6a19e40d2c4aa44679d8cbad8029eca38728d9f2 100644 (file)
@@ -149,26 +149,44 @@ static int graph_parse_node(struct simple_util_priv *priv,
 }
 
 static int graph_link_init(struct simple_util_priv *priv,
-                          struct device_node *cpu_ep,
-                          struct device_node *codec_ep,
+                          struct device_node *ep_cpu,
+                          struct device_node *ep_codec,
                           struct link_info *li,
                           char *name)
 {
        struct device *dev = simple_priv_to_dev(priv);
+       struct device_node *top = dev->of_node;
        struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
+       struct device_node *port_cpu = ep_to_port(ep_cpu);
+       struct device_node *port_codec = ep_to_port(ep_codec);
+       bool playback_only = 0, capture_only = 0;
        int ret;
 
-       ret = simple_util_parse_daifmt(dev, cpu_ep, codec_ep,
+       ret = simple_util_parse_daifmt(dev, ep_cpu, ep_codec,
                                       NULL, &dai_link->dai_fmt);
        if (ret < 0)
-               return ret;
+               goto init_end;
+
+       graph_util_parse_link_direction(top,            &playback_only, &capture_only);
+       graph_util_parse_link_direction(port_cpu,       &playback_only, &capture_only);
+       graph_util_parse_link_direction(port_codec,     &playback_only, &capture_only);
+       graph_util_parse_link_direction(ep_cpu,         &playback_only, &capture_only);
+       graph_util_parse_link_direction(ep_codec,       &playback_only, &capture_only);
+
+       dai_link->playback_only = playback_only;
+       dai_link->capture_only  = capture_only;
 
        dai_link->init          = simple_util_dai_init;
        dai_link->ops           = &graph_ops;
        if (priv->ops)
                dai_link->ops   = priv->ops;
 
-       return simple_util_set_dailink_name(dev, dai_link, name);
+       ret = simple_util_set_dailink_name(dev, dai_link, name);
+init_end:
+       of_node_put(port_cpu);
+       of_node_put(port_codec);
+
+       return ret;
 }
 
 static int graph_dai_link_of_dpcm(struct simple_util_priv *priv,