From: Maxim Schwalm <maxim.schw...@gmail.com>

Some Tegra device-trees may specify a video output graph, which involves
MHL bridge/simple bridge and/or connector framework. This patch adds
support for the bridge/connector attached to the HDMI output, allowing
us to model the hardware properly.

Inspired by: 29efdc2 ("drm/tegra: output: rgb: Support LVDS encoder bridge")

Tested-by: Andreas Westman Dorcsak <hed...@yahoo.com> # ASUS TF T30
Tested-by: Maxim Schwalm <maxim.schw...@gmail.com> # ASUS P1801-T T30
Tested-by: Robert Eckelmann <longnose...@gmail.com> # ASUS TF101 T20
Tested-by: Svyatoslav Ryhel <clamo...@gmail.com> # ASUS TF201 T30
Signed-off-by: Maxim Schwalm <maxim.schw...@gmail.com>
Signed-off-by: Svyatoslav Ryhel <clamo...@gmail.com>
---
 drivers/gpu/drm/tegra/hdmi.c | 44 +++++++++++++++++++++++++++---------
 1 file changed, 33 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c
index 40ec3e6cf204..45b37b103785 100644
--- a/drivers/gpu/drm/tegra/hdmi.c
+++ b/drivers/gpu/drm/tegra/hdmi.c
@@ -19,6 +19,7 @@
 #include <soc/tegra/common.h>
 #include <sound/hdmi-codec.h>
 
+#include <drm/drm_bridge_connector.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_debugfs.h>
@@ -1544,26 +1545,47 @@ static int tegra_hdmi_init(struct host1x_client *client)
 {
        struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client);
        struct drm_device *drm = dev_get_drvdata(client->host);
+       struct drm_connector *connector;
        int err;
 
        hdmi->output.dev = client->dev;
 
-       drm_connector_init_with_ddc(drm, &hdmi->output.connector,
-                                   &tegra_hdmi_connector_funcs,
-                                   DRM_MODE_CONNECTOR_HDMIA,
-                                   hdmi->output.ddc);
-       drm_connector_helper_add(&hdmi->output.connector,
-                                &tegra_hdmi_connector_helper_funcs);
-       hdmi->output.connector.dpms = DRM_MODE_DPMS_OFF;
-
        drm_simple_encoder_init(drm, &hdmi->output.encoder,
                                DRM_MODE_ENCODER_TMDS);
        drm_encoder_helper_add(&hdmi->output.encoder,
                               &tegra_hdmi_encoder_helper_funcs);
 
-       drm_connector_attach_encoder(&hdmi->output.connector,
-                                         &hdmi->output.encoder);
-       drm_connector_register(&hdmi->output.connector);
+       if (hdmi->output.bridge) {
+               err = drm_bridge_attach(&hdmi->output.encoder, 
hdmi->output.bridge,
+                                       NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
+               if (err) {
+                       dev_err(client->dev, "failed to attach bridge: %d\n",
+                               err);
+                       return err;
+               }
+
+               connector = drm_bridge_connector_init(drm, 
&hdmi->output.encoder);
+               if (IS_ERR(connector)) {
+                       dev_err(client->dev,
+                               "failed to initialize bridge connector: %pe\n",
+                               connector);
+                       return PTR_ERR(connector);
+               }
+
+               drm_connector_attach_encoder(connector, &hdmi->output.encoder);
+       } else {
+               drm_connector_init_with_ddc(drm, &hdmi->output.connector,
+                                           &tegra_hdmi_connector_funcs,
+                                           DRM_MODE_CONNECTOR_HDMIA,
+                                           hdmi->output.ddc);
+               drm_connector_helper_add(&hdmi->output.connector,
+                                        &tegra_hdmi_connector_helper_funcs);
+               hdmi->output.connector.dpms = DRM_MODE_DPMS_OFF;
+
+               drm_connector_attach_encoder(&hdmi->output.connector,
+                                            &hdmi->output.encoder);
+               drm_connector_register(&hdmi->output.connector);
+       }
 
        err = tegra_output_init(drm, &hdmi->output);
        if (err < 0) {
-- 
2.37.2

Reply via email to