@@ -275,21 +275,32 @@ int tegra_dc_rgb_init(struct drm_device *drm, struct tegra_dc *dc)
if (!dc->rgb)
return -ENODEV;
+ drm_encoder_init(drm, &output->encoder, &tegra_rgb_encoder_funcs,
+ DRM_MODE_ENCODER_LVDS, NULL);
+ drm_encoder_helper_add(&output->encoder,
+ &tegra_rgb_encoder_helper_funcs);
+
+ /*
+ * We don't create a parent "output bridge" that sets the
+ * DRM_BRIDGE_ATTACH_NO_CONNECTOR flag for drm_bridge_attach(),
+ * and thus, the bridge creates connector for us in this case.
+ * The output's connector is unused and not needed if bridge is
+ * used, so skip the connector's registration in this case.
+ */
+ if (output->bridge)
+ goto init_output;
+
drm_connector_init(drm, &output->connector, &tegra_rgb_connector_funcs,
DRM_MODE_CONNECTOR_LVDS);
drm_connector_helper_add(&output->connector,
&tegra_rgb_connector_helper_funcs);
output->connector.dpms = DRM_MODE_DPMS_OFF;
- drm_encoder_init(drm, &output->encoder, &tegra_rgb_encoder_funcs,
- DRM_MODE_ENCODER_LVDS, NULL);
- drm_encoder_helper_add(&output->encoder,
- &tegra_rgb_encoder_helper_funcs);
-
drm_connector_attach_encoder(&output->connector,
&output->encoder);
drm_connector_register(&output->connector);
+init_output:
err = tegra_output_init(drm, output);
if (err < 0) {
dev_err(output->dev, "failed to initialize output: %d\n", err);
We rely on the connector that is created by the bridge, and thus, the Tegra's output connector is not needed in this case because it will be an unused connector. Signed-off-by: Dmitry Osipenko <digetx@gmail.com> --- drivers/gpu/drm/tegra/rgb.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-)