#include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge_connector.h>
-#include <drm/drm_panel.h>
 #include <drm/drm_simple_kms_helper.h>
 
 #include "drm.h"
                tegra_dc_writel(dc, table[i].value, table[i].offset);
 }
 
-static const struct drm_connector_funcs tegra_rgb_connector_funcs = {
-       .reset = drm_atomic_helper_connector_reset,
-       .detect = tegra_output_connector_detect,
-       .fill_modes = drm_helper_probe_single_connector_modes,
-       .destroy = tegra_output_connector_destroy,
-       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
-       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
-};
-
-static enum drm_mode_status
-tegra_rgb_connector_mode_valid(struct drm_connector *connector,
-                              struct drm_display_mode *mode)
-{
-       /*
-        * FIXME: For now, always assume that the mode is okay. There are
-        * unresolved issues with clk_round_rate(), which doesn't always
-        * reliably report whether a frequency can be set or not.
-        */
-       return MODE_OK;
-}
-
-static const struct drm_connector_helper_funcs tegra_rgb_connector_helper_funcs = {
-       .get_modes = tegra_output_connector_get_modes,
-       .mode_valid = tegra_rgb_connector_mode_valid,
-};
-
 static void tegra_rgb_encoder_disable(struct drm_encoder *encoder)
 {
        struct tegra_output *output = encoder_to_output(encoder);
        struct tegra_rgb *rgb = to_rgb(output);
 
-       if (output->panel)
-               drm_panel_disable(output->panel);
-
        tegra_dc_write_regs(rgb->dc, rgb_disable, ARRAY_SIZE(rgb_disable));
        tegra_dc_commit(rgb->dc);
-
-       if (output->panel)
-               drm_panel_unprepare(output->panel);
 }
 
 static void tegra_rgb_encoder_enable(struct drm_encoder *encoder)
        struct tegra_rgb *rgb = to_rgb(output);
        u32 value;
 
-       if (output->panel)
-               drm_panel_prepare(output->panel);
-
        tegra_dc_write_regs(rgb->dc, rgb_enable, ARRAY_SIZE(rgb_enable));
 
        value = DE_SELECT_ACTIVE | DE_CONTROL_NORMAL;
        tegra_dc_writel(rgb->dc, value, DC_DISP_SHIFT_CLOCK_OPTIONS);
 
        tegra_dc_commit(rgb->dc);
-
-       if (output->panel)
-               drm_panel_enable(output->panel);
 }
 
 static int
        drm_encoder_helper_add(&output->encoder,
                               &tegra_rgb_encoder_helper_funcs);
 
+       /*
+        * Wrap directly-connected panel into DRM bridge in order to let
+        * DRM core to handle panel for us.
+        */
+       if (output->panel) {
+               output->bridge = devm_drm_panel_bridge_add(output->dev,
+                                                          output->panel);
+               if (IS_ERR(output->bridge)) {
+                       dev_err(output->dev,
+                               "failed to wrap panel into bridge: %pe\n",
+                               output->bridge);
+                       return PTR_ERR(output->bridge);
+               }
+
+               output->panel = NULL;
+       }
+
        /*
         * Tegra devices that have LVDS panel utilize LVDS encoder bridge
         * for converting up to 28 LCD LVTTL lanes into 5/4 LVDS lanes that
         * Newer device-trees utilize LVDS encoder bridge, which provides
         * us with a connector and handles the display panel.
         *
-        * For older device-trees we fall back to our own connector and use
-        * nvidia,panel phandle.
+        * For older device-trees we wrapped panel into the panel-bridge.
         */
        if (output->bridge) {
                err = drm_bridge_attach(&output->encoder, output->bridge,
                }
 
                drm_connector_attach_encoder(connector, &output->encoder);
-       } else {
-               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_connector_attach_encoder(&output->connector,
-                                            &output->encoder);
-               drm_connector_register(&output->connector);
        }
 
        err = tegra_output_init(drm, output);