aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2018-02-13 07:00:42 -0500
committerTomi Valkeinen <tomi.valkeinen@ti.com>2018-03-01 02:18:18 -0500
commit50638ae569dc097a95218eb70140e68aa213b07c (patch)
treeee05794dd9530d70183c7e3f5d649e2a95940e12
parentd3541ca81dbddeefa0c42df448211a9dbaef0843 (diff)
drm: omapdrm: dispc: Pass DISPC pointer to dispc_ops operations
This removes the need to access the global DISPC private data in those functions (both for the current accesses and the future ones that will be introduced when allocating the DISPC private data dynamically). In order to allow the omapdrm side to call the dispc_ops with a DISPC pointer, we also introduce a new function dss_get_dispc() to retrieve the DISPC corresponding to the DSS. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
-rw-r--r--drivers/gpu/drm/omapdrm/dss/base.c6
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dispc.c223
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dpi.c6
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dsi.c4
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dss.h6
-rw-r--r--drivers/gpu/drm/omapdrm/dss/hdmi4.c7
-rw-r--r--drivers/gpu/drm/omapdrm/dss/hdmi5.c7
-rw-r--r--drivers/gpu/drm/omapdrm/dss/omapdss.h95
-rw-r--r--drivers/gpu/drm/omapdrm/dss/sdi.c6
-rw-r--r--drivers/gpu/drm/omapdrm/dss/venc.c4
-rw-r--r--drivers/gpu/drm/omapdrm/omap_crtc.c31
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.c13
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.h1
-rw-r--r--drivers/gpu/drm/omapdrm/omap_irq.c32
-rw-r--r--drivers/gpu/drm/omapdrm/omap_plane.c12
15 files changed, 257 insertions, 196 deletions
diff --git a/drivers/gpu/drm/omapdrm/dss/base.c b/drivers/gpu/drm/omapdrm/dss/base.c
index c248c3c31904..99e8cb8dc65b 100644
--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -44,6 +44,12 @@ void omapdss_set_dss(struct dss_device *dss)
44} 44}
45EXPORT_SYMBOL(omapdss_set_dss); 45EXPORT_SYMBOL(omapdss_set_dss);
46 46
47struct dispc_device *dispc_get_dispc(struct dss_device *dss)
48{
49 return dss->dispc;
50}
51EXPORT_SYMBOL(dispc_get_dispc);
52
47const struct dispc_ops *dispc_get_ops(struct dss_device *dss) 53const struct dispc_ops *dispc_get_ops(struct dss_device *dss)
48{ 54{
49 return dss->dispc_ops; 55 return dss->dispc_ops;
diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c
index aae6037f499f..6d8228f976f9 100644
--- a/drivers/gpu/drm/omapdrm/dss/dispc.c
+++ b/drivers/gpu/drm/omapdrm/dss/dispc.c
@@ -162,7 +162,7 @@ struct dispc_features {
162#define DISPC_MAX_NR_FIFOS 5 162#define DISPC_MAX_NR_FIFOS 5
163#define DISPC_MAX_CHANNEL_GAMMA 4 163#define DISPC_MAX_CHANNEL_GAMMA 4
164 164
165static struct { 165struct dispc_device {
166 struct platform_device *pdev; 166 struct platform_device *pdev;
167 void __iomem *base; 167 void __iomem *base;
168 struct dss_device *dss; 168 struct dss_device *dss;
@@ -194,7 +194,9 @@ static struct {
194 194
195 /* DISPC_CONTROL & DISPC_CONFIG lock*/ 195 /* DISPC_CONTROL & DISPC_CONFIG lock*/
196 spinlock_t control_lock; 196 spinlock_t control_lock;
197} dispc; 197};
198
199static struct dispc_device dispc;
198 200
199enum omap_color_component { 201enum omap_color_component {
200 /* used for all color formats for OMAP3 and earlier 202 /* used for all color formats for OMAP3 and earlier
@@ -361,9 +363,7 @@ static unsigned long dispc_mgr_pclk_rate(enum omap_channel channel);
361static unsigned long dispc_plane_pclk_rate(enum omap_plane_id plane); 363static unsigned long dispc_plane_pclk_rate(enum omap_plane_id plane);
362static unsigned long dispc_plane_lclk_rate(enum omap_plane_id plane); 364static unsigned long dispc_plane_lclk_rate(enum omap_plane_id plane);
363 365
364static void dispc_clear_irqstatus(u32 mask); 366static void dispc_clear_irqstatus(struct dispc_device *dispc, u32 mask);
365static bool dispc_mgr_is_enabled(enum omap_channel channel);
366static void dispc_clear_irqstatus(u32 mask);
367 367
368static inline void dispc_write_reg(const u16 idx, u32 val) 368static inline void dispc_write_reg(const u16 idx, u32 val)
369{ 369{
@@ -396,14 +396,14 @@ static void mgr_fld_write(enum omap_channel channel,
396 spin_unlock_irqrestore(&dispc.control_lock, flags); 396 spin_unlock_irqrestore(&dispc.control_lock, flags);
397} 397}
398 398
399static int dispc_get_num_ovls(void) 399static int dispc_get_num_ovls(struct dispc_device *dispc)
400{ 400{
401 return dispc.feat->num_ovls; 401 return dispc->feat->num_ovls;
402} 402}
403 403
404static int dispc_get_num_mgrs(void) 404static int dispc_get_num_mgrs(struct dispc_device *dispc)
405{ 405{
406 return dispc.feat->num_mgrs; 406 return dispc->feat->num_mgrs;
407} 407}
408 408
409static void dispc_get_reg_field(enum dispc_feat_reg_field id, 409static void dispc_get_reg_field(enum dispc_feat_reg_field id,
@@ -455,7 +455,7 @@ static void dispc_save_context(void)
455 SR(CONFIG3); 455 SR(CONFIG3);
456 } 456 }
457 457
458 for (i = 0; i < dispc_get_num_mgrs(); i++) { 458 for (i = 0; i < dispc_get_num_mgrs(&dispc); i++) {
459 SR(DEFAULT_COLOR(i)); 459 SR(DEFAULT_COLOR(i));
460 SR(TRANS_COLOR(i)); 460 SR(TRANS_COLOR(i));
461 SR(SIZE_MGR(i)); 461 SR(SIZE_MGR(i));
@@ -477,7 +477,7 @@ static void dispc_save_context(void)
477 } 477 }
478 } 478 }
479 479
480 for (i = 0; i < dispc_get_num_ovls(); i++) { 480 for (i = 0; i < dispc_get_num_ovls(&dispc); i++) {
481 SR(OVL_BA0(i)); 481 SR(OVL_BA0(i));
482 SR(OVL_BA1(i)); 482 SR(OVL_BA1(i));
483 SR(OVL_POSITION(i)); 483 SR(OVL_POSITION(i));
@@ -561,7 +561,7 @@ static void dispc_restore_context(void)
561 if (dispc_has_feature(FEAT_MGR_LCD3)) 561 if (dispc_has_feature(FEAT_MGR_LCD3))
562 RR(CONFIG3); 562 RR(CONFIG3);
563 563
564 for (i = 0; i < dispc_get_num_mgrs(); i++) { 564 for (i = 0; i < dispc_get_num_mgrs(&dispc); i++) {
565 RR(DEFAULT_COLOR(i)); 565 RR(DEFAULT_COLOR(i));
566 RR(TRANS_COLOR(i)); 566 RR(TRANS_COLOR(i));
567 RR(SIZE_MGR(i)); 567 RR(SIZE_MGR(i));
@@ -583,7 +583,7 @@ static void dispc_restore_context(void)
583 } 583 }
584 } 584 }
585 585
586 for (i = 0; i < dispc_get_num_ovls(); i++) { 586 for (i = 0; i < dispc_get_num_ovls(&dispc); i++) {
587 RR(OVL_BA0(i)); 587 RR(OVL_BA0(i));
588 RR(OVL_BA1(i)); 588 RR(OVL_BA1(i));
589 RR(OVL_POSITION(i)); 589 RR(OVL_POSITION(i));
@@ -648,7 +648,7 @@ static void dispc_restore_context(void)
648 if (dispc_has_feature(FEAT_MGR_LCD3)) 648 if (dispc_has_feature(FEAT_MGR_LCD3))
649 RR(CONTROL3); 649 RR(CONTROL3);
650 /* clear spurious SYNC_LOST_DIGIT interrupts */ 650 /* clear spurious SYNC_LOST_DIGIT interrupts */
651 dispc_clear_irqstatus(DISPC_IRQ_SYNC_LOST_DIGIT); 651 dispc_clear_irqstatus(&dispc, DISPC_IRQ_SYNC_LOST_DIGIT);
652 652
653 /* 653 /*
654 * enable last so IRQs won't trigger before 654 * enable last so IRQs won't trigger before
@@ -662,41 +662,44 @@ static void dispc_restore_context(void)
662#undef SR 662#undef SR
663#undef RR 663#undef RR
664 664
665int dispc_runtime_get(void) 665int dispc_runtime_get(struct dispc_device *dispc)
666{ 666{
667 int r; 667 int r;
668 668
669 DSSDBG("dispc_runtime_get\n"); 669 DSSDBG("dispc_runtime_get\n");
670 670
671 r = pm_runtime_get_sync(&dispc.pdev->dev); 671 r = pm_runtime_get_sync(&dispc->pdev->dev);
672 WARN_ON(r < 0); 672 WARN_ON(r < 0);
673 return r < 0 ? r : 0; 673 return r < 0 ? r : 0;
674} 674}
675 675
676void dispc_runtime_put(void) 676void dispc_runtime_put(struct dispc_device *dispc)
677{ 677{
678 int r; 678 int r;
679 679
680 DSSDBG("dispc_runtime_put\n"); 680 DSSDBG("dispc_runtime_put\n");
681 681
682 r = pm_runtime_put_sync(&dispc.pdev->dev); 682 r = pm_runtime_put_sync(&dispc->pdev->dev);
683 WARN_ON(r < 0 && r != -ENOSYS); 683 WARN_ON(r < 0 && r != -ENOSYS);
684} 684}
685 685
686static u32 dispc_mgr_get_vsync_irq(enum omap_channel channel) 686static u32 dispc_mgr_get_vsync_irq(struct dispc_device *dispc,
687 enum omap_channel channel)
687{ 688{
688 return mgr_desc[channel].vsync_irq; 689 return mgr_desc[channel].vsync_irq;
689} 690}
690 691
691static u32 dispc_mgr_get_framedone_irq(enum omap_channel channel) 692static u32 dispc_mgr_get_framedone_irq(struct dispc_device *dispc,
693 enum omap_channel channel)
692{ 694{
693 if (channel == OMAP_DSS_CHANNEL_DIGIT && dispc.feat->no_framedone_tv) 695 if (channel == OMAP_DSS_CHANNEL_DIGIT && dispc->feat->no_framedone_tv)
694 return 0; 696 return 0;
695 697
696 return mgr_desc[channel].framedone_irq; 698 return mgr_desc[channel].framedone_irq;
697} 699}
698 700
699static u32 dispc_mgr_get_sync_lost_irq(enum omap_channel channel) 701static u32 dispc_mgr_get_sync_lost_irq(struct dispc_device *dispc,
702 enum omap_channel channel)
700{ 703{
701 return mgr_desc[channel].sync_lost_irq; 704 return mgr_desc[channel].sync_lost_irq;
702} 705}
@@ -706,27 +709,30 @@ u32 dispc_wb_get_framedone_irq(void)
706 return DISPC_IRQ_FRAMEDONEWB; 709 return DISPC_IRQ_FRAMEDONEWB;
707} 710}
708 711
709static void dispc_mgr_enable(enum omap_channel channel, bool enable) 712static void dispc_mgr_enable(struct dispc_device *dispc,
713 enum omap_channel channel, bool enable)
710{ 714{
711 mgr_fld_write(channel, DISPC_MGR_FLD_ENABLE, enable); 715 mgr_fld_write(channel, DISPC_MGR_FLD_ENABLE, enable);
712 /* flush posted write */ 716 /* flush posted write */
713 mgr_fld_read(channel, DISPC_MGR_FLD_ENABLE); 717 mgr_fld_read(channel, DISPC_MGR_FLD_ENABLE);
714} 718}
715 719
716static bool dispc_mgr_is_enabled(enum omap_channel channel) 720static bool dispc_mgr_is_enabled(struct dispc_device *dispc,
721 enum omap_channel channel)
717{ 722{
718 return !!mgr_fld_read(channel, DISPC_MGR_FLD_ENABLE); 723 return !!mgr_fld_read(channel, DISPC_MGR_FLD_ENABLE);
719} 724}
720 725
721static bool dispc_mgr_go_busy(enum omap_channel channel) 726static bool dispc_mgr_go_busy(struct dispc_device *dispc,
727 enum omap_channel channel)
722{ 728{
723 return mgr_fld_read(channel, DISPC_MGR_FLD_GO) == 1; 729 return mgr_fld_read(channel, DISPC_MGR_FLD_GO) == 1;
724} 730}
725 731
726static void dispc_mgr_go(enum omap_channel channel) 732static void dispc_mgr_go(struct dispc_device *dispc, enum omap_channel channel)
727{ 733{
728 WARN_ON(!dispc_mgr_is_enabled(channel)); 734 WARN_ON(!dispc_mgr_is_enabled(dispc, channel));
729 WARN_ON(dispc_mgr_go_busy(channel)); 735 WARN_ON(dispc_mgr_go_busy(dispc, channel));
730 736
731 DSSDBG("GO %s\n", mgr_desc[channel].name); 737 DSSDBG("GO %s\n", mgr_desc[channel].name);
732 738
@@ -864,7 +870,7 @@ static void dispc_ovl_write_color_conv_coef(enum omap_plane_id plane,
864static void dispc_setup_color_conv_coef(void) 870static void dispc_setup_color_conv_coef(void)
865{ 871{
866 int i; 872 int i;
867 int num_ovl = dispc_get_num_ovls(); 873 int num_ovl = dispc_get_num_ovls(&dispc);
868 const struct color_conv_coef ctbl_bt601_5_ovl = { 874 const struct color_conv_coef ctbl_bt601_5_ovl = {
869 /* YUV -> RGB */ 875 /* YUV -> RGB */
870 298, 409, 0, 298, -208, -100, 298, 0, 517, 0, 876 298, 409, 0, 298, -208, -100, 298, 0, 517, 0,
@@ -956,7 +962,7 @@ static void dispc_ovl_enable_zorder_planes(void)
956 if (!dispc_has_feature(FEAT_ALPHA_FREE_ZORDER)) 962 if (!dispc_has_feature(FEAT_ALPHA_FREE_ZORDER))
957 return; 963 return;
958 964
959 for (i = 0; i < dispc_get_num_ovls(); i++) 965 for (i = 0; i < dispc_get_num_ovls(&dispc); i++)
960 REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(i), 1, 25, 25); 966 REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(i), 1, 25, 25);
961} 967}
962 968
@@ -1213,7 +1219,7 @@ static void dispc_configure_burst_sizes(void)
1213 const int burst_size = BURST_SIZE_X8; 1219 const int burst_size = BURST_SIZE_X8;
1214 1220
1215 /* Configure burst size always to maximum size */ 1221 /* Configure burst size always to maximum size */
1216 for (i = 0; i < dispc_get_num_ovls(); ++i) 1222 for (i = 0; i < dispc_get_num_ovls(&dispc); ++i)
1217 dispc_ovl_set_burst_size(i, burst_size); 1223 dispc_ovl_set_burst_size(i, burst_size);
1218 if (dispc.feat->has_writeback) 1224 if (dispc.feat->has_writeback)
1219 dispc_ovl_set_burst_size(OMAP_DSS_WB, burst_size); 1225 dispc_ovl_set_burst_size(OMAP_DSS_WB, burst_size);
@@ -1240,9 +1246,10 @@ static bool dispc_ovl_color_mode_supported(enum omap_plane_id plane, u32 fourcc)
1240 return false; 1246 return false;
1241} 1247}
1242 1248
1243static const u32 *dispc_ovl_get_color_modes(enum omap_plane_id plane) 1249static const u32 *dispc_ovl_get_color_modes(struct dispc_device *dispc,
1250 enum omap_plane_id plane)
1244{ 1251{
1245 return dispc.feat->supported_color_modes[plane]; 1252 return dispc->feat->supported_color_modes[plane];
1246} 1253}
1247 1254
1248static void dispc_mgr_enable_cpr(enum omap_channel channel, bool enable) 1255static void dispc_mgr_enable_cpr(enum omap_channel channel, bool enable)
@@ -1359,7 +1366,7 @@ static void dispc_init_fifos(void)
1359 /* 1366 /*
1360 * Setup default fifo thresholds. 1367 * Setup default fifo thresholds.
1361 */ 1368 */
1362 for (i = 0; i < dispc_get_num_ovls(); ++i) { 1369 for (i = 0; i < dispc_get_num_ovls(&dispc); ++i) {
1363 u32 low, high; 1370 u32 low, high;
1364 const bool use_fifomerge = false; 1371 const bool use_fifomerge = false;
1365 const bool manual_update = false; 1372 const bool manual_update = false;
@@ -1462,7 +1469,7 @@ void dispc_ovl_compute_fifo_thresholds(enum omap_plane_id plane,
1462 1469
1463 if (use_fifomerge) { 1470 if (use_fifomerge) {
1464 total_fifo_size = 0; 1471 total_fifo_size = 0;
1465 for (i = 0; i < dispc_get_num_ovls(); ++i) 1472 for (i = 0; i < dispc_get_num_ovls(&dispc); ++i)
1466 total_fifo_size += dispc_ovl_get_fifo_size(i); 1473 total_fifo_size += dispc_ovl_get_fifo_size(i);
1467 } else { 1474 } else {
1468 total_fifo_size = ovl_fifo_size; 1475 total_fifo_size = ovl_fifo_size;
@@ -1528,7 +1535,7 @@ static void dispc_init_mflag(void)
1528 (1 << 0) | /* MFLAG_CTRL = force always on */ 1535 (1 << 0) | /* MFLAG_CTRL = force always on */
1529 (0 << 2)); /* MFLAG_START = disable */ 1536 (0 << 2)); /* MFLAG_START = disable */
1530 1537
1531 for (i = 0; i < dispc_get_num_ovls(); ++i) { 1538 for (i = 0; i < dispc_get_num_ovls(&dispc); ++i) {
1532 u32 size = dispc_ovl_get_fifo_size(i); 1539 u32 size = dispc_ovl_get_fifo_size(i);
1533 u32 unit = dispc.feat->buffer_size_unit; 1540 u32 unit = dispc.feat->buffer_size_unit;
1534 u32 low, high; 1541 u32 low, high;
@@ -2631,13 +2638,14 @@ static int dispc_ovl_setup_common(enum omap_plane_id plane,
2631 return 0; 2638 return 0;
2632} 2639}
2633 2640
2634static int dispc_ovl_setup(enum omap_plane_id plane, 2641static int dispc_ovl_setup(struct dispc_device *dispc,
2635 const struct omap_overlay_info *oi, 2642 enum omap_plane_id plane,
2636 const struct videomode *vm, bool mem_to_mem, 2643 const struct omap_overlay_info *oi,
2637 enum omap_channel channel) 2644 const struct videomode *vm, bool mem_to_mem,
2645 enum omap_channel channel)
2638{ 2646{
2639 int r; 2647 int r;
2640 enum omap_overlay_caps caps = dispc.feat->overlay_caps[plane]; 2648 enum omap_overlay_caps caps = dispc->feat->overlay_caps[plane];
2641 const bool replication = true; 2649 const bool replication = true;
2642 2650
2643 DSSDBG("dispc_ovl_setup %d, pa %pad, pa_uv %pad, sw %d, %d,%d, %dx%d ->" 2651 DSSDBG("dispc_ovl_setup %d, pa %pad, pa_uv %pad, sw %d, %d,%d, %dx%d ->"
@@ -2724,7 +2732,8 @@ int dispc_wb_setup(const struct omap_dss_writeback_info *wi,
2724 return r; 2732 return r;
2725} 2733}
2726 2734
2727static int dispc_ovl_enable(enum omap_plane_id plane, bool enable) 2735static int dispc_ovl_enable(struct dispc_device *dispc,
2736 enum omap_plane_id plane, bool enable)
2728{ 2737{
2729 DSSDBG("dispc_enable_plane %d, %d\n", plane, enable); 2738 DSSDBG("dispc_enable_plane %d, %d\n", plane, enable);
2730 2739
@@ -2733,9 +2742,11 @@ static int dispc_ovl_enable(enum omap_plane_id plane, bool enable)
2733 return 0; 2742 return 0;
2734} 2743}
2735 2744
2736static enum omap_dss_output_id dispc_mgr_get_supported_outputs(enum omap_channel channel) 2745static enum omap_dss_output_id
2746dispc_mgr_get_supported_outputs(struct dispc_device *dispc,
2747 enum omap_channel channel)
2737{ 2748{
2738 return dss_get_supported_outputs(dispc.dss, channel); 2749 return dss_get_supported_outputs(dispc->dss, channel);
2739} 2750}
2740 2751
2741static void dispc_lcd_enable_signal_polarity(bool act_high) 2752static void dispc_lcd_enable_signal_polarity(bool act_high)
@@ -2810,8 +2821,9 @@ static void dispc_mgr_enable_alpha_fixed_zorder(enum omap_channel ch,
2810 REG_FLD_MOD(DISPC_CONFIG, enable, 19, 19); 2821 REG_FLD_MOD(DISPC_CONFIG, enable, 19, 19);
2811} 2822}
2812 2823
2813static void dispc_mgr_setup(enum omap_channel channel, 2824static void dispc_mgr_setup(struct dispc_device *dispc,
2814 const struct omap_overlay_manager_info *info) 2825 enum omap_channel channel,
2826 const struct omap_overlay_manager_info *info)
2815{ 2827{
2816 dispc_mgr_set_default_color(channel, info->default_color); 2828 dispc_mgr_set_default_color(channel, info->default_color);
2817 dispc_mgr_set_trans_key(channel, info->trans_key_type, info->trans_key); 2829 dispc_mgr_set_trans_key(channel, info->trans_key_type, info->trans_key);
@@ -2883,8 +2895,9 @@ static void dispc_mgr_enable_stallmode(enum omap_channel channel, bool enable)
2883 mgr_fld_write(channel, DISPC_MGR_FLD_STALLMODE, enable); 2895 mgr_fld_write(channel, DISPC_MGR_FLD_STALLMODE, enable);
2884} 2896}
2885 2897
2886static void dispc_mgr_set_lcd_config(enum omap_channel channel, 2898static void dispc_mgr_set_lcd_config(struct dispc_device *dispc,
2887 const struct dss_lcd_mgr_config *config) 2899 enum omap_channel channel,
2900 const struct dss_lcd_mgr_config *config)
2888{ 2901{
2889 dispc_mgr_set_io_pad_mode(config->io_pad_mode); 2902 dispc_mgr_set_io_pad_mode(config->io_pad_mode);
2890 2903
@@ -3039,8 +3052,9 @@ static int vm_flag_to_int(enum display_flags flags, enum display_flags high,
3039} 3052}
3040 3053
3041/* change name to mode? */ 3054/* change name to mode? */
3042static void dispc_mgr_set_timings(enum omap_channel channel, 3055static void dispc_mgr_set_timings(struct dispc_device *dispc,
3043 const struct videomode *vm) 3056 enum omap_channel channel,
3057 const struct videomode *vm)
3044{ 3058{
3045 unsigned int xtot, ytot; 3059 unsigned int xtot, ytot;
3046 unsigned long ht, vt; 3060 unsigned long ht, vt;
@@ -3078,7 +3092,7 @@ static void dispc_mgr_set_timings(enum omap_channel channel,
3078 if (t.flags & DISPLAY_FLAGS_INTERLACED) 3092 if (t.flags & DISPLAY_FLAGS_INTERLACED)
3079 t.vactive /= 2; 3093 t.vactive /= 2;
3080 3094
3081 if (dispc.feat->supports_double_pixel) 3095 if (dispc->feat->supports_double_pixel)
3082 REG_FLD_MOD(DISPC_CONTROL, 3096 REG_FLD_MOD(DISPC_CONTROL,
3083 !!(t.flags & DISPLAY_FLAGS_DOUBLECLK), 3097 !!(t.flags & DISPLAY_FLAGS_DOUBLECLK),
3084 19, 17); 3098 19, 17);
@@ -3241,7 +3255,7 @@ void dispc_dump_clocks(struct seq_file *s)
3241 u32 l; 3255 u32 l;
3242 enum dss_clk_source dispc_clk_src = dss_get_dispc_clk_source(dispc.dss); 3256 enum dss_clk_source dispc_clk_src = dss_get_dispc_clk_source(dispc.dss);
3243 3257
3244 if (dispc_runtime_get()) 3258 if (dispc_runtime_get(&dispc))
3245 return; 3259 return;
3246 3260
3247 seq_printf(s, "- DISPC -\n"); 3261 seq_printf(s, "- DISPC -\n");
@@ -3267,7 +3281,7 @@ void dispc_dump_clocks(struct seq_file *s)
3267 if (dispc_has_feature(FEAT_MGR_LCD3)) 3281 if (dispc_has_feature(FEAT_MGR_LCD3))
3268 dispc_dump_clocks_channel(s, OMAP_DSS_CHANNEL_LCD3); 3282 dispc_dump_clocks_channel(s, OMAP_DSS_CHANNEL_LCD3);
3269 3283
3270 dispc_runtime_put(); 3284 dispc_runtime_put(&dispc);
3271} 3285}
3272 3286
3273static int dispc_dump_regs(struct seq_file *s, void *p) 3287static int dispc_dump_regs(struct seq_file *s, void *p)
@@ -3290,7 +3304,7 @@ static int dispc_dump_regs(struct seq_file *s, void *p)
3290 3304
3291#define DUMPREG(r) seq_printf(s, "%-50s %08x\n", #r, dispc_read_reg(r)) 3305#define DUMPREG(r) seq_printf(s, "%-50s %08x\n", #r, dispc_read_reg(r))
3292 3306
3293 if (dispc_runtime_get()) 3307 if (dispc_runtime_get(&dispc))
3294 return 0; 3308 return 0;
3295 3309
3296 /* DISPC common registers */ 3310 /* DISPC common registers */
@@ -3328,7 +3342,7 @@ static int dispc_dump_regs(struct seq_file *s, void *p)
3328 p_names = mgr_names; 3342 p_names = mgr_names;
3329 3343
3330 /* DISPC channel specific registers */ 3344 /* DISPC channel specific registers */
3331 for (i = 0; i < dispc_get_num_mgrs(); i++) { 3345 for (i = 0; i < dispc_get_num_mgrs(&dispc); i++) {
3332 DUMPREG(i, DISPC_DEFAULT_COLOR); 3346 DUMPREG(i, DISPC_DEFAULT_COLOR);
3333 DUMPREG(i, DISPC_TRANS_COLOR); 3347 DUMPREG(i, DISPC_TRANS_COLOR);
3334 DUMPREG(i, DISPC_SIZE_MGR); 3348 DUMPREG(i, DISPC_SIZE_MGR);
@@ -3354,7 +3368,7 @@ static int dispc_dump_regs(struct seq_file *s, void *p)
3354 3368
3355 p_names = ovl_names; 3369 p_names = ovl_names;
3356 3370
3357 for (i = 0; i < dispc_get_num_ovls(); i++) { 3371 for (i = 0; i < dispc_get_num_ovls(&dispc); i++) {
3358 DUMPREG(i, DISPC_OVL_BA0); 3372 DUMPREG(i, DISPC_OVL_BA0);
3359 DUMPREG(i, DISPC_OVL_BA1); 3373 DUMPREG(i, DISPC_OVL_BA1);
3360 DUMPREG(i, DISPC_OVL_POSITION); 3374 DUMPREG(i, DISPC_OVL_POSITION);
@@ -3432,7 +3446,7 @@ static int dispc_dump_regs(struct seq_file *s, void *p)
3432 /* Video pipeline coefficient registers */ 3446 /* Video pipeline coefficient registers */
3433 3447
3434 /* start from OMAP_DSS_VIDEO1 */ 3448 /* start from OMAP_DSS_VIDEO1 */
3435 for (i = 1; i < dispc_get_num_ovls(); i++) { 3449 for (i = 1; i < dispc_get_num_ovls(&dispc); i++) {
3436 for (j = 0; j < 8; j++) 3450 for (j = 0; j < 8; j++)
3437 DUMPREG(i, DISPC_OVL_FIR_COEF_H, j); 3451 DUMPREG(i, DISPC_OVL_FIR_COEF_H, j);
3438 3452
@@ -3459,7 +3473,7 @@ static int dispc_dump_regs(struct seq_file *s, void *p)
3459 } 3473 }
3460 } 3474 }
3461 3475
3462 dispc_runtime_put(); 3476 dispc_runtime_put(&dispc);
3463 3477
3464#undef DISPC_REG 3478#undef DISPC_REG
3465#undef DUMPREG 3479#undef DUMPREG
@@ -3567,22 +3581,22 @@ int dispc_mgr_get_clock_div(enum omap_channel channel,
3567 return 0; 3581 return 0;
3568} 3582}
3569 3583
3570static u32 dispc_read_irqstatus(void) 3584static u32 dispc_read_irqstatus(struct dispc_device *dispc)
3571{ 3585{
3572 return dispc_read_reg(DISPC_IRQSTATUS); 3586 return dispc_read_reg(DISPC_IRQSTATUS);
3573} 3587}
3574 3588
3575static void dispc_clear_irqstatus(u32 mask) 3589static void dispc_clear_irqstatus(struct dispc_device *dispc, u32 mask)
3576{ 3590{
3577 dispc_write_reg(DISPC_IRQSTATUS, mask); 3591 dispc_write_reg(DISPC_IRQSTATUS, mask);
3578} 3592}
3579 3593
3580static void dispc_write_irqenable(u32 mask) 3594static void dispc_write_irqenable(struct dispc_device *dispc, u32 mask)
3581{ 3595{
3582 u32 old_mask = dispc_read_reg(DISPC_IRQENABLE); 3596 u32 old_mask = dispc_read_reg(DISPC_IRQENABLE);
3583 3597
3584 /* clear the irqstatus for newly enabled irqs */ 3598 /* clear the irqstatus for newly enabled irqs */
3585 dispc_clear_irqstatus((mask ^ old_mask) & mask); 3599 dispc_clear_irqstatus(dispc, (mask ^ old_mask) & mask);
3586 3600
3587 dispc_write_reg(DISPC_IRQENABLE, mask); 3601 dispc_write_reg(DISPC_IRQENABLE, mask);
3588 3602
@@ -3600,11 +3614,12 @@ void dispc_disable_sidle(void)
3600 REG_FLD_MOD(DISPC_SYSCONFIG, 1, 4, 3); /* SIDLEMODE: no idle */ 3614 REG_FLD_MOD(DISPC_SYSCONFIG, 1, 4, 3); /* SIDLEMODE: no idle */
3601} 3615}
3602 3616
3603static u32 dispc_mgr_gamma_size(enum omap_channel channel) 3617static u32 dispc_mgr_gamma_size(struct dispc_device *dispc,
3618 enum omap_channel channel)
3604{ 3619{
3605 const struct dispc_gamma_desc *gdesc = &mgr_desc[channel].gamma; 3620 const struct dispc_gamma_desc *gdesc = &mgr_desc[channel].gamma;
3606 3621
3607 if (!dispc.feat->has_gamma_table) 3622 if (!dispc->feat->has_gamma_table)
3608 return 0; 3623 return 0;
3609 3624
3610 return gdesc->len; 3625 return gdesc->len;
@@ -3653,18 +3668,19 @@ static const struct drm_color_lut dispc_mgr_gamma_default_lut[] = {
3653 { .red = U16_MAX, .green = U16_MAX, .blue = U16_MAX, }, 3668 { .red = U16_MAX, .green = U16_MAX, .blue = U16_MAX, },
3654}; 3669};
3655 3670
3656static void dispc_mgr_set_gamma(enum omap_channel channel, 3671static void dispc_mgr_set_gamma(struct dispc_device *dispc,
3657 const struct drm_color_lut *lut, 3672 enum omap_channel channel,
3658 unsigned int length) 3673 const struct drm_color_lut *lut,
3674 unsigned int length)
3659{ 3675{
3660 const struct dispc_gamma_desc *gdesc = &mgr_desc[channel].gamma; 3676 const struct dispc_gamma_desc *gdesc = &mgr_desc[channel].gamma;
3661 u32 *table = dispc.gamma_table[channel]; 3677 u32 *table = dispc->gamma_table[channel];
3662 uint i; 3678 uint i;
3663 3679
3664 DSSDBG("%s: channel %d, lut len %u, hw len %u\n", __func__, 3680 DSSDBG("%s: channel %d, lut len %u, hw len %u\n", __func__,
3665 channel, length, gdesc->len); 3681 channel, length, gdesc->len);
3666 3682
3667 if (!dispc.feat->has_gamma_table) 3683 if (!dispc->feat->has_gamma_table)
3668 return; 3684 return;
3669 3685
3670 if (lut == NULL || length < 2) { 3686 if (lut == NULL || length < 2) {
@@ -3696,7 +3712,7 @@ static void dispc_mgr_set_gamma(enum omap_channel channel,
3696 } 3712 }
3697 } 3713 }
3698 3714
3699 if (dispc.is_enabled) 3715 if (dispc->is_enabled)
3700 dispc_mgr_write_gamma_table(channel); 3716 dispc_mgr_write_gamma_table(channel);
3701} 3717}
3702 3718
@@ -3726,7 +3742,7 @@ static int dispc_init_gamma_tables(void)
3726 3742
3727 dispc.gamma_table[channel] = gt; 3743 dispc.gamma_table[channel] = gt;
3728 3744
3729 dispc_mgr_set_gamma(channel, NULL, 0); 3745 dispc_mgr_set_gamma(&dispc, channel, NULL, 0);
3730 } 3746 }
3731 return 0; 3747 return 0;
3732} 3748}
@@ -4296,43 +4312,44 @@ static irqreturn_t dispc_irq_handler(int irq, void *arg)
4296 return dispc.user_handler(irq, dispc.user_data); 4312 return dispc.user_handler(irq, dispc.user_data);
4297} 4313}
4298 4314
4299static int dispc_request_irq(irq_handler_t handler, void *dev_id) 4315static int dispc_request_irq(struct dispc_device *dispc, irq_handler_t handler,
4316 void *dev_id)
4300{ 4317{
4301 int r; 4318 int r;
4302 4319
4303 if (dispc.user_handler != NULL) 4320 if (dispc->user_handler != NULL)
4304 return -EBUSY; 4321 return -EBUSY;
4305 4322
4306 dispc.user_handler = handler; 4323 dispc->user_handler = handler;
4307 dispc.user_data = dev_id; 4324 dispc->user_data = dev_id;
4308 4325
4309 /* ensure the dispc_irq_handler sees the values above */ 4326 /* ensure the dispc_irq_handler sees the values above */
4310 smp_wmb(); 4327 smp_wmb();
4311 4328
4312 r = devm_request_irq(&dispc.pdev->dev, dispc.irq, dispc_irq_handler, 4329 r = devm_request_irq(&dispc->pdev->dev, dispc->irq, dispc_irq_handler,
4313 IRQF_SHARED, "OMAP DISPC", &dispc); 4330 IRQF_SHARED, "OMAP DISPC", dispc);
4314 if (r) { 4331 if (r) {
4315 dispc.user_handler = NULL; 4332 dispc->user_handler = NULL;
4316 dispc.user_data = NULL; 4333 dispc->user_data = NULL;
4317 } 4334 }
4318 4335
4319 return r; 4336 return r;
4320} 4337}
4321 4338
4322static void dispc_free_irq(void *dev_id) 4339static void dispc_free_irq(struct dispc_device *dispc, void *dev_id)
4323{ 4340{
4324 devm_free_irq(&dispc.pdev->dev, dispc.irq, &dispc); 4341 devm_free_irq(&dispc->pdev->dev, dispc->irq, dispc);
4325 4342
4326 dispc.user_handler = NULL; 4343 dispc->user_handler = NULL;
4327 dispc.user_data = NULL; 4344 dispc->user_data = NULL;
4328} 4345}
4329 4346
4330static u32 dispc_get_memory_bandwidth_limit(void) 4347static u32 dispc_get_memory_bandwidth_limit(struct dispc_device *dispc)
4331{ 4348{
4332 u32 limit = 0; 4349 u32 limit = 0;
4333 4350
4334 /* Optional maximum memory bandwidth */ 4351 /* Optional maximum memory bandwidth */
4335 of_property_read_u32(dispc.pdev->dev.of_node, "max-memory-bandwidth", 4352 of_property_read_u32(dispc->pdev->dev.of_node, "max-memory-bandwidth",
4336 &limit); 4353 &limit);
4337 4354
4338 return limit; 4355 return limit;
@@ -4439,7 +4456,8 @@ static void dispc_errata_i734_wa_fini(void)
4439 4456
4440static void dispc_errata_i734_wa(void) 4457static void dispc_errata_i734_wa(void)
4441{ 4458{
4442 u32 framedone_irq = dispc_mgr_get_framedone_irq(OMAP_DSS_CHANNEL_LCD); 4459 u32 framedone_irq = dispc_mgr_get_framedone_irq(&dispc,
4460 OMAP_DSS_CHANNEL_LCD);
4443 struct omap_overlay_info ovli; 4461 struct omap_overlay_info ovli;
4444 struct dss_lcd_mgr_config lcd_conf; 4462 struct dss_lcd_mgr_config lcd_conf;
4445 u32 gatestate; 4463 u32 gatestate;
@@ -4458,39 +4476,39 @@ static void dispc_errata_i734_wa(void)
4458 REG_FLD_MOD(DISPC_CONFIG, 0x1f, 8, 4); 4476 REG_FLD_MOD(DISPC_CONFIG, 0x1f, 8, 4);
4459 4477
4460 /* Setup and enable GFX plane */ 4478 /* Setup and enable GFX plane */
4461 dispc_ovl_setup(OMAP_DSS_GFX, &ovli, &i734.vm, false, 4479 dispc_ovl_setup(&dispc, OMAP_DSS_GFX, &ovli, &i734.vm, false,
4462 OMAP_DSS_CHANNEL_LCD); 4480 OMAP_DSS_CHANNEL_LCD);
4463 dispc_ovl_enable(OMAP_DSS_GFX, true); 4481 dispc_ovl_enable(&dispc, OMAP_DSS_GFX, true);
4464 4482
4465 /* Set up and enable display manager for LCD1 */ 4483 /* Set up and enable display manager for LCD1 */
4466 dispc_mgr_setup(OMAP_DSS_CHANNEL_LCD, &i734.mgri); 4484 dispc_mgr_setup(&dispc, OMAP_DSS_CHANNEL_LCD, &i734.mgri);
4467 dispc_calc_clock_rates(dss_get_dispc_clk_rate(dispc.dss), 4485 dispc_calc_clock_rates(dss_get_dispc_clk_rate(dispc.dss),
4468 &lcd_conf.clock_info); 4486 &lcd_conf.clock_info);
4469 dispc_mgr_set_lcd_config(OMAP_DSS_CHANNEL_LCD, &lcd_conf); 4487 dispc_mgr_set_lcd_config(&dispc, OMAP_DSS_CHANNEL_LCD, &lcd_conf);
4470 dispc_mgr_set_timings(OMAP_DSS_CHANNEL_LCD, &i734.vm); 4488 dispc_mgr_set_timings(&dispc, OMAP_DSS_CHANNEL_LCD, &i734.vm);
4471 4489
4472 dispc_clear_irqstatus(framedone_irq); 4490 dispc_clear_irqstatus(&dispc, framedone_irq);
4473 4491
4474 /* Enable and shut the channel to produce just one frame */ 4492 /* Enable and shut the channel to produce just one frame */
4475 dispc_mgr_enable(OMAP_DSS_CHANNEL_LCD, true); 4493 dispc_mgr_enable(&dispc, OMAP_DSS_CHANNEL_LCD, true);
4476 dispc_mgr_enable(OMAP_DSS_CHANNEL_LCD, false); 4494 dispc_mgr_enable(&dispc, OMAP_DSS_CHANNEL_LCD, false);
4477 4495
4478 /* Busy wait for framedone. We can't fiddle with irq handlers 4496 /* Busy wait for framedone. We can't fiddle with irq handlers
4479 * in PM resume. Typically the loop runs less than 5 times and 4497 * in PM resume. Typically the loop runs less than 5 times and
4480 * waits less than a micro second. 4498 * waits less than a micro second.
4481 */ 4499 */
4482 count = 0; 4500 count = 0;
4483 while (!(dispc_read_irqstatus() & framedone_irq)) { 4501 while (!(dispc_read_irqstatus(&dispc) & framedone_irq)) {
4484 if (count++ > 10000) { 4502 if (count++ > 10000) {
4485 dev_err(&dispc.pdev->dev, "%s: framedone timeout\n", 4503 dev_err(&dispc.pdev->dev, "%s: framedone timeout\n",
4486 __func__); 4504 __func__);
4487 break; 4505 break;
4488 } 4506 }
4489 } 4507 }
4490 dispc_ovl_enable(OMAP_DSS_GFX, false); 4508 dispc_ovl_enable(&dispc, OMAP_DSS_GFX, false);
4491 4509
4492 /* Clear all irq bits before continuing */ 4510 /* Clear all irq bits before continuing */
4493 dispc_clear_irqstatus(0xffffffff); 4511 dispc_clear_irqstatus(&dispc, 0xffffffff);
4494 4512
4495 /* Restore the original state to LCD1 output gates */ 4513 /* Restore the original state to LCD1 output gates */
4496 REG_FLD_MOD(DISPC_CONFIG, gatestate, 8, 4); 4514 REG_FLD_MOD(DISPC_CONFIG, gatestate, 8, 4);
@@ -4610,7 +4628,7 @@ static int dispc_bind(struct device *dev, struct device *master, void *data)
4610 4628
4611 pm_runtime_enable(&pdev->dev); 4629 pm_runtime_enable(&pdev->dev);
4612 4630
4613 r = dispc_runtime_get(); 4631 r = dispc_runtime_get(&dispc);
4614 if (r) 4632 if (r)
4615 goto err_runtime_get; 4633 goto err_runtime_get;
4616 4634
@@ -4620,8 +4638,9 @@ static int dispc_bind(struct device *dev, struct device *master, void *data)
4620 dev_dbg(&pdev->dev, "OMAP DISPC rev %d.%d\n", 4638 dev_dbg(&pdev->dev, "OMAP DISPC rev %d.%d\n",
4621 FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); 4639 FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
4622 4640
4623 dispc_runtime_put(); 4641 dispc_runtime_put(&dispc);
4624 4642
4643 dss->dispc = &dispc;
4625 dss->dispc_ops = &dispc_ops; 4644 dss->dispc_ops = &dispc_ops;
4626 4645
4627 dispc.debugfs = dss_debugfs_create_file(dss, "dispc", dispc_dump_regs, 4646 dispc.debugfs = dss_debugfs_create_file(dss, "dispc", dispc_dump_regs,
@@ -4634,13 +4653,13 @@ err_runtime_get:
4634 return r; 4653 return r;
4635} 4654}
4636 4655
4637static void dispc_unbind(struct device *dev, struct device *master, 4656static void dispc_unbind(struct device *dev, struct device *master, void *data)
4638 void *data)
4639{ 4657{
4640 struct dss_device *dss = dispc.dss; 4658 struct dss_device *dss = dispc.dss;
4641 4659
4642 dss_debugfs_remove_file(dispc.debugfs); 4660 dss_debugfs_remove_file(dispc.debugfs);
4643 4661
4662 dss->dispc = NULL;
4644 dss->dispc_ops = NULL; 4663 dss->dispc_ops = NULL;
4645 4664
4646 pm_runtime_disable(dev); 4665 pm_runtime_disable(dev);
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index e818e7836cbb..d524094b8394 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -406,7 +406,7 @@ static int dpi_display_enable(struct omap_dss_device *dssdev)
406 goto err_reg_enable; 406 goto err_reg_enable;
407 } 407 }
408 408
409 r = dispc_runtime_get(); 409 r = dispc_runtime_get(dpi->dss->dispc);
410 if (r) 410 if (r)
411 goto err_get_dispc; 411 goto err_get_dispc;
412 412
@@ -442,7 +442,7 @@ err_set_mode:
442 dss_pll_disable(dpi->pll); 442 dss_pll_disable(dpi->pll);
443err_pll_init: 443err_pll_init:
444err_src_sel: 444err_src_sel:
445 dispc_runtime_put(); 445 dispc_runtime_put(dpi->dss->dispc);
446err_get_dispc: 446err_get_dispc:
447 if (dpi->vdds_dsi_reg) 447 if (dpi->vdds_dsi_reg)
448 regulator_disable(dpi->vdds_dsi_reg); 448 regulator_disable(dpi->vdds_dsi_reg);
@@ -466,7 +466,7 @@ static void dpi_display_disable(struct omap_dss_device *dssdev)
466 dss_pll_disable(dpi->pll); 466 dss_pll_disable(dpi->pll);
467 } 467 }
468 468
469 dispc_runtime_put(); 469 dispc_runtime_put(dpi->dss->dispc);
470 470
471 if (dpi->vdds_dsi_reg) 471 if (dpi->vdds_dsi_reg)
472 regulator_disable(dpi->vdds_dsi_reg); 472 regulator_disable(dpi->vdds_dsi_reg);
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 66c4d973e7eb..c07326a46c01 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -5523,7 +5523,7 @@ static int dsi_runtime_suspend(struct device *dev)
5523 /* wait for current handler to finish before turning the DSI off */ 5523 /* wait for current handler to finish before turning the DSI off */
5524 synchronize_irq(dsi->irq); 5524 synchronize_irq(dsi->irq);
5525 5525
5526 dispc_runtime_put(); 5526 dispc_runtime_put(dsi->dss->dispc);
5527 5527
5528 return 0; 5528 return 0;
5529} 5529}
@@ -5533,7 +5533,7 @@ static int dsi_runtime_resume(struct device *dev)
5533 struct dsi_data *dsi = dev_get_drvdata(dev); 5533 struct dsi_data *dsi = dev_get_drvdata(dev);
5534 int r; 5534 int r;
5535 5535
5536 r = dispc_runtime_get(); 5536 r = dispc_runtime_get(dsi->dss->dispc);
5537 if (r) 5537 if (r)
5538 return r; 5538 return r;
5539 5539
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h
index 348378f1b5a5..f3acfd62031c 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.h
+++ b/drivers/gpu/drm/omapdrm/dss/dss.h
@@ -25,6 +25,7 @@
25 25
26#include "omapdss.h" 26#include "omapdss.h"
27 27
28struct dispc_device;
28struct dss_debugfs_entry; 29struct dss_debugfs_entry;
29struct platform_device; 30struct platform_device;
30struct seq_file; 31struct seq_file;
@@ -272,6 +273,7 @@ struct dss_device {
272 struct dss_pll *video1_pll; 273 struct dss_pll *video1_pll;
273 struct dss_pll *video2_pll; 274 struct dss_pll *video2_pll;
274 275
276 struct dispc_device *dispc;
275 const struct dispc_ops *dispc_ops; 277 const struct dispc_ops *dispc_ops;
276}; 278};
277 279
@@ -407,8 +409,8 @@ static inline void dpi_uninit_port(struct device_node *port)
407/* DISPC */ 409/* DISPC */
408void dispc_dump_clocks(struct seq_file *s); 410void dispc_dump_clocks(struct seq_file *s);
409 411
410int dispc_runtime_get(void); 412int dispc_runtime_get(struct dispc_device *dispc);
411void dispc_runtime_put(void); 413void dispc_runtime_put(struct dispc_device *dispc);
412 414
413void dispc_enable_sidle(void); 415void dispc_enable_sidle(void);
414void dispc_disable_sidle(void); 416void dispc_disable_sidle(void);
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 096542fb75d2..5c55fa3f593a 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -819,16 +819,19 @@ static int hdmi4_remove(struct platform_device *pdev)
819 819
820static int hdmi_runtime_suspend(struct device *dev) 820static int hdmi_runtime_suspend(struct device *dev)
821{ 821{
822 dispc_runtime_put(); 822 struct omap_hdmi *hdmi = dev_get_drvdata(dev);
823
824 dispc_runtime_put(hdmi->dss->dispc);
823 825
824 return 0; 826 return 0;
825} 827}
826 828
827static int hdmi_runtime_resume(struct device *dev) 829static int hdmi_runtime_resume(struct device *dev)
828{ 830{
831 struct omap_hdmi *hdmi = dev_get_drvdata(dev);
829 int r; 832 int r;
830 833
831 r = dispc_runtime_get(); 834 r = dispc_runtime_get(hdmi->dss->dispc);
832 if (r < 0) 835 if (r < 0)
833 return r; 836 return r;
834 837
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 597baebd959c..e896f63480f1 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -814,16 +814,19 @@ static int hdmi5_remove(struct platform_device *pdev)
814 814
815static int hdmi_runtime_suspend(struct device *dev) 815static int hdmi_runtime_suspend(struct device *dev)
816{ 816{
817 dispc_runtime_put(); 817 struct omap_hdmi *hdmi = dev_get_drvdata(dev);
818
819 dispc_runtime_put(hdmi->dss->dispc);
818 820
819 return 0; 821 return 0;
820} 822}
821 823
822static int hdmi_runtime_resume(struct device *dev) 824static int hdmi_runtime_resume(struct device *dev)
823{ 825{
826 struct omap_hdmi *hdmi = dev_get_drvdata(dev);
824 int r; 827 int r;
825 828
826 r = dispc_runtime_get(); 829 r = dispc_runtime_get(hdmi->dss->dispc);
827 if (r < 0) 830 if (r < 0)
828 return r; 831 return r;
829 832
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 4bf7843b4aec..a4f71e082c1c 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -62,6 +62,8 @@
62struct dss_device; 62struct dss_device;
63struct omap_drm_private; 63struct omap_drm_private;
64struct omap_dss_device; 64struct omap_dss_device;
65struct dispc_device;
66struct dss_device;
65struct dss_lcd_mgr_config; 67struct dss_lcd_mgr_config;
66struct snd_aes_iec958; 68struct snd_aes_iec958;
67struct snd_cea_861_aud_if; 69struct snd_cea_861_aud_if;
@@ -690,49 +692,64 @@ void dss_mgr_unregister_framedone_handler(struct omap_dss_device *dssdev,
690/* dispc ops */ 692/* dispc ops */
691 693
692struct dispc_ops { 694struct dispc_ops {
693 u32 (*read_irqstatus)(void); 695 u32 (*read_irqstatus)(struct dispc_device *dispc);
694 void (*clear_irqstatus)(u32 mask); 696 void (*clear_irqstatus)(struct dispc_device *dispc, u32 mask);
695 void (*write_irqenable)(u32 mask); 697 void (*write_irqenable)(struct dispc_device *dispc, u32 mask);
696 698
697 int (*request_irq)(irq_handler_t handler, void *dev_id); 699 int (*request_irq)(struct dispc_device *dispc, irq_handler_t handler,
698 void (*free_irq)(void *dev_id); 700 void *dev_id);
699 701 void (*free_irq)(struct dispc_device *dispc, void *dev_id);
700 int (*runtime_get)(void); 702
701 void (*runtime_put)(void); 703 int (*runtime_get)(struct dispc_device *dispc);
702 704 void (*runtime_put)(struct dispc_device *dispc);
703 int (*get_num_ovls)(void); 705
704 int (*get_num_mgrs)(void); 706 int (*get_num_ovls)(struct dispc_device *dispc);
705 707 int (*get_num_mgrs)(struct dispc_device *dispc);
706 u32 (*get_memory_bandwidth_limit)(void); 708
707 709 u32 (*get_memory_bandwidth_limit)(struct dispc_device *dispc);
708 void (*mgr_enable)(enum omap_channel channel, bool enable); 710
709 bool (*mgr_is_enabled)(enum omap_channel channel); 711 void (*mgr_enable)(struct dispc_device *dispc,
710 u32 (*mgr_get_vsync_irq)(enum omap_channel channel); 712 enum omap_channel channel, bool enable);
711 u32 (*mgr_get_framedone_irq)(enum omap_channel channel); 713 bool (*mgr_is_enabled)(struct dispc_device *dispc,
712 u32 (*mgr_get_sync_lost_irq)(enum omap_channel channel); 714 enum omap_channel channel);
713 bool (*mgr_go_busy)(enum omap_channel channel); 715 u32 (*mgr_get_vsync_irq)(struct dispc_device *dispc,
714 void (*mgr_go)(enum omap_channel channel); 716 enum omap_channel channel);
715 void (*mgr_set_lcd_config)(enum omap_channel channel, 717 u32 (*mgr_get_framedone_irq)(struct dispc_device *dispc,
716 const struct dss_lcd_mgr_config *config); 718 enum omap_channel channel);
717 void (*mgr_set_timings)(enum omap_channel channel, 719 u32 (*mgr_get_sync_lost_irq)(struct dispc_device *dispc,
718 const struct videomode *vm); 720 enum omap_channel channel);
719 void (*mgr_setup)(enum omap_channel channel, 721 bool (*mgr_go_busy)(struct dispc_device *dispc,
720 const struct omap_overlay_manager_info *info); 722 enum omap_channel channel);
721 enum omap_dss_output_id (*mgr_get_supported_outputs)(enum omap_channel channel); 723 void (*mgr_go)(struct dispc_device *dispc, enum omap_channel channel);
722 u32 (*mgr_gamma_size)(enum omap_channel channel); 724 void (*mgr_set_lcd_config)(struct dispc_device *dispc,
723 void (*mgr_set_gamma)(enum omap_channel channel, 725 enum omap_channel channel,
724 const struct drm_color_lut *lut, 726 const struct dss_lcd_mgr_config *config);
725 unsigned int length); 727 void (*mgr_set_timings)(struct dispc_device *dispc,
726 728 enum omap_channel channel,
727 int (*ovl_enable)(enum omap_plane_id plane, bool enable); 729 const struct videomode *vm);
728 int (*ovl_setup)(enum omap_plane_id plane, 730 void (*mgr_setup)(struct dispc_device *dispc, enum omap_channel channel,
731 const struct omap_overlay_manager_info *info);
732 enum omap_dss_output_id (*mgr_get_supported_outputs)(
733 struct dispc_device *dispc, enum omap_channel channel);
734 u32 (*mgr_gamma_size)(struct dispc_device *dispc,
735 enum omap_channel channel);
736 void (*mgr_set_gamma)(struct dispc_device *dispc,
737 enum omap_channel channel,
738 const struct drm_color_lut *lut,
739 unsigned int length);
740
741 int (*ovl_enable)(struct dispc_device *dispc, enum omap_plane_id plane,
742 bool enable);
743 int (*ovl_setup)(struct dispc_device *dispc, enum omap_plane_id plane,
729 const struct omap_overlay_info *oi, 744 const struct omap_overlay_info *oi,
730 const struct videomode *vm, bool mem_to_mem, 745 const struct videomode *vm, bool mem_to_mem,
731 enum omap_channel channel); 746 enum omap_channel channel);
732 747
733 const u32 *(*ovl_get_color_modes)(enum omap_plane_id plane); 748 const u32 *(*ovl_get_color_modes)(struct dispc_device *dispc,
749 enum omap_plane_id plane);
734}; 750};
735 751
752struct dispc_device *dispc_get_dispc(struct dss_device *dss);
736const struct dispc_ops *dispc_get_ops(struct dss_device *dss); 753const struct dispc_ops *dispc_get_ops(struct dss_device *dss);
737 754
738bool omapdss_component_is_display(struct device_node *node); 755bool omapdss_component_is_display(struct device_node *node);
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index bf225ae69b06..b1d0e706a1ec 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -141,7 +141,7 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)
141 if (r) 141 if (r)
142 goto err_reg_enable; 142 goto err_reg_enable;
143 143
144 r = dispc_runtime_get(); 144 r = dispc_runtime_get(sdi.dss->dispc);
145 if (r) 145 if (r)
146 goto err_get_dispc; 146 goto err_get_dispc;
147 147
@@ -203,7 +203,7 @@ err_mgr_enable:
203err_sdi_enable: 203err_sdi_enable:
204err_set_dss_clock_div: 204err_set_dss_clock_div:
205err_calc_clock_div: 205err_calc_clock_div:
206 dispc_runtime_put(); 206 dispc_runtime_put(sdi.dss->dispc);
207err_get_dispc: 207err_get_dispc:
208 regulator_disable(sdi.vdds_sdi_reg); 208 regulator_disable(sdi.vdds_sdi_reg);
209err_reg_enable: 209err_reg_enable:
@@ -216,7 +216,7 @@ static void sdi_display_disable(struct omap_dss_device *dssdev)
216 216
217 dss_sdi_disable(sdi.dss); 217 dss_sdi_disable(sdi.dss);
218 218
219 dispc_runtime_put(); 219 dispc_runtime_put(sdi.dss->dispc);
220 220
221 regulator_disable(sdi.vdds_sdi_reg); 221 regulator_disable(sdi.vdds_sdi_reg);
222} 222}
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index bed3b54b70b2..546271389189 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -956,7 +956,7 @@ static int venc_runtime_suspend(struct device *dev)
956 if (venc.tv_dac_clk) 956 if (venc.tv_dac_clk)
957 clk_disable_unprepare(venc.tv_dac_clk); 957 clk_disable_unprepare(venc.tv_dac_clk);
958 958
959 dispc_runtime_put(); 959 dispc_runtime_put(venc.dss->dispc);
960 960
961 return 0; 961 return 0;
962} 962}
@@ -965,7 +965,7 @@ static int venc_runtime_resume(struct device *dev)
965{ 965{
966 int r; 966 int r;
967 967
968 r = dispc_runtime_get(); 968 r = dispc_runtime_get(venc.dss->dispc);
969 if (r < 0) 969 if (r < 0)
970 return r; 970 return r;
971 971
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index ffe4f698d291..6c4d40b824e4 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -117,10 +117,13 @@ static int omap_crtc_dss_connect(struct omap_drm_private *priv,
117 enum omap_channel channel, 117 enum omap_channel channel,
118 struct omap_dss_device *dst) 118 struct omap_dss_device *dst)
119{ 119{
120 const struct dispc_ops *dispc_ops = priv->dispc_ops;
121 struct dispc_device *dispc = priv->dispc;
122
120 if (omap_crtc_output[channel]) 123 if (omap_crtc_output[channel])
121 return -EINVAL; 124 return -EINVAL;
122 125
123 if (!(priv->dispc_ops->mgr_get_supported_outputs(channel) & dst->id)) 126 if (!(dispc_ops->mgr_get_supported_outputs(dispc, channel) & dst->id))
124 return -EINVAL; 127 return -EINVAL;
125 128
126 omap_crtc_output[channel] = dst; 129 omap_crtc_output[channel] = dst;
@@ -157,7 +160,7 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
157 return; 160 return;
158 161
159 if (omap_crtc_output[channel]->output_type == OMAP_DISPLAY_TYPE_HDMI) { 162 if (omap_crtc_output[channel]->output_type == OMAP_DISPLAY_TYPE_HDMI) {
160 priv->dispc_ops->mgr_enable(channel, enable); 163 priv->dispc_ops->mgr_enable(priv->dispc, channel, enable);
161 omap_crtc->enabled = enable; 164 omap_crtc->enabled = enable;
162 return; 165 return;
163 } 166 }
@@ -170,8 +173,9 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
170 omap_crtc->ignore_digit_sync_lost = true; 173 omap_crtc->ignore_digit_sync_lost = true;
171 } 174 }
172 175
173 framedone_irq = priv->dispc_ops->mgr_get_framedone_irq(channel); 176 framedone_irq = priv->dispc_ops->mgr_get_framedone_irq(priv->dispc,
174 vsync_irq = priv->dispc_ops->mgr_get_vsync_irq(channel); 177 channel);
178 vsync_irq = priv->dispc_ops->mgr_get_vsync_irq(priv->dispc, channel);
175 179
176 if (enable) { 180 if (enable) {
177 wait = omap_irq_wait_init(dev, vsync_irq, 1); 181 wait = omap_irq_wait_init(dev, vsync_irq, 1);
@@ -191,7 +195,7 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
191 wait = omap_irq_wait_init(dev, vsync_irq, 2); 195 wait = omap_irq_wait_init(dev, vsync_irq, 2);
192 } 196 }
193 197
194 priv->dispc_ops->mgr_enable(channel, enable); 198 priv->dispc_ops->mgr_enable(priv->dispc, channel, enable);
195 omap_crtc->enabled = enable; 199 omap_crtc->enabled = enable;
196 200
197 ret = omap_irq_wait(dev, wait, msecs_to_jiffies(100)); 201 ret = omap_irq_wait(dev, wait, msecs_to_jiffies(100));
@@ -213,7 +217,8 @@ static int omap_crtc_dss_enable(struct omap_drm_private *priv,
213{ 217{
214 struct omap_crtc *omap_crtc = omap_crtcs[channel]; 218 struct omap_crtc *omap_crtc = omap_crtcs[channel];
215 219
216 priv->dispc_ops->mgr_set_timings(omap_crtc->channel, &omap_crtc->vm); 220 priv->dispc_ops->mgr_set_timings(priv->dispc, omap_crtc->channel,
221 &omap_crtc->vm);
217 omap_crtc_set_enabled(&omap_crtc->base, true); 222 omap_crtc_set_enabled(&omap_crtc->base, true);
218 223
219 return 0; 224 return 0;
@@ -243,7 +248,8 @@ static void omap_crtc_dss_set_lcd_config(struct omap_drm_private *priv,
243 struct omap_crtc *omap_crtc = omap_crtcs[channel]; 248 struct omap_crtc *omap_crtc = omap_crtcs[channel];
244 249
245 DBG("%s", omap_crtc->name); 250 DBG("%s", omap_crtc->name);
246 priv->dispc_ops->mgr_set_lcd_config(omap_crtc->channel, config); 251 priv->dispc_ops->mgr_set_lcd_config(priv->dispc, omap_crtc->channel,
252 config);
247} 253}
248 254
249static int omap_crtc_dss_register_framedone( 255static int omap_crtc_dss_register_framedone(
@@ -300,7 +306,7 @@ void omap_crtc_vblank_irq(struct drm_crtc *crtc)
300 * If the dispc is busy we're racing the flush operation. Try again on 306 * If the dispc is busy we're racing the flush operation. Try again on
301 * the next vblank interrupt. 307 * the next vblank interrupt.
302 */ 308 */
303 if (priv->dispc_ops->mgr_go_busy(omap_crtc->channel)) { 309 if (priv->dispc_ops->mgr_go_busy(priv->dispc, omap_crtc->channel)) {
304 spin_unlock(&crtc->dev->event_lock); 310 spin_unlock(&crtc->dev->event_lock);
305 return; 311 return;
306 } 312 }
@@ -337,7 +343,7 @@ static void omap_crtc_write_crtc_properties(struct drm_crtc *crtc)
337 info.partial_alpha_enabled = false; 343 info.partial_alpha_enabled = false;
338 info.cpr_enable = false; 344 info.cpr_enable = false;
339 345
340 priv->dispc_ops->mgr_setup(omap_crtc->channel, &info); 346 priv->dispc_ops->mgr_setup(priv->dispc, omap_crtc->channel, &info);
341} 347}
342 348
343/* ----------------------------------------------------------------------------- 349/* -----------------------------------------------------------------------------
@@ -537,7 +543,8 @@ static void omap_crtc_atomic_flush(struct drm_crtc *crtc,
537 length = crtc->state->gamma_lut->length / 543 length = crtc->state->gamma_lut->length /
538 sizeof(*lut); 544 sizeof(*lut);
539 } 545 }
540 priv->dispc_ops->mgr_set_gamma(omap_crtc->channel, lut, length); 546 priv->dispc_ops->mgr_set_gamma(priv->dispc, omap_crtc->channel,
547 lut, length);
541 } 548 }
542 549
543 omap_crtc_write_crtc_properties(crtc); 550 omap_crtc_write_crtc_properties(crtc);
@@ -552,7 +559,7 @@ static void omap_crtc_atomic_flush(struct drm_crtc *crtc,
552 WARN_ON(ret != 0); 559 WARN_ON(ret != 0);
553 560
554 spin_lock_irq(&crtc->dev->event_lock); 561 spin_lock_irq(&crtc->dev->event_lock);
555 priv->dispc_ops->mgr_go(omap_crtc->channel); 562 priv->dispc_ops->mgr_go(priv->dispc, omap_crtc->channel);
556 omap_crtc_arm_event(crtc); 563 omap_crtc_arm_event(crtc);
557 spin_unlock_irq(&crtc->dev->event_lock); 564 spin_unlock_irq(&crtc->dev->event_lock);
558} 565}
@@ -734,7 +741,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
734 * extracted with dispc_mgr_gamma_size(). If it returns 0 741 * extracted with dispc_mgr_gamma_size(). If it returns 0
735 * gamma table is not supprted. 742 * gamma table is not supprted.
736 */ 743 */
737 if (priv->dispc_ops->mgr_gamma_size(channel)) { 744 if (priv->dispc_ops->mgr_gamma_size(priv->dispc, channel)) {
738 unsigned int gamma_lut_size = 256; 745 unsigned int gamma_lut_size = 256;
739 746
740 drm_crtc_enable_color_mgmt(crtc, 0, false, gamma_lut_size); 747 drm_crtc_enable_color_mgmt(crtc, 0, false, gamma_lut_size);
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index a93916cd0258..65a567dcf3ab 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -69,7 +69,7 @@ static void omap_atomic_commit_tail(struct drm_atomic_state *old_state)
69 struct drm_device *dev = old_state->dev; 69 struct drm_device *dev = old_state->dev;
70 struct omap_drm_private *priv = dev->dev_private; 70 struct omap_drm_private *priv = dev->dev_private;
71 71
72 priv->dispc_ops->runtime_get(); 72 priv->dispc_ops->runtime_get(priv->dispc);
73 73
74 /* Apply the atomic update. */ 74 /* Apply the atomic update. */
75 drm_atomic_helper_commit_modeset_disables(dev, old_state); 75 drm_atomic_helper_commit_modeset_disables(dev, old_state);
@@ -113,7 +113,7 @@ static void omap_atomic_commit_tail(struct drm_atomic_state *old_state)
113 113
114 drm_atomic_helper_cleanup_planes(dev, old_state); 114 drm_atomic_helper_cleanup_planes(dev, old_state);
115 115
116 priv->dispc_ops->runtime_put(); 116 priv->dispc_ops->runtime_put(priv->dispc);
117} 117}
118 118
119static const struct drm_mode_config_helper_funcs omap_mode_config_helper_funcs = { 119static const struct drm_mode_config_helper_funcs omap_mode_config_helper_funcs = {
@@ -191,7 +191,7 @@ cleanup:
191static int omap_modeset_init_properties(struct drm_device *dev) 191static int omap_modeset_init_properties(struct drm_device *dev)
192{ 192{
193 struct omap_drm_private *priv = dev->dev_private; 193 struct omap_drm_private *priv = dev->dev_private;
194 unsigned int num_planes = priv->dispc_ops->get_num_ovls(); 194 unsigned int num_planes = priv->dispc_ops->get_num_ovls(priv->dispc);
195 195
196 priv->zorder_prop = drm_property_create_range(dev, 0, "zorder", 0, 196 priv->zorder_prop = drm_property_create_range(dev, 0, "zorder", 0,
197 num_planes - 1); 197 num_planes - 1);
@@ -205,8 +205,8 @@ static int omap_modeset_init(struct drm_device *dev)
205{ 205{
206 struct omap_drm_private *priv = dev->dev_private; 206 struct omap_drm_private *priv = dev->dev_private;
207 struct omap_dss_device *dssdev = NULL; 207 struct omap_dss_device *dssdev = NULL;
208 int num_ovls = priv->dispc_ops->get_num_ovls(); 208 int num_ovls = priv->dispc_ops->get_num_ovls(priv->dispc);
209 int num_mgrs = priv->dispc_ops->get_num_mgrs(); 209 int num_mgrs = priv->dispc_ops->get_num_mgrs(priv->dispc);
210 int num_crtcs, crtc_idx, plane_idx; 210 int num_crtcs, crtc_idx, plane_idx;
211 int ret; 211 int ret;
212 u32 plane_crtc_mask; 212 u32 plane_crtc_mask;
@@ -521,6 +521,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
521 521
522 priv->dev = dev; 522 priv->dev = dev;
523 priv->dss = omapdss_get_dss(); 523 priv->dss = omapdss_get_dss();
524 priv->dispc = dispc_get_dispc(priv->dss);
524 priv->dispc_ops = dispc_get_ops(priv->dss); 525 priv->dispc_ops = dispc_get_ops(priv->dss);
525 526
526 omap_crtc_pre_init(priv); 527 omap_crtc_pre_init(priv);
@@ -549,7 +550,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
549 /* Get memory bandwidth limits */ 550 /* Get memory bandwidth limits */
550 if (priv->dispc_ops->get_memory_bandwidth_limit) 551 if (priv->dispc_ops->get_memory_bandwidth_limit)
551 priv->max_bandwidth = 552 priv->max_bandwidth =
552 priv->dispc_ops->get_memory_bandwidth_limit(); 553 priv->dispc_ops->get_memory_bandwidth_limit(priv->dispc);
553 554
554 omap_gem_init(ddev); 555 omap_gem_init(ddev);
555 556
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index a7962c14fc7c..6eaee4df4559 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -51,6 +51,7 @@ struct omap_drm_private {
51 u32 omaprev; 51 u32 omaprev;
52 52
53 struct dss_device *dss; 53 struct dss_device *dss;
54 struct dispc_device *dispc;
54 const struct dispc_ops *dispc_ops; 55 const struct dispc_ops *dispc_ops;
55 56
56 unsigned int num_crtcs; 57 unsigned int num_crtcs;
diff --git a/drivers/gpu/drm/omapdrm/omap_irq.c b/drivers/gpu/drm/omapdrm/omap_irq.c
index 976dc0e44482..c85115049f86 100644
--- a/drivers/gpu/drm/omapdrm/omap_irq.c
+++ b/drivers/gpu/drm/omapdrm/omap_irq.c
@@ -38,7 +38,7 @@ static void omap_irq_update(struct drm_device *dev)
38 38
39 DBG("irqmask=%08x", irqmask); 39 DBG("irqmask=%08x", irqmask);
40 40
41 priv->dispc_ops->write_irqenable(irqmask); 41 priv->dispc_ops->write_irqenable(priv->dispc, irqmask);
42} 42}
43 43
44static void omap_irq_wait_handler(struct omap_irq_wait *wait) 44static void omap_irq_wait_handler(struct omap_irq_wait *wait)
@@ -108,7 +108,8 @@ int omap_irq_enable_vblank(struct drm_crtc *crtc)
108 DBG("dev=%p, crtc=%u", dev, channel); 108 DBG("dev=%p, crtc=%u", dev, channel);
109 109
110 spin_lock_irqsave(&priv->wait_lock, flags); 110 spin_lock_irqsave(&priv->wait_lock, flags);
111 priv->irq_mask |= priv->dispc_ops->mgr_get_vsync_irq(channel); 111 priv->irq_mask |= priv->dispc_ops->mgr_get_vsync_irq(priv->dispc,
112 channel);
112 omap_irq_update(dev); 113 omap_irq_update(dev);
113 spin_unlock_irqrestore(&priv->wait_lock, flags); 114 spin_unlock_irqrestore(&priv->wait_lock, flags);
114 115
@@ -134,7 +135,8 @@ void omap_irq_disable_vblank(struct drm_crtc *crtc)
134 DBG("dev=%p, crtc=%u", dev, channel); 135 DBG("dev=%p, crtc=%u", dev, channel);
135 136
136 spin_lock_irqsave(&priv->wait_lock, flags); 137 spin_lock_irqsave(&priv->wait_lock, flags);
137 priv->irq_mask &= ~priv->dispc_ops->mgr_get_vsync_irq(channel); 138 priv->irq_mask &= ~priv->dispc_ops->mgr_get_vsync_irq(priv->dispc,
139 channel);
138 omap_irq_update(dev); 140 omap_irq_update(dev);
139 spin_unlock_irqrestore(&priv->wait_lock, flags); 141 spin_unlock_irqrestore(&priv->wait_lock, flags);
140} 142}
@@ -198,9 +200,9 @@ static irqreturn_t omap_irq_handler(int irq, void *arg)
198 unsigned int id; 200 unsigned int id;
199 u32 irqstatus; 201 u32 irqstatus;
200 202
201 irqstatus = priv->dispc_ops->read_irqstatus(); 203 irqstatus = priv->dispc_ops->read_irqstatus(priv->dispc);
202 priv->dispc_ops->clear_irqstatus(irqstatus); 204 priv->dispc_ops->clear_irqstatus(priv->dispc, irqstatus);
203 priv->dispc_ops->read_irqstatus(); /* flush posted write */ 205 priv->dispc_ops->read_irqstatus(priv->dispc); /* flush posted write */
204 206
205 VERB("irqs: %08x", irqstatus); 207 VERB("irqs: %08x", irqstatus);
206 208
@@ -208,12 +210,12 @@ static irqreturn_t omap_irq_handler(int irq, void *arg)
208 struct drm_crtc *crtc = priv->crtcs[id]; 210 struct drm_crtc *crtc = priv->crtcs[id];
209 enum omap_channel channel = omap_crtc_channel(crtc); 211 enum omap_channel channel = omap_crtc_channel(crtc);
210 212
211 if (irqstatus & priv->dispc_ops->mgr_get_vsync_irq(channel)) { 213 if (irqstatus & priv->dispc_ops->mgr_get_vsync_irq(priv->dispc, channel)) {
212 drm_handle_vblank(dev, id); 214 drm_handle_vblank(dev, id);
213 omap_crtc_vblank_irq(crtc); 215 omap_crtc_vblank_irq(crtc);
214 } 216 }
215 217
216 if (irqstatus & priv->dispc_ops->mgr_get_sync_lost_irq(channel)) 218 if (irqstatus & priv->dispc_ops->mgr_get_sync_lost_irq(priv->dispc, channel))
217 omap_crtc_error_irq(crtc, irqstatus); 219 omap_crtc_error_irq(crtc, irqstatus);
218 } 220 }
219 221
@@ -247,7 +249,7 @@ static const u32 omap_underflow_irqs[] = {
247int omap_drm_irq_install(struct drm_device *dev) 249int omap_drm_irq_install(struct drm_device *dev)
248{ 250{
249 struct omap_drm_private *priv = dev->dev_private; 251 struct omap_drm_private *priv = dev->dev_private;
250 unsigned int num_mgrs = priv->dispc_ops->get_num_mgrs(); 252 unsigned int num_mgrs = priv->dispc_ops->get_num_mgrs(priv->dispc);
251 unsigned int max_planes; 253 unsigned int max_planes;
252 unsigned int i; 254 unsigned int i;
253 int ret; 255 int ret;
@@ -265,13 +267,13 @@ int omap_drm_irq_install(struct drm_device *dev)
265 } 267 }
266 268
267 for (i = 0; i < num_mgrs; ++i) 269 for (i = 0; i < num_mgrs; ++i)
268 priv->irq_mask |= priv->dispc_ops->mgr_get_sync_lost_irq(i); 270 priv->irq_mask |= priv->dispc_ops->mgr_get_sync_lost_irq(priv->dispc, i);
269 271
270 priv->dispc_ops->runtime_get(); 272 priv->dispc_ops->runtime_get(priv->dispc);
271 priv->dispc_ops->clear_irqstatus(0xffffffff); 273 priv->dispc_ops->clear_irqstatus(priv->dispc, 0xffffffff);
272 priv->dispc_ops->runtime_put(); 274 priv->dispc_ops->runtime_put(priv->dispc);
273 275
274 ret = priv->dispc_ops->request_irq(omap_irq_handler, dev); 276 ret = priv->dispc_ops->request_irq(priv->dispc, omap_irq_handler, dev);
275 if (ret < 0) 277 if (ret < 0)
276 return ret; 278 return ret;
277 279
@@ -289,5 +291,5 @@ void omap_drm_irq_uninstall(struct drm_device *dev)
289 291
290 dev->irq_enabled = false; 292 dev->irq_enabled = false;
291 293
292 priv->dispc_ops->free_irq(dev); 294 priv->dispc_ops->free_irq(priv->dispc, dev);
293} 295}
diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c b/drivers/gpu/drm/omapdrm/omap_plane.c
index 0665ed9fe395..2899435cad6e 100644
--- a/drivers/gpu/drm/omapdrm/omap_plane.c
+++ b/drivers/gpu/drm/omapdrm/omap_plane.c
@@ -77,17 +77,17 @@ static void omap_plane_atomic_update(struct drm_plane *plane,
77 &info.paddr, &info.p_uv_addr); 77 &info.paddr, &info.p_uv_addr);
78 78
79 /* and finally, update omapdss: */ 79 /* and finally, update omapdss: */
80 ret = priv->dispc_ops->ovl_setup(omap_plane->id, &info, 80 ret = priv->dispc_ops->ovl_setup(priv->dispc, omap_plane->id, &info,
81 omap_crtc_timings(state->crtc), false, 81 omap_crtc_timings(state->crtc), false,
82 omap_crtc_channel(state->crtc)); 82 omap_crtc_channel(state->crtc));
83 if (ret) { 83 if (ret) {
84 dev_err(plane->dev->dev, "Failed to setup plane %s\n", 84 dev_err(plane->dev->dev, "Failed to setup plane %s\n",
85 omap_plane->name); 85 omap_plane->name);
86 priv->dispc_ops->ovl_enable(omap_plane->id, false); 86 priv->dispc_ops->ovl_enable(priv->dispc, omap_plane->id, false);
87 return; 87 return;
88 } 88 }
89 89
90 priv->dispc_ops->ovl_enable(omap_plane->id, true); 90 priv->dispc_ops->ovl_enable(priv->dispc, omap_plane->id, true);
91} 91}
92 92
93static void omap_plane_atomic_disable(struct drm_plane *plane, 93static void omap_plane_atomic_disable(struct drm_plane *plane,
@@ -100,7 +100,7 @@ static void omap_plane_atomic_disable(struct drm_plane *plane,
100 plane->state->zpos = plane->type == DRM_PLANE_TYPE_PRIMARY 100 plane->state->zpos = plane->type == DRM_PLANE_TYPE_PRIMARY
101 ? 0 : omap_plane->id; 101 ? 0 : omap_plane->id;
102 102
103 priv->dispc_ops->ovl_enable(omap_plane->id, false); 103 priv->dispc_ops->ovl_enable(priv->dispc, omap_plane->id, false);
104} 104}
105 105
106static int omap_plane_atomic_check(struct drm_plane *plane, 106static int omap_plane_atomic_check(struct drm_plane *plane,
@@ -259,7 +259,7 @@ struct drm_plane *omap_plane_init(struct drm_device *dev,
259 u32 possible_crtcs) 259 u32 possible_crtcs)
260{ 260{
261 struct omap_drm_private *priv = dev->dev_private; 261 struct omap_drm_private *priv = dev->dev_private;
262 unsigned int num_planes = priv->dispc_ops->get_num_ovls(); 262 unsigned int num_planes = priv->dispc_ops->get_num_ovls(priv->dispc);
263 struct drm_plane *plane; 263 struct drm_plane *plane;
264 struct omap_plane *omap_plane; 264 struct omap_plane *omap_plane;
265 enum omap_plane_id id; 265 enum omap_plane_id id;
@@ -278,7 +278,7 @@ struct drm_plane *omap_plane_init(struct drm_device *dev,
278 if (!omap_plane) 278 if (!omap_plane)
279 return ERR_PTR(-ENOMEM); 279 return ERR_PTR(-ENOMEM);
280 280
281 formats = priv->dispc_ops->ovl_get_color_modes(id); 281 formats = priv->dispc_ops->ovl_get_color_modes(priv->dispc, id);
282 for (nformats = 0; formats[nformats]; ++nformats) 282 for (nformats = 0; formats[nformats]; ++nformats)
283 ; 283 ;
284 omap_plane->id = id; 284 omap_plane->id = id;