|
@@ -545,6 +545,8 @@ struct panel_drv_data {
|
|
|
struct omap_dss_device *dssdev;
|
|
|
|
|
|
struct panel_config *panel_config;
|
|
|
+
|
|
|
+ struct mutex lock;
|
|
|
};
|
|
|
|
|
|
static inline struct panel_generic_dpi_data
|
|
@@ -634,6 +636,8 @@ static int generic_dpi_panel_probe(struct omap_dss_device *dssdev)
|
|
|
drv_data->dssdev = dssdev;
|
|
|
drv_data->panel_config = panel_config;
|
|
|
|
|
|
+ mutex_init(&drv_data->lock);
|
|
|
+
|
|
|
dev_set_drvdata(&dssdev->dev, drv_data);
|
|
|
|
|
|
return 0;
|
|
@@ -652,56 +656,106 @@ static void __exit generic_dpi_panel_remove(struct omap_dss_device *dssdev)
|
|
|
|
|
|
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 = {
|
|
@@ -714,6 +768,7 @@ 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 = {
|