drm: adv7511_audio: Add .get_dai_id callback to map port number to dai id
authorJohn Stultz <john.stultz@linaro.org>
Tue, 13 Jun 2017 21:59:49 +0000 (14:59 -0700)
committerMark Brown <broonie@kernel.org>
Wed, 28 Jun 2017 20:00:08 +0000 (21:00 +0100)
ALSA SoC needs to know connected DAI ID for probing. Using
the new audio-card-graph approach, ports/endpoints are used
to describe how the links are connected. Unfortunately, since
ports/endpoints are used as well for video linkages, there
are some issues mixing the port ids to the two (video and
audio) namespaces.

To solve this issue, this patch adds new .get_dai_id callback
on hdmi_codec_ops.

The will assume that HDMI audio out will be connected to
reg = <2>. This will then be remapped to the ALSA SoC side will
as DAI 0. Allowing the adv7511's hdmi audio support to be used
with the audio-card-graph.

Credit to Kuninori Morimoto who's patch to dw-hdmi-i2s-audio.c
was what this was mostly copy-pasted from.

Cc: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Cc: Archit Taneja <architt@codeaurora.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: David Airlie <airlied@linux.ie>
Cc: Lars-Peter Clausen <lars@metafoo.de>
Cc: Linux-ALSA <alsa-devel@alsa-project.org>
Cc: dri-devel@lists.freedesktop.org
Signed-off-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
Documentation/devicetree/bindings/display/bridge/adi,adv7511.txt
drivers/gpu/drm/bridge/adv7511/adv7511_audio.c

index 00ea670b8c4dc49ea35324a1b606c009a5b87df0..06668bca7ffcd9385a08b9d1ed80a4321bf83ab5 100644 (file)
@@ -78,6 +78,7 @@ graph bindings specified in Documentation/devicetree/bindings/graph.txt.
   remote endpoint phandle should be a reference to a valid mipi_dsi_host device
   node.
 - Video port 1 for the HDMI output
+- Audio port 2 for the HDMI audio input
 
 
 Example
@@ -112,5 +113,12 @@ Example
                                        remote-endpoint = <&hdmi_connector_in>;
                                };
                        };
+
+                       port@2 {
+                               reg = <2>;
+                               codec_endpoint: endpoint {
+                                       remote-endpoint = <&i2s0_cpu_endpoint>;
+                               };
+                       };
                };
        };
index cf92ebfe6ab70fcba79fcd53af1fd7b15dfefa29..67469c26bae88f9ada64e0866d73fbdcfe793886 100644 (file)
@@ -11,6 +11,7 @@
 #include <sound/hdmi-codec.h>
 #include <sound/pcm.h>
 #include <sound/soc.h>
+#include <linux/of_graph.h>
 
 #include "adv7511.h"
 
@@ -182,10 +183,31 @@ static void audio_shutdown(struct device *dev, void *data)
 {
 }
 
+static int adv7511_hdmi_i2s_get_dai_id(struct snd_soc_component *component,
+                                       struct device_node *endpoint)
+{
+       struct of_endpoint of_ep;
+       int ret;
+
+       ret = of_graph_parse_endpoint(endpoint, &of_ep);
+       if (ret < 0)
+               return ret;
+
+       /*
+        * HDMI sound should be located as reg = <2>
+        * Then, it is sound port 0
+        */
+       if (of_ep.port == 2)
+               return 0;
+
+       return -EINVAL;
+}
+
 static const struct hdmi_codec_ops adv7511_codec_ops = {
        .hw_params      = adv7511_hdmi_hw_params,
        .audio_shutdown = audio_shutdown,
        .audio_startup  = audio_startup,
+       .get_dai_id     = adv7511_hdmi_i2s_get_dai_id,
 };
 
 static struct hdmi_codec_pdata codec_data = {