aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArchit Taneja <archit@ti.com>2012-08-08 04:50:30 -0400
committerArchit Taneja <archit@ti.com>2012-08-13 06:14:39 -0400
commite19d659bbf040823048101c31e3b213d13dd815f (patch)
treea87ac11d778cd420cee5f9ba6d474baa5c3045e0
parentc8a5e4e86d998274306dc906f5a24bb0e96aa14c (diff)
OMAPDSS: Displays: Add locking in generic DPI panel driver
The generic DPI panel driver doesn't currently have locking to ensure that the display states and the driver data is maintained correctly. Add mutex locking to take care of this. Add a new get_timings driver op to override the default get_timings op. The new driver op contains locking to ensure the correct panel timings are seen when a DSS2 user calls device->driver->get_timings. Signed-off-by: Archit Taneja <archit@ti.com>
-rw-r--r--drivers/video/omap2/displays/panel-generic-dpi.c69
1 files changed, 62 insertions, 7 deletions
diff --git a/drivers/video/omap2/displays/panel-generic-dpi.c b/drivers/video/omap2/displays/panel-generic-dpi.c
index bc5af2500eb9..69e78a55283a 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 {
545 struct omap_dss_device *dssdev; 545 struct omap_dss_device *dssdev;
546 546
547 struct panel_config *panel_config; 547 struct panel_config *panel_config;
548
549 struct mutex lock;
548}; 550};
549 551
550static inline struct panel_generic_dpi_data 552static inline struct panel_generic_dpi_data
@@ -634,6 +636,8 @@ static int generic_dpi_panel_probe(struct omap_dss_device *dssdev)
634 drv_data->dssdev = dssdev; 636 drv_data->dssdev = dssdev;
635 drv_data->panel_config = panel_config; 637 drv_data->panel_config = panel_config;
636 638
639 mutex_init(&drv_data->lock);
640
637 dev_set_drvdata(&dssdev->dev, drv_data); 641 dev_set_drvdata(&dssdev->dev, drv_data);
638 642
639 return 0; 643 return 0;
@@ -652,56 +656,106 @@ static void __exit generic_dpi_panel_remove(struct omap_dss_device *dssdev)
652 656
653static int generic_dpi_panel_enable(struct omap_dss_device *dssdev) 657static int generic_dpi_panel_enable(struct omap_dss_device *dssdev)
654{ 658{
655 int r = 0; 659 struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
660 int r;
661
662 mutex_lock(&drv_data->lock);
656 663
657 r = generic_dpi_panel_power_on(dssdev); 664 r = generic_dpi_panel_power_on(dssdev);
658 if (r) 665 if (r)
659 return r; 666 goto err;
660 667
661 dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; 668 dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
669err:
670 mutex_unlock(&drv_data->lock);
662 671
663 return 0; 672 return r;
664} 673}
665 674
666static void generic_dpi_panel_disable(struct omap_dss_device *dssdev) 675static void generic_dpi_panel_disable(struct omap_dss_device *dssdev)
667{ 676{
677 struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
678
679 mutex_lock(&drv_data->lock);
680
668 generic_dpi_panel_power_off(dssdev); 681 generic_dpi_panel_power_off(dssdev);
669 682
670 dssdev->state = OMAP_DSS_DISPLAY_DISABLED; 683 dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
684
685 mutex_unlock(&drv_data->lock);
671} 686}
672 687
673static int generic_dpi_panel_suspend(struct omap_dss_device *dssdev) 688static int generic_dpi_panel_suspend(struct omap_dss_device *dssdev)
674{ 689{
690 struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
691
692 mutex_lock(&drv_data->lock);
693
675 generic_dpi_panel_power_off(dssdev); 694 generic_dpi_panel_power_off(dssdev);
676 695
677 dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED; 696 dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
678 697
698 mutex_unlock(&drv_data->lock);
699
679 return 0; 700 return 0;
680} 701}
681 702
682static int generic_dpi_panel_resume(struct omap_dss_device *dssdev) 703static int generic_dpi_panel_resume(struct omap_dss_device *dssdev)
683{ 704{
684 int r = 0; 705 struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
706 int r;
707
708 mutex_lock(&drv_data->lock);
685 709
686 r = generic_dpi_panel_power_on(dssdev); 710 r = generic_dpi_panel_power_on(dssdev);
687 if (r) 711 if (r)
688 return r; 712 goto err;
689 713
690 dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; 714 dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
691 715
692 return 0; 716err:
717 mutex_unlock(&drv_data->lock);
718
719 return r;
693} 720}
694 721
695static void generic_dpi_panel_set_timings(struct omap_dss_device *dssdev, 722static void generic_dpi_panel_set_timings(struct omap_dss_device *dssdev,
696 struct omap_video_timings *timings) 723 struct omap_video_timings *timings)
697{ 724{
725 struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
726
727 mutex_lock(&drv_data->lock);
728
698 dpi_set_timings(dssdev, timings); 729 dpi_set_timings(dssdev, timings);
730
731 mutex_unlock(&drv_data->lock);
732}
733
734static void generic_dpi_panel_get_timings(struct omap_dss_device *dssdev,
735 struct omap_video_timings *timings)
736{
737 struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
738
739 mutex_lock(&drv_data->lock);
740
741 *timings = dssdev->panel.timings;
742
743 mutex_unlock(&drv_data->lock);
699} 744}
700 745
701static int generic_dpi_panel_check_timings(struct omap_dss_device *dssdev, 746static int generic_dpi_panel_check_timings(struct omap_dss_device *dssdev,
702 struct omap_video_timings *timings) 747 struct omap_video_timings *timings)
703{ 748{
704 return dpi_check_timings(dssdev, timings); 749 struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
750 int r;
751
752 mutex_lock(&drv_data->lock);
753
754 r = dpi_check_timings(dssdev, timings);
755
756 mutex_unlock(&drv_data->lock);
757
758 return r;
705} 759}
706 760
707static struct omap_dss_driver dpi_driver = { 761static struct omap_dss_driver dpi_driver = {
@@ -714,6 +768,7 @@ static struct omap_dss_driver dpi_driver = {
714 .resume = generic_dpi_panel_resume, 768 .resume = generic_dpi_panel_resume,
715 769
716 .set_timings = generic_dpi_panel_set_timings, 770 .set_timings = generic_dpi_panel_set_timings,
771 .get_timings = generic_dpi_panel_get_timings,
717 .check_timings = generic_dpi_panel_check_timings, 772 .check_timings = generic_dpi_panel_check_timings,
718 773
719 .driver = { 774 .driver = {