drm: dw-hdmi-i2s: add .get_dai_id callback for ALSA SoC
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Mon, 19 Jun 2017 00:39:29 +0000 (00:39 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 28 Jun 2017 19:46:39 +0000 (20:46 +0100)
ALSA SoC needs to know connected DAI ID for probing.
It is not a big problem if device/driver was only for sound,
but getting DAI ID will be difficult if device includes both
Video/Sound, like HDMI.
To solve this issue, this patch adds new .get_dai_id callback
on hdmi_codec_ops.
dw-hdmi-i2s will assume that HDMI sound will be connected
to reg = <2>. Then, ALSA SoC side will recognized it as DAI 0

ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
/* HDMI Video IN */
};
port@1 {
reg = <1>;
/* HDMI OUT */
};
port@2 {
reg = <2>;
/* HDMI Sound IN */
};
};

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Acked-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
Documentation/devicetree/bindings/display/bridge/renesas,dw-hdmi.txt
drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c

index f6b3f36d422b2a85d35f5af4ac64deec1a51ec60..81b68580e19995e5c292ce70d9f5395d5e30d8c3 100644 (file)
@@ -25,7 +25,8 @@ Required properties:
 - clock-names: Shall contain "iahb" and "isfr" as defined in dw_hdmi.txt.
 - ports: See dw_hdmi.txt. The DWC HDMI shall have one port numbered 0
   corresponding to the video input of the controller and one port numbered 1
-  corresponding to its HDMI output. Each port shall have a single endpoint.
+  corresponding to its HDMI output, and one port numbered 2 corresponding to
+  sound input of the controller. Each port shall have a single endpoint.
 
 Optional properties:
 
@@ -59,6 +60,12 @@ Example:
                                        remote-endpoint = <&hdmi0_con>;
                                };
                        };
+                       port@2 {
+                               reg = <2>;
+                               rcar_dw_hdmi0_sound_in: endpoint {
+                                       remote-endpoint = <&hdmi_sound_out>;
+                               };
+                       };
                };
        };
 
index aaf287d2e91d057b3bf5e149ba4a21033755cf06..b2cf59f54c889e528b1a7c7bc6371c899594bd20 100644 (file)
@@ -82,9 +82,30 @@ static void dw_hdmi_i2s_audio_shutdown(struct device *dev, void *data)
        hdmi_write(audio, HDMI_AUD_CONF0_SW_RESET, HDMI_AUD_CONF0);
 }
 
+static int dw_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 struct hdmi_codec_ops dw_hdmi_i2s_ops = {
        .hw_params      = dw_hdmi_i2s_hw_params,
        .audio_shutdown = dw_hdmi_i2s_audio_shutdown,
+       .get_dai_id     = dw_hdmi_i2s_get_dai_id,
 };
 
 static int snd_dw_hdmi_probe(struct platform_device *pdev)