struct omap_dss_device *dssdev;
 
        struct panel_config *panel_config;
+
+       struct mutex lock;
 };
 
 static inline struct panel_generic_dpi_data
        drv_data->dssdev = dssdev;
        drv_data->panel_config = panel_config;
 
+       mutex_init(&drv_data->lock);
+
        dev_set_drvdata(&dssdev->dev, drv_data);
 
        return 0;
 
 static int generic_dpi_panel_enable(struct omap_dss_device *dssdev)
 {
-       int r = 0;
+       struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+       int r;
+
+       mutex_lock(&drv_data->lock);
 
        r = generic_dpi_panel_power_on(dssdev);
        if (r)
-               return r;
+               goto err;
 
        dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+err:
+       mutex_unlock(&drv_data->lock);
 
-       return 0;
+       return r;
 }
 
 static void generic_dpi_panel_disable(struct omap_dss_device *dssdev)
 {
+       struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+
+       mutex_lock(&drv_data->lock);
+
        generic_dpi_panel_power_off(dssdev);
 
        dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
+
+       mutex_unlock(&drv_data->lock);
 }
 
 static int generic_dpi_panel_suspend(struct omap_dss_device *dssdev)
 {
+       struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+
+       mutex_lock(&drv_data->lock);
+
        generic_dpi_panel_power_off(dssdev);
 
        dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
 
+       mutex_unlock(&drv_data->lock);
+
        return 0;
 }
 
 static int generic_dpi_panel_resume(struct omap_dss_device *dssdev)
 {
-       int r = 0;
+       struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+       int r;
+
+       mutex_lock(&drv_data->lock);
 
        r = generic_dpi_panel_power_on(dssdev);
        if (r)
-               return r;
+               goto err;
 
        dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
 
-       return 0;
+err:
+       mutex_unlock(&drv_data->lock);
+
+       return r;
 }
 
 static void generic_dpi_panel_set_timings(struct omap_dss_device *dssdev,
                struct omap_video_timings *timings)
 {
+       struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+
+       mutex_lock(&drv_data->lock);
+
        dpi_set_timings(dssdev, timings);
+
+       mutex_unlock(&drv_data->lock);
+}
+
+static void generic_dpi_panel_get_timings(struct omap_dss_device *dssdev,
+               struct omap_video_timings *timings)
+{
+       struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+
+       mutex_lock(&drv_data->lock);
+
+       *timings = dssdev->panel.timings;
+
+       mutex_unlock(&drv_data->lock);
 }
 
 static int generic_dpi_panel_check_timings(struct omap_dss_device *dssdev,
                struct omap_video_timings *timings)
 {
-       return dpi_check_timings(dssdev, timings);
+       struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+       int r;
+
+       mutex_lock(&drv_data->lock);
+
+       r = dpi_check_timings(dssdev, timings);
+
+       mutex_unlock(&drv_data->lock);
+
+       return r;
 }
 
 static struct omap_dss_driver dpi_driver = {
        .resume         = generic_dpi_panel_resume,
 
        .set_timings    = generic_dpi_panel_set_timings,
+       .get_timings    = generic_dpi_panel_get_timings,
        .check_timings  = generic_dpi_panel_check_timings,
 
        .driver         = {