WARN_ON(!dsi_bus_is_locked(dsi));
 
+       if (WARN_ON(dsi->iface_enabled))
+               return;
+
        mutex_lock(&dsi->lock);
 
        r = dsi_runtime_get(dsi);
        if (r)
                goto err_init_dsi;
 
+       dsi->iface_enabled = true;
+
        mutex_unlock(&dsi->lock);
 
        return;
 {
        WARN_ON(!dsi_bus_is_locked(dsi));
 
+       if (WARN_ON(!dsi->iface_enabled))
+               return;
+
        mutex_lock(&dsi->lock);
 
        dsi_sync_vc(dsi, 0);
 
        dsi_runtime_put(dsi);
 
+       dsi->iface_enabled = false;
+
        mutex_unlock(&dsi->lock);
 }
 
 
        dsi_bus_lock(dsi);
 
-       if (dsi->video_enabled)
-               r = _omap_dsi_host_transfer(dsi, vc, msg);
-       else
-               r = -EIO;
+       if (!dsi->iface_enabled) {
+               dsi_enable(dsi);
+               schedule_delayed_work(&dsi->dsi_disable_work, msecs_to_jiffies(2000));
+       }
+
+       r = _omap_dsi_host_transfer(dsi, vc, msg);
 
        dsi_bus_unlock(dsi);
 
        if (WARN_ON(dsi->dsidev != client))
                return -EINVAL;
 
+       cancel_delayed_work_sync(&dsi->dsi_disable_work);
+
+       dsi_bus_lock(dsi);
+
+       if (dsi->iface_enabled)
+               dsi_disable(dsi);
+
+       dsi_bus_unlock(dsi);
+
        omap_dsi_unregister_te_irq(dsi);
        dsi->dsidev = NULL;
        return 0;
        struct dsi_data *dsi = drm_bridge_to_dsi(bridge);
        struct omap_dss_device *dssdev = &dsi->output;
 
+       cancel_delayed_work_sync(&dsi->dsi_disable_work);
+
        dsi_bus_lock(dsi);
 
-       dsi_enable(dsi);
+       if (!dsi->iface_enabled)
+               dsi_enable(dsi);
 
        dsi_enable_video_output(dssdev, VC_VIDEO);
 
        struct dsi_data *dsi = drm_bridge_to_dsi(bridge);
        struct omap_dss_device *dssdev = &dsi->output;
 
+       cancel_delayed_work_sync(&dsi->dsi_disable_work);
+
        dsi_bus_lock(dsi);
 
        dsi->video_enabled = false;
        { /* sentinel */ }
 };
 
+static void omap_dsi_disable_work_callback(struct work_struct *work)
+{
+       struct dsi_data *dsi = container_of(work, struct dsi_data, dsi_disable_work.work);
+
+       dsi_bus_lock(dsi);
+
+       if (dsi->iface_enabled && !dsi->video_enabled)
+               dsi_disable(dsi);
+
+       dsi_bus_unlock(dsi);
+}
+
 static int dsi_probe(struct platform_device *pdev)
 {
        const struct soc_device_attribute *soc;
        INIT_DEFERRABLE_WORK(&dsi->framedone_timeout_work,
                             dsi_framedone_timeout_work_callback);
 
+       INIT_DEFERRABLE_WORK(&dsi->dsi_disable_work, omap_dsi_disable_work_callback);
+
 #ifdef DSI_CATCH_MISSING_TE
        timer_setup(&dsi->te_timer, dsi_te_timeout, 0);
 #endif