struct omap_dss_device *src = ddata->src;
        u8 id1, id2, id3;
        int r;
-       struct omap_dss_dsi_config dsi_config = {
-               .vm = &ddata->vm,
-               .hs_clk_min = 150000000,
-               .hs_clk_max = 300000000,
-               .lp_clk_min = 7000000,
-               .lp_clk_max = 10000000,
-       };
-
-       r = regulator_bulk_enable(ARRAY_SIZE(ddata->supplies), ddata->supplies);
-       if (r) {
-               dev_err(&ddata->dsi->dev, "failed to enable supplies: %d\n", r);
-               return r;
-       }
-
-       r = src->ops->dsi.set_config(src, &dsi_config);
-       if (r) {
-               dev_err(&ddata->dsi->dev, "failed to configure DSI\n");
-               goto err_regulators;
-       }
-
-       src->ops->enable(src);
 
        dsicm_hw_reset(ddata);
 
 
        dsicm_hw_reset(ddata);
 
-       src->ops->disable(src);
-err_regulators:
-       r = regulator_bulk_disable(ARRAY_SIZE(ddata->supplies), ddata->supplies);
-       if (r)
-               dev_err(&ddata->dsi->dev, "failed to disable supplies: %d\n", r);
-
        return r;
 }
 
        struct omap_dss_device *src = ddata->src;
        int r;
 
+       ddata->enabled = false;
+
        src->ops->dsi.disable_video_output(src, ddata->dsi->channel);
 
        r = mipi_dsi_dcs_set_display_off(ddata->dsi);
                                "error disabling panel, issuing HW reset\n");
                dsicm_hw_reset(ddata);
        }
-
-       src->ops->disable(src);
-
-       r = regulator_bulk_disable(ARRAY_SIZE(ddata->supplies), ddata->supplies);
-       if (r)
-               dev_err(&ddata->dsi->dev, "failed to disable supplies: %d\n", r);
-
-       ddata->enabled = false;
 }
 
 static int dsicm_connect(struct omap_dss_device *src,
        ddata->src = NULL;
 }
 
+static void dsicm_pre_enable(struct omap_dss_device *dssdev)
+{
+       struct panel_drv_data *ddata = to_panel_data(dssdev);
+       struct omap_dss_device *src = ddata->src;
+       int r;
+       struct omap_dss_dsi_config dsi_config = {
+               .vm = &ddata->vm,
+               .hs_clk_min = 150000000,
+               .hs_clk_max = 300000000,
+               .lp_clk_min = 7000000,
+               .lp_clk_max = 10000000,
+       };
+
+       r = regulator_bulk_enable(ARRAY_SIZE(ddata->supplies), ddata->supplies);
+       if (r)
+               dev_err(&ddata->dsi->dev, "failed to enable supplies: %d\n", r);
+
+       r = src->ops->dsi.set_config(src, &dsi_config);
+       if (r) {
+               dev_err(&ddata->dsi->dev, "failed to configure DSI\n");
+       }
+}
+
 static void dsicm_enable(struct omap_dss_device *dssdev)
 {
        struct panel_drv_data *ddata = to_panel_data(dssdev);
        mutex_unlock(&ddata->lock);
 }
 
+static void dsicm_post_disable(struct omap_dss_device *dssdev)
+{
+       struct panel_drv_data *ddata = to_panel_data(dssdev);
+       int r;
+
+       r = regulator_bulk_disable(ARRAY_SIZE(ddata->supplies), ddata->supplies);
+       if (r)
+               dev_err(&ddata->dsi->dev, "failed to disable supplies: %d\n", r);
+}
+
 static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
 {
        struct mipi_dsi_device *dsi = ddata->dsi;
        .connect        = dsicm_connect,
        .disconnect     = dsicm_disconnect,
 
+       .pre_enable     = dsicm_pre_enable,
        .enable         = dsicm_enable,
        .disable        = dsicm_disable,
+       .post_disable   = dsicm_post_disable,
 
        .get_modes      = dsicm_get_modes,
        .check_timings  = dsicm_check_timings,
 
        omapdss_device_unregister(dssdev);
 
-       if (omapdss_device_is_enabled(dssdev))
-               dsicm_disable(dssdev);
        omapdss_device_disconnect(ddata->src, dssdev);
 
        sysfs_remove_group(&dsi->dev.kobj, &dsicm_attr_group);
 
         */
        omapdss_device_disable(dssdev->next);
 
-       /*
-        * Disable the internal encoder. This will disable the DSS output. The
-        * DSI is treated as an exception as DSI pipelines still use the legacy
-        * flow where the pipeline output controls the encoder.
-        */
-       if (dssdev->type != OMAP_DISPLAY_TYPE_DSI) {
-               if (dssdev->ops && dssdev->ops->disable)
-                       dssdev->ops->disable(dssdev);
-               dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
-       }
+       /* Disable the internal encoder. This will disable the DSS output. */
+       if (dssdev->ops && dssdev->ops->disable)
+               dssdev->ops->disable(dssdev);
+       dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 
        /*
         * Perform the post-disable operations on the chain of external devices
        /* Prepare the chain of external devices for pipeline enable. */
        omapdss_device_pre_enable(dssdev->next);
 
-       /*
-        * Enable the internal encoder. This will enable the DSS output. The
-        * DSI is treated as an exception as DSI pipelines still use the legacy
-        * flow where the pipeline output controls the encoder.
-        */
-       if (dssdev->type != OMAP_DISPLAY_TYPE_DSI) {
-               if (dssdev->ops && dssdev->ops->enable)
-                       dssdev->ops->enable(dssdev);
-               dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-       }
+       /* Enable the internal encoder. This will enable the DSS output. */
+       if (dssdev->ops && dssdev->ops->enable)
+               dssdev->ops->enable(dssdev);
+       dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
 
        /*
         * Enable the chain of external devices, starting at the one at the