diff options
Diffstat (limited to 'drivers/video/omap2/displays/panel-generic-dpi.c')
| -rw-r--r-- | drivers/video/omap2/displays/panel-generic-dpi.c | 76 | 
1 files changed, 68 insertions, 8 deletions
diff --git a/drivers/video/omap2/displays/panel-generic-dpi.c b/drivers/video/omap2/displays/panel-generic-dpi.c index bc5af2500eb..88295c52681 100644 --- a/drivers/video/omap2/displays/panel-generic-dpi.c +++ b/drivers/video/omap2/displays/panel-generic-dpi.c @@ -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 @@ -563,6 +565,9 @@ static int generic_dpi_panel_power_on(struct omap_dss_device *dssdev)  	if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)  		return 0; +	omapdss_dpi_set_timings(dssdev, &dssdev->panel.timings); +	omapdss_dpi_set_data_lines(dssdev, dssdev->phy.dpi.data_lines); +  	r = omapdss_dpi_display_enable(dssdev);  	if (r)  		goto err0; @@ -634,6 +639,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 +659,108 @@ 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)  { -	dpi_set_timings(dssdev, timings); +	struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev); + +	mutex_lock(&drv_data->lock); + +	omapdss_dpi_set_timings(dssdev, timings); + +	dssdev->panel.timings = *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 +773,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         = {  |