aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2013-05-24 06:18:52 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2013-06-17 07:00:59 -0400
commit0b24edb1c7d5aeadde0e38337b9b86fe16064505 (patch)
tree185138c46f3129daa146c6f9470b2915cea7008e
parent4635c17d32359e10bcaba3d1835e4aaaea685298 (diff)
OMAPDSS: DPI: Add ops
Add "ops" style method for using DPI functionality. Ops style calls will allow us to have arbitrarily long display pipelines, where each entity can call ops in the previous display entity. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
-rw-r--r--drivers/video/omap2/dss/dpi.c70
-rw-r--r--include/video/omapdss.h23
2 files changed, 93 insertions, 0 deletions
diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c
index 5351d02e3064..6433eab6bcf2 100644
--- a/drivers/video/omap2/dss/dpi.c
+++ b/drivers/video/omap2/dss/dpi.c
@@ -461,6 +461,16 @@ void omapdss_dpi_set_timings(struct omap_dss_device *dssdev,
461} 461}
462EXPORT_SYMBOL(omapdss_dpi_set_timings); 462EXPORT_SYMBOL(omapdss_dpi_set_timings);
463 463
464static void dpi_get_timings(struct omap_dss_device *dssdev,
465 struct omap_video_timings *timings)
466{
467 mutex_lock(&dpi.lock);
468
469 *timings = dpi.timings;
470
471 mutex_unlock(&dpi.lock);
472}
473
464int dpi_check_timings(struct omap_dss_device *dssdev, 474int dpi_check_timings(struct omap_dss_device *dssdev,
465 struct omap_video_timings *timings) 475 struct omap_video_timings *timings)
466{ 476{
@@ -678,6 +688,65 @@ static int dpi_probe_pdata(struct platform_device *dpidev)
678 return 0; 688 return 0;
679} 689}
680 690
691static int dpi_connect(struct omap_dss_device *dssdev,
692 struct omap_dss_device *dst)
693{
694 struct omap_overlay_manager *mgr;
695 int r;
696
697 r = dpi_init_regulator();
698 if (r)
699 return r;
700
701 dpi_init_pll();
702
703 mgr = omap_dss_get_overlay_manager(dssdev->dispc_channel);
704 if (!mgr)
705 return -ENODEV;
706
707 r = dss_mgr_connect(mgr, dssdev);
708 if (r)
709 return r;
710
711 r = omapdss_output_set_device(dssdev, dst);
712 if (r) {
713 DSSERR("failed to connect output to new device: %s\n",
714 dst->name);
715 dss_mgr_disconnect(mgr, dssdev);
716 return r;
717 }
718
719 return 0;
720}
721
722static void dpi_disconnect(struct omap_dss_device *dssdev,
723 struct omap_dss_device *dst)
724{
725 WARN_ON(dst != dssdev->device);
726
727 if (dst != dssdev->device)
728 return;
729
730 omapdss_output_unset_device(dssdev);
731
732 if (dssdev->manager)
733 dss_mgr_disconnect(dssdev->manager, dssdev);
734}
735
736static const struct omapdss_dpi_ops dpi_ops = {
737 .connect = dpi_connect,
738 .disconnect = dpi_disconnect,
739
740 .enable = omapdss_dpi_display_enable,
741 .disable = omapdss_dpi_display_disable,
742
743 .check_timings = dpi_check_timings,
744 .set_timings = omapdss_dpi_set_timings,
745 .get_timings = dpi_get_timings,
746
747 .set_data_lines = omapdss_dpi_set_data_lines,
748};
749
681static void dpi_init_output(struct platform_device *pdev) 750static void dpi_init_output(struct platform_device *pdev)
682{ 751{
683 struct omap_dss_device *out = &dpi.output; 752 struct omap_dss_device *out = &dpi.output;
@@ -687,6 +756,7 @@ static void dpi_init_output(struct platform_device *pdev)
687 out->output_type = OMAP_DISPLAY_TYPE_DPI; 756 out->output_type = OMAP_DISPLAY_TYPE_DPI;
688 out->name = "dpi.0"; 757 out->name = "dpi.0";
689 out->dispc_channel = dpi_get_channel(); 758 out->dispc_channel = dpi_get_channel();
759 out->ops.dpi = &dpi_ops;
690 out->owner = THIS_MODULE; 760 out->owner = THIS_MODULE;
691 761
692 omapdss_register_output(out); 762 omapdss_register_output(out);
diff --git a/include/video/omapdss.h b/include/video/omapdss.h
index cff514eec584..71fe1566ce01 100644
--- a/include/video/omapdss.h
+++ b/include/video/omapdss.h
@@ -573,6 +573,25 @@ struct omap_dss_writeback_info {
573 u8 pre_mult_alpha; 573 u8 pre_mult_alpha;
574}; 574};
575 575
576struct omapdss_dpi_ops {
577 int (*connect)(struct omap_dss_device *dssdev,
578 struct omap_dss_device *dst);
579 void (*disconnect)(struct omap_dss_device *dssdev,
580 struct omap_dss_device *dst);
581
582 int (*enable)(struct omap_dss_device *dssdev);
583 void (*disable)(struct omap_dss_device *dssdev);
584
585 int (*check_timings)(struct omap_dss_device *dssdev,
586 struct omap_video_timings *timings);
587 void (*set_timings)(struct omap_dss_device *dssdev,
588 struct omap_video_timings *timings);
589 void (*get_timings)(struct omap_dss_device *dssdev,
590 struct omap_video_timings *timings);
591
592 void (*set_data_lines)(struct omap_dss_device *dssdev, int data_lines);
593};
594
576struct omap_dss_device { 595struct omap_dss_device {
577 /* old device, to be removed */ 596 /* old device, to be removed */
578 struct device old_dev; 597 struct device old_dev;
@@ -638,6 +657,10 @@ struct omap_dss_device {
638 657
639 struct omap_dss_driver *driver; 658 struct omap_dss_driver *driver;
640 659
660 union {
661 const struct omapdss_dpi_ops *dpi;
662 } ops;
663
641 /* helper variable for driver suspend/resume */ 664 /* helper variable for driver suspend/resume */
642 bool activate_after_resume; 665 bool activate_after_resume;
643 666