*/
 static int dss_init_connections(struct omap_dss_device *dssdev, bool force)
 {
+       struct omap_dss_output *out;
        struct omap_overlay_manager *mgr;
        int i, r;
 
-       WARN_ON(dssdev->manager);
+       out = omapdss_get_output_from_dssdev(dssdev);
+
+       WARN_ON(dssdev->output);
+       WARN_ON(out->device);
+
+       r = omapdss_output_set_device(out, dssdev);
+       if (r) {
+               DSSERR("failed to connect output to new device\n");
+               return r;
+       }
 
        mgr = omap_dss_get_overlay_manager(dssdev->channel);
 
-       if (mgr->device && !force)
+       if (mgr->output && !force)
                return 0;
 
-       if (mgr->device)
-               mgr->unset_device(mgr);
+       if (mgr->output)
+               mgr->unset_output(mgr);
 
-       r = mgr->set_device(mgr, dssdev);
+       r = mgr->set_output(mgr, out);
        if (r) {
-               DSSERR("failed to set initial manager\n");
+               DSSERR("failed to connect manager to output of new device\n");
+
+               /* remove the output-device connection we just made */
+               omapdss_output_unset_device(out);
                return r;
        }
 
 
 static void dss_uninit_connections(struct omap_dss_device *dssdev)
 {
-       if (dssdev->manager)
-               dssdev->manager->unset_device(dssdev->manager);
+       if (dssdev->output) {
+               struct omap_overlay_manager *mgr = dssdev->output->manager;
+
+               if (mgr)
+                       mgr->unset_output(mgr);
+
+               omapdss_output_unset_device(dssdev->output);
+       }
 }
 
 int dss_init_device(struct platform_device *pdev,
 
 
        return NULL;
 }
+
+struct omap_dss_output *omapdss_get_output_from_dssdev(struct omap_dss_device *dssdev)
+{
+       struct omap_dss_output *out = NULL;
+       enum omap_dss_output_id id;
+
+       switch (dssdev->type) {
+       case OMAP_DISPLAY_TYPE_DPI:
+               out = omap_dss_get_output(OMAP_DSS_OUTPUT_DPI);
+               break;
+       case OMAP_DISPLAY_TYPE_DBI:
+               out = omap_dss_get_output(OMAP_DSS_OUTPUT_DBI);
+               break;
+       case OMAP_DISPLAY_TYPE_SDI:
+               out = omap_dss_get_output(OMAP_DSS_OUTPUT_SDI);
+               break;
+       case OMAP_DISPLAY_TYPE_VENC:
+               out = omap_dss_get_output(OMAP_DSS_OUTPUT_VENC);
+               break;
+       case OMAP_DISPLAY_TYPE_HDMI:
+               out = omap_dss_get_output(OMAP_DSS_OUTPUT_HDMI);
+               break;
+       case OMAP_DISPLAY_TYPE_DSI:
+               id = dssdev->phy.dsi.module == 0 ? OMAP_DSS_OUTPUT_DSI1 :
+                                       OMAP_DSS_OUTPUT_DSI2;
+               out = omap_dss_get_output(id);
+               break;
+       default:
+               break;
+       }
+
+       return out;
+}