Hi,

On Fri, Oct 13, 2017 at 05:59:40PM +0300, Laurent Pinchart wrote:
> 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.pinch...@ideasonboard.com>
> ---

Reviewed-by: Sebastian Reichel <sebastian.reic...@collabora.co.uk>

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dispc.c   | 221 
> +++++++++++++++++++---------------
>  drivers/gpu/drm/omapdrm/dss/dpi.c     |   6 +-
>  drivers/gpu/drm/omapdrm/dss/dsi.c     |   4 +-
>  drivers/gpu/drm/omapdrm/dss/dss.c     |   7 +-
>  drivers/gpu/drm/omapdrm/dss/dss.h     |   7 +-
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c   |   7 +-
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c   |   7 +-
>  drivers/gpu/drm/omapdrm/dss/omapdss.h |  91 ++++++++------
>  drivers/gpu/drm/omapdrm/dss/sdi.c     |   6 +-
>  drivers/gpu/drm/omapdrm/dss/venc.c    |   4 +-
>  drivers/gpu/drm/omapdrm/omap_crtc.c   |  31 +++--
>  drivers/gpu/drm/omapdrm/omap_drv.c    |  18 +--
>  drivers/gpu/drm/omapdrm/omap_drv.h    |   5 +-
>  drivers/gpu/drm/omapdrm/omap_irq.c    |  32 ++---
>  drivers/gpu/drm/omapdrm/omap_plane.c  |  12 +-
>  15 files changed, 261 insertions(+), 197 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c 
> b/drivers/gpu/drm/omapdrm/dss/dispc.c
> index 912957c471ce..1bca5785b8a8 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dispc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dispc.c
> @@ -164,7 +164,7 @@ struct dispc_features {
>  #define DISPC_MAX_NR_FIFOS 5
>  #define DISPC_MAX_CHANNEL_GAMMA 4
>  
> -static struct {
> +struct dispc_device {
>       struct platform_device *pdev;
>       void __iomem    *base;
>       struct dss_device *dss;
> @@ -196,7 +196,9 @@ static struct {
>  
>       /* DISPC_CONTROL & DISPC_CONFIG lock*/
>       spinlock_t control_lock;
> -} dispc;
> +};
> +
> +static struct dispc_device dispc;
>  
>  enum omap_color_component {
>       /* used for all color formats for OMAP3 and earlier
> @@ -363,9 +365,7 @@ static unsigned long dispc_mgr_pclk_rate(enum 
> omap_channel channel);
>  static unsigned long dispc_plane_pclk_rate(enum omap_plane_id plane);
>  static unsigned long dispc_plane_lclk_rate(enum omap_plane_id plane);
>  
> -static void dispc_clear_irqstatus(u32 mask);
> -static bool dispc_mgr_is_enabled(enum omap_channel channel);
> -static void dispc_clear_irqstatus(u32 mask);
> +static void dispc_clear_irqstatus(struct dispc_device *dispc, u32 mask);
>  
>  static inline void dispc_write_reg(const u16 idx, u32 val)
>  {
> @@ -398,14 +398,14 @@ static void mgr_fld_write(enum omap_channel channel,
>               spin_unlock_irqrestore(&dispc.control_lock, flags);
>  }
>  
> -static int dispc_get_num_ovls(void)
> +static int dispc_get_num_ovls(struct dispc_device *dispc)
>  {
> -     return dispc.feat->num_ovls;
> +     return dispc->feat->num_ovls;
>  }
>  
> -static int dispc_get_num_mgrs(void)
> +static int dispc_get_num_mgrs(struct dispc_device *dispc)
>  {
> -     return dispc.feat->num_mgrs;
> +     return dispc->feat->num_mgrs;
>  }
>  
>  static void dispc_get_reg_field(enum dispc_feat_reg_field id,
> @@ -457,7 +457,7 @@ static void dispc_save_context(void)
>               SR(CONFIG3);
>       }
>  
> -     for (i = 0; i < dispc_get_num_mgrs(); i++) {
> +     for (i = 0; i < dispc_get_num_mgrs(&dispc); i++) {
>               SR(DEFAULT_COLOR(i));
>               SR(TRANS_COLOR(i));
>               SR(SIZE_MGR(i));
> @@ -479,7 +479,7 @@ static void dispc_save_context(void)
>               }
>       }
>  
> -     for (i = 0; i < dispc_get_num_ovls(); i++) {
> +     for (i = 0; i < dispc_get_num_ovls(&dispc); i++) {
>               SR(OVL_BA0(i));
>               SR(OVL_BA1(i));
>               SR(OVL_POSITION(i));
> @@ -563,7 +563,7 @@ static void dispc_restore_context(void)
>       if (dispc_has_feature(FEAT_MGR_LCD3))
>               RR(CONFIG3);
>  
> -     for (i = 0; i < dispc_get_num_mgrs(); i++) {
> +     for (i = 0; i < dispc_get_num_mgrs(&dispc); i++) {
>               RR(DEFAULT_COLOR(i));
>               RR(TRANS_COLOR(i));
>               RR(SIZE_MGR(i));
> @@ -585,7 +585,7 @@ static void dispc_restore_context(void)
>               }
>       }
>  
> -     for (i = 0; i < dispc_get_num_ovls(); i++) {
> +     for (i = 0; i < dispc_get_num_ovls(&dispc); i++) {
>               RR(OVL_BA0(i));
>               RR(OVL_BA1(i));
>               RR(OVL_POSITION(i));
> @@ -650,7 +650,7 @@ static void dispc_restore_context(void)
>       if (dispc_has_feature(FEAT_MGR_LCD3))
>               RR(CONTROL3);
>       /* clear spurious SYNC_LOST_DIGIT interrupts */
> -     dispc_clear_irqstatus(DISPC_IRQ_SYNC_LOST_DIGIT);
> +     dispc_clear_irqstatus(&dispc, DISPC_IRQ_SYNC_LOST_DIGIT);
>  
>       /*
>        * enable last so IRQs won't trigger before
> @@ -664,41 +664,44 @@ static void dispc_restore_context(void)
>  #undef SR
>  #undef RR
>  
> -int dispc_runtime_get(void)
> +int dispc_runtime_get(struct dispc_device *dispc)
>  {
>       int r;
>  
>       DSSDBG("dispc_runtime_get\n");
>  
> -     r = pm_runtime_get_sync(&dispc.pdev->dev);
> +     r = pm_runtime_get_sync(&dispc->pdev->dev);
>       WARN_ON(r < 0);
>       return r < 0 ? r : 0;
>  }
>  
> -void dispc_runtime_put(void)
> +void dispc_runtime_put(struct dispc_device *dispc)
>  {
>       int r;
>  
>       DSSDBG("dispc_runtime_put\n");
>  
> -     r = pm_runtime_put_sync(&dispc.pdev->dev);
> +     r = pm_runtime_put_sync(&dispc->pdev->dev);
>       WARN_ON(r < 0 && r != -ENOSYS);
>  }
>  
> -static u32 dispc_mgr_get_vsync_irq(enum omap_channel channel)
> +static u32 dispc_mgr_get_vsync_irq(struct dispc_device *dispc,
> +                                enum omap_channel channel)
>  {
>       return mgr_desc[channel].vsync_irq;
>  }
>  
> -static u32 dispc_mgr_get_framedone_irq(enum omap_channel channel)
> +static u32 dispc_mgr_get_framedone_irq(struct dispc_device *dispc,
> +                                    enum omap_channel channel)
>  {
> -     if (channel == OMAP_DSS_CHANNEL_DIGIT && dispc.feat->no_framedone_tv)
> +     if (channel == OMAP_DSS_CHANNEL_DIGIT && dispc->feat->no_framedone_tv)
>               return 0;
>  
>       return mgr_desc[channel].framedone_irq;
>  }
>  
> -static u32 dispc_mgr_get_sync_lost_irq(enum omap_channel channel)
> +static u32 dispc_mgr_get_sync_lost_irq(struct dispc_device *dispc,
> +                                    enum omap_channel channel)
>  {
>       return mgr_desc[channel].sync_lost_irq;
>  }
> @@ -708,27 +711,30 @@ u32 dispc_wb_get_framedone_irq(void)
>       return DISPC_IRQ_FRAMEDONEWB;
>  }
>  
> -static void dispc_mgr_enable(enum omap_channel channel, bool enable)
> +static void dispc_mgr_enable(struct dispc_device *dispc,
> +                          enum omap_channel channel, bool enable)
>  {
>       mgr_fld_write(channel, DISPC_MGR_FLD_ENABLE, enable);
>       /* flush posted write */
>       mgr_fld_read(channel, DISPC_MGR_FLD_ENABLE);
>  }
>  
> -static bool dispc_mgr_is_enabled(enum omap_channel channel)
> +static bool dispc_mgr_is_enabled(struct dispc_device *dispc,
> +                              enum omap_channel channel)
>  {
>       return !!mgr_fld_read(channel, DISPC_MGR_FLD_ENABLE);
>  }
>  
> -static bool dispc_mgr_go_busy(enum omap_channel channel)
> +static bool dispc_mgr_go_busy(struct dispc_device *dispc,
> +                           enum omap_channel channel)
>  {
>       return mgr_fld_read(channel, DISPC_MGR_FLD_GO) == 1;
>  }
>  
> -static void dispc_mgr_go(enum omap_channel channel)
> +static void dispc_mgr_go(struct dispc_device *dispc, enum omap_channel 
> channel)
>  {
> -     WARN_ON(!dispc_mgr_is_enabled(channel));
> -     WARN_ON(dispc_mgr_go_busy(channel));
> +     WARN_ON(!dispc_mgr_is_enabled(dispc, channel));
> +     WARN_ON(dispc_mgr_go_busy(dispc, channel));
>  
>       DSSDBG("GO %s\n", mgr_desc[channel].name);
>  
> @@ -866,7 +872,7 @@ static void dispc_ovl_write_color_conv_coef(enum 
> omap_plane_id plane,
>  static void dispc_setup_color_conv_coef(void)
>  {
>       int i;
> -     int num_ovl = dispc_get_num_ovls();
> +     int num_ovl = dispc_get_num_ovls(&dispc);
>       const struct color_conv_coef ctbl_bt601_5_ovl = {
>               /* YUV -> RGB */
>               298, 409, 0, 298, -208, -100, 298, 0, 517, 0,
> @@ -958,7 +964,7 @@ static void dispc_ovl_enable_zorder_planes(void)
>       if (!dispc_has_feature(FEAT_ALPHA_FREE_ZORDER))
>               return;
>  
> -     for (i = 0; i < dispc_get_num_ovls(); i++)
> +     for (i = 0; i < dispc_get_num_ovls(&dispc); i++)
>               REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(i), 1, 25, 25);
>  }
>  
> @@ -1215,7 +1221,7 @@ static void dispc_configure_burst_sizes(void)
>       const int burst_size = BURST_SIZE_X8;
>  
>       /* Configure burst size always to maximum size */
> -     for (i = 0; i < dispc_get_num_ovls(); ++i)
> +     for (i = 0; i < dispc_get_num_ovls(&dispc); ++i)
>               dispc_ovl_set_burst_size(i, burst_size);
>       if (dispc.feat->has_writeback)
>               dispc_ovl_set_burst_size(OMAP_DSS_WB, burst_size);
> @@ -1242,9 +1248,10 @@ static bool dispc_ovl_color_mode_supported(enum 
> omap_plane_id plane, u32 fourcc)
>       return false;
>  }
>  
> -static const u32 *dispc_ovl_get_color_modes(enum omap_plane_id plane)
> +static const u32 *dispc_ovl_get_color_modes(struct dispc_device *dispc,
> +                                         enum omap_plane_id plane)
>  {
> -     return dispc.feat->supported_color_modes[plane];
> +     return dispc->feat->supported_color_modes[plane];
>  }
>  
>  static void dispc_mgr_enable_cpr(enum omap_channel channel, bool enable)
> @@ -1361,7 +1368,7 @@ static void dispc_init_fifos(void)
>       /*
>        * Setup default fifo thresholds.
>        */
> -     for (i = 0; i < dispc_get_num_ovls(); ++i) {
> +     for (i = 0; i < dispc_get_num_ovls(&dispc); ++i) {
>               u32 low, high;
>               const bool use_fifomerge = false;
>               const bool manual_update = false;
> @@ -1464,7 +1471,7 @@ void dispc_ovl_compute_fifo_thresholds(enum 
> omap_plane_id plane,
>  
>       if (use_fifomerge) {
>               total_fifo_size = 0;
> -             for (i = 0; i < dispc_get_num_ovls(); ++i)
> +             for (i = 0; i < dispc_get_num_ovls(&dispc); ++i)
>                       total_fifo_size += dispc_ovl_get_fifo_size(i);
>       } else {
>               total_fifo_size = ovl_fifo_size;
> @@ -1530,7 +1537,7 @@ static void dispc_init_mflag(void)
>               (1 << 0) |      /* MFLAG_CTRL = force always on */
>               (0 << 2));      /* MFLAG_START = disable */
>  
> -     for (i = 0; i < dispc_get_num_ovls(); ++i) {
> +     for (i = 0; i < dispc_get_num_ovls(&dispc); ++i) {
>               u32 size = dispc_ovl_get_fifo_size(i);
>               u32 unit = dispc.feat->buffer_size_unit;
>               u32 low, high;
> @@ -2633,13 +2640,14 @@ static int dispc_ovl_setup_common(enum omap_plane_id 
> plane,
>       return 0;
>  }
>  
> -static int dispc_ovl_setup(enum omap_plane_id plane,
> -             const struct omap_overlay_info *oi,
> -             const struct videomode *vm, bool mem_to_mem,
> -             enum omap_channel channel)
> +static int dispc_ovl_setup(struct dispc_device *dispc,
> +                        enum omap_plane_id plane,
> +                        const struct omap_overlay_info *oi,
> +                        const struct videomode *vm, bool mem_to_mem,
> +                        enum omap_channel channel)
>  {
>       int r;
> -     enum omap_overlay_caps caps = dispc.feat->overlay_caps[plane];
> +     enum omap_overlay_caps caps = dispc->feat->overlay_caps[plane];
>       const bool replication = true;
>  
>       DSSDBG("dispc_ovl_setup %d, pa %pad, pa_uv %pad, sw %d, %d,%d, %dx%d ->"
> @@ -2726,7 +2734,8 @@ int dispc_wb_setup(const struct omap_dss_writeback_info 
> *wi,
>       return r;
>  }
>  
> -static int dispc_ovl_enable(enum omap_plane_id plane, bool enable)
> +static int dispc_ovl_enable(struct dispc_device *dispc,
> +                         enum omap_plane_id plane, bool enable)
>  {
>       DSSDBG("dispc_enable_plane %d, %d\n", plane, enable);
>  
> @@ -2735,9 +2744,11 @@ static int dispc_ovl_enable(enum omap_plane_id plane, 
> bool enable)
>       return 0;
>  }
>  
> -static enum omap_dss_output_id dispc_mgr_get_supported_outputs(enum 
> omap_channel channel)
> +static enum omap_dss_output_id
> +dispc_mgr_get_supported_outputs(struct dispc_device *dispc,
> +                             enum omap_channel channel)
>  {
> -     return dss_get_supported_outputs(dispc.dss, channel);
> +     return dss_get_supported_outputs(dispc->dss, channel);
>  }
>  
>  static void dispc_lcd_enable_signal_polarity(bool act_high)
> @@ -2812,8 +2823,9 @@ static void dispc_mgr_enable_alpha_fixed_zorder(enum 
> omap_channel ch,
>               REG_FLD_MOD(DISPC_CONFIG, enable, 19, 19);
>  }
>  
> -static void dispc_mgr_setup(enum omap_channel channel,
> -             const struct omap_overlay_manager_info *info)
> +static void dispc_mgr_setup(struct dispc_device *dispc,
> +                         enum omap_channel channel,
> +                         const struct omap_overlay_manager_info *info)
>  {
>       dispc_mgr_set_default_color(channel, info->default_color);
>       dispc_mgr_set_trans_key(channel, info->trans_key_type, info->trans_key);
> @@ -2885,8 +2897,9 @@ static void dispc_mgr_enable_stallmode(enum 
> omap_channel channel, bool enable)
>       mgr_fld_write(channel, DISPC_MGR_FLD_STALLMODE, enable);
>  }
>  
> -static void dispc_mgr_set_lcd_config(enum omap_channel channel,
> -             const struct dss_lcd_mgr_config *config)
> +static void dispc_mgr_set_lcd_config(struct dispc_device *dispc,
> +                                  enum omap_channel channel,
> +                                  const struct dss_lcd_mgr_config *config)
>  {
>       dispc_mgr_set_io_pad_mode(config->io_pad_mode);
>  
> @@ -3041,8 +3054,9 @@ static int vm_flag_to_int(enum display_flags flags, 
> enum display_flags high,
>  }
>  
>  /* change name to mode? */
> -static void dispc_mgr_set_timings(enum omap_channel channel,
> -                        const struct videomode *vm)
> +static void dispc_mgr_set_timings(struct dispc_device *dispc,
> +                               enum omap_channel channel,
> +                               const struct videomode *vm)
>  {
>       unsigned int xtot, ytot;
>       unsigned long ht, vt;
> @@ -3080,7 +3094,7 @@ static void dispc_mgr_set_timings(enum omap_channel 
> channel,
>               if (t.flags & DISPLAY_FLAGS_INTERLACED)
>                       t.vactive /= 2;
>  
> -             if (dispc.feat->supports_double_pixel)
> +             if (dispc->feat->supports_double_pixel)
>                       REG_FLD_MOD(DISPC_CONTROL,
>                                   !!(t.flags & DISPLAY_FLAGS_DOUBLECLK),
>                                   19, 17);
> @@ -3243,7 +3257,7 @@ void dispc_dump_clocks(struct seq_file *s)
>       u32 l;
>       enum dss_clk_source dispc_clk_src = dss_get_dispc_clk_source(dispc.dss);
>  
> -     if (dispc_runtime_get())
> +     if (dispc_runtime_get(&dispc))
>               return;
>  
>       seq_printf(s, "- DISPC -\n");
> @@ -3269,7 +3283,7 @@ void dispc_dump_clocks(struct seq_file *s)
>       if (dispc_has_feature(FEAT_MGR_LCD3))
>               dispc_dump_clocks_channel(s, OMAP_DSS_CHANNEL_LCD3);
>  
> -     dispc_runtime_put();
> +     dispc_runtime_put(&dispc);
>  }
>  
>  static int dispc_dump_regs(struct seq_file *s, void *p)
> @@ -3292,7 +3306,7 @@ static int dispc_dump_regs(struct seq_file *s, void *p)
>  
>  #define DUMPREG(r) seq_printf(s, "%-50s %08x\n", #r, dispc_read_reg(r))
>  
> -     if (dispc_runtime_get())
> +     if (dispc_runtime_get(&dispc))
>               return 0;
>  
>       /* DISPC common registers */
> @@ -3330,7 +3344,7 @@ static int dispc_dump_regs(struct seq_file *s, void *p)
>       p_names = mgr_names;
>  
>       /* DISPC channel specific registers */
> -     for (i = 0; i < dispc_get_num_mgrs(); i++) {
> +     for (i = 0; i < dispc_get_num_mgrs(&dispc); i++) {
>               DUMPREG(i, DISPC_DEFAULT_COLOR);
>               DUMPREG(i, DISPC_TRANS_COLOR);
>               DUMPREG(i, DISPC_SIZE_MGR);
> @@ -3356,7 +3370,7 @@ static int dispc_dump_regs(struct seq_file *s, void *p)
>  
>       p_names = ovl_names;
>  
> -     for (i = 0; i < dispc_get_num_ovls(); i++) {
> +     for (i = 0; i < dispc_get_num_ovls(&dispc); i++) {
>               DUMPREG(i, DISPC_OVL_BA0);
>               DUMPREG(i, DISPC_OVL_BA1);
>               DUMPREG(i, DISPC_OVL_POSITION);
> @@ -3434,7 +3448,7 @@ static int dispc_dump_regs(struct seq_file *s, void *p)
>       /* Video pipeline coefficient registers */
>  
>       /* start from OMAP_DSS_VIDEO1 */
> -     for (i = 1; i < dispc_get_num_ovls(); i++) {
> +     for (i = 1; i < dispc_get_num_ovls(&dispc); i++) {
>               for (j = 0; j < 8; j++)
>                       DUMPREG(i, DISPC_OVL_FIR_COEF_H, j);
>  
> @@ -3461,7 +3475,7 @@ static int dispc_dump_regs(struct seq_file *s, void *p)
>               }
>       }
>  
> -     dispc_runtime_put();
> +     dispc_runtime_put(&dispc);
>  
>  #undef DISPC_REG
>  #undef DUMPREG
> @@ -3569,22 +3583,22 @@ int dispc_mgr_get_clock_div(enum omap_channel channel,
>       return 0;
>  }
>  
> -static u32 dispc_read_irqstatus(void)
> +static u32 dispc_read_irqstatus(struct dispc_device *dispc)
>  {
>       return dispc_read_reg(DISPC_IRQSTATUS);
>  }
>  
> -static void dispc_clear_irqstatus(u32 mask)
> +static void dispc_clear_irqstatus(struct dispc_device *dispc, u32 mask)
>  {
>       dispc_write_reg(DISPC_IRQSTATUS, mask);
>  }
>  
> -static void dispc_write_irqenable(u32 mask)
> +static void dispc_write_irqenable(struct dispc_device *dispc, u32 mask)
>  {
>       u32 old_mask = dispc_read_reg(DISPC_IRQENABLE);
>  
>       /* clear the irqstatus for newly enabled irqs */
> -     dispc_clear_irqstatus((mask ^ old_mask) & mask);
> +     dispc_clear_irqstatus(dispc, (mask ^ old_mask) & mask);
>  
>       dispc_write_reg(DISPC_IRQENABLE, mask);
>  
> @@ -3602,11 +3616,12 @@ void dispc_disable_sidle(void)
>       REG_FLD_MOD(DISPC_SYSCONFIG, 1, 4, 3);  /* SIDLEMODE: no idle */
>  }
>  
> -static u32 dispc_mgr_gamma_size(enum omap_channel channel)
> +static u32 dispc_mgr_gamma_size(struct dispc_device *dispc,
> +                             enum omap_channel channel)
>  {
>       const struct dispc_gamma_desc *gdesc = &mgr_desc[channel].gamma;
>  
> -     if (!dispc.feat->has_gamma_table)
> +     if (!dispc->feat->has_gamma_table)
>               return 0;
>  
>       return gdesc->len;
> @@ -3655,18 +3670,19 @@ static const struct drm_color_lut 
> dispc_mgr_gamma_default_lut[] = {
>       { .red = U16_MAX, .green = U16_MAX, .blue = U16_MAX, },
>  };
>  
> -static void dispc_mgr_set_gamma(enum omap_channel channel,
> -                      const struct drm_color_lut *lut,
> -                      unsigned int length)
> +static void dispc_mgr_set_gamma(struct dispc_device *dispc,
> +                             enum omap_channel channel,
> +                             const struct drm_color_lut *lut,
> +                             unsigned int length)
>  {
>       const struct dispc_gamma_desc *gdesc = &mgr_desc[channel].gamma;
> -     u32 *table = dispc.gamma_table[channel];
> +     u32 *table = dispc->gamma_table[channel];
>       uint i;
>  
>       DSSDBG("%s: channel %d, lut len %u, hw len %u\n", __func__,
>              channel, length, gdesc->len);
>  
> -     if (!dispc.feat->has_gamma_table)
> +     if (!dispc->feat->has_gamma_table)
>               return;
>  
>       if (lut == NULL || length < 2) {
> @@ -3698,7 +3714,7 @@ static void dispc_mgr_set_gamma(enum omap_channel 
> channel,
>               }
>       }
>  
> -     if (dispc.is_enabled)
> +     if (dispc->is_enabled)
>               dispc_mgr_write_gamma_table(channel);
>  }
>  
> @@ -3728,7 +3744,7 @@ static int dispc_init_gamma_tables(void)
>  
>               dispc.gamma_table[channel] = gt;
>  
> -             dispc_mgr_set_gamma(channel, NULL, 0);
> +             dispc_mgr_set_gamma(&dispc, channel, NULL, 0);
>       }
>       return 0;
>  }
> @@ -4298,35 +4314,36 @@ static irqreturn_t dispc_irq_handler(int irq, void 
> *arg)
>       return dispc.user_handler(irq, dispc.user_data);
>  }
>  
> -static int dispc_request_irq(irq_handler_t handler, void *dev_id)
> +static int dispc_request_irq(struct dispc_device *dispc, irq_handler_t 
> handler,
> +                          void *dev_id)
>  {
>       int r;
>  
> -     if (dispc.user_handler != NULL)
> +     if (dispc->user_handler != NULL)
>               return -EBUSY;
>  
> -     dispc.user_handler = handler;
> -     dispc.user_data = dev_id;
> +     dispc->user_handler = handler;
> +     dispc->user_data = dev_id;
>  
>       /* ensure the dispc_irq_handler sees the values above */
>       smp_wmb();
>  
> -     r = devm_request_irq(&dispc.pdev->dev, dispc.irq, dispc_irq_handler,
> -                          IRQF_SHARED, "OMAP DISPC", &dispc);
> +     r = devm_request_irq(&dispc->pdev->dev, dispc->irq, dispc_irq_handler,
> +                          IRQF_SHARED, "OMAP DISPC", dispc);
>       if (r) {
> -             dispc.user_handler = NULL;
> -             dispc.user_data = NULL;
> +             dispc->user_handler = NULL;
> +             dispc->user_data = NULL;
>       }
>  
>       return r;
>  }
>  
> -static void dispc_free_irq(void *dev_id)
> +static void dispc_free_irq(struct dispc_device *dispc, void *dev_id)
>  {
> -     devm_free_irq(&dispc.pdev->dev, dispc.irq, &dispc);
> +     devm_free_irq(&dispc->pdev->dev, dispc->irq, dispc);
>  
> -     dispc.user_handler = NULL;
> -     dispc.user_data = NULL;
> +     dispc->user_handler = NULL;
> +     dispc->user_data = NULL;
>  }
>  
>  /*
> @@ -4430,7 +4447,8 @@ static void dispc_errata_i734_wa_fini(void)
>  
>  static void dispc_errata_i734_wa(void)
>  {
> -     u32 framedone_irq = dispc_mgr_get_framedone_irq(OMAP_DSS_CHANNEL_LCD);
> +     u32 framedone_irq = dispc_mgr_get_framedone_irq(&dispc,
> +                                                     OMAP_DSS_CHANNEL_LCD);
>       struct omap_overlay_info ovli;
>       struct dss_lcd_mgr_config lcd_conf;
>       u32 gatestate;
> @@ -4449,39 +4467,39 @@ static void dispc_errata_i734_wa(void)
>       REG_FLD_MOD(DISPC_CONFIG, 0x1f, 8, 4);
>  
>       /* Setup and enable GFX plane */
> -     dispc_ovl_setup(OMAP_DSS_GFX, &ovli, &i734.vm, false,
> -             OMAP_DSS_CHANNEL_LCD);
> -     dispc_ovl_enable(OMAP_DSS_GFX, true);
> +     dispc_ovl_setup(&dispc, OMAP_DSS_GFX, &ovli, &i734.vm, false,
> +                     OMAP_DSS_CHANNEL_LCD);
> +     dispc_ovl_enable(&dispc, OMAP_DSS_GFX, true);
>  
>       /* Set up and enable display manager for LCD1 */
> -     dispc_mgr_setup(OMAP_DSS_CHANNEL_LCD, &i734.mgri);
> +     dispc_mgr_setup(&dispc, OMAP_DSS_CHANNEL_LCD, &i734.mgri);
>       dispc_calc_clock_rates(dss_get_dispc_clk_rate(dispc.dss),
>                              &lcd_conf.clock_info);
> -     dispc_mgr_set_lcd_config(OMAP_DSS_CHANNEL_LCD, &lcd_conf);
> -     dispc_mgr_set_timings(OMAP_DSS_CHANNEL_LCD, &i734.vm);
> +     dispc_mgr_set_lcd_config(&dispc, OMAP_DSS_CHANNEL_LCD, &lcd_conf);
> +     dispc_mgr_set_timings(&dispc, OMAP_DSS_CHANNEL_LCD, &i734.vm);
>  
> -     dispc_clear_irqstatus(framedone_irq);
> +     dispc_clear_irqstatus(&dispc, framedone_irq);
>  
>       /* Enable and shut the channel to produce just one frame */
> -     dispc_mgr_enable(OMAP_DSS_CHANNEL_LCD, true);
> -     dispc_mgr_enable(OMAP_DSS_CHANNEL_LCD, false);
> +     dispc_mgr_enable(&dispc, OMAP_DSS_CHANNEL_LCD, true);
> +     dispc_mgr_enable(&dispc, OMAP_DSS_CHANNEL_LCD, false);
>  
>       /* Busy wait for framedone. We can't fiddle with irq handlers
>        * in PM resume. Typically the loop runs less than 5 times and
>        * waits less than a micro second.
>        */
>       count = 0;
> -     while (!(dispc_read_irqstatus() & framedone_irq)) {
> +     while (!(dispc_read_irqstatus(&dispc) & framedone_irq)) {
>               if (count++ > 10000) {
>                       dev_err(&dispc.pdev->dev, "%s: framedone timeout\n",
>                               __func__);
>                       break;
>               }
>       }
> -     dispc_ovl_enable(OMAP_DSS_GFX, false);
> +     dispc_ovl_enable(&dispc, OMAP_DSS_GFX, false);
>  
>       /* Clear all irq bits before continuing */
> -     dispc_clear_irqstatus(0xffffffff);
> +     dispc_clear_irqstatus(&dispc, 0xffffffff);
>  
>       /* Restore the original state to LCD1 output gates */
>       REG_FLD_MOD(DISPC_CONFIG, gatestate, 8, 4);
> @@ -4599,7 +4617,7 @@ static int dispc_bind(struct device *dev, struct device 
> *master, void *data)
>  
>       pm_runtime_enable(&pdev->dev);
>  
> -     r = dispc_runtime_get();
> +     r = dispc_runtime_get(&dispc);
>       if (r)
>               goto err_runtime_get;
>  
> @@ -4609,9 +4627,10 @@ static int dispc_bind(struct device *dev, struct 
> device *master, void *data)
>       dev_dbg(&pdev->dev, "OMAP DISPC rev %d.%d\n",
>              FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
>  
> -     dispc_runtime_put();
> +     dispc_runtime_put(&dispc);
>  
>       dispc_set_ops(&dispc_ops);
> +     dss->dispc = &dispc;
>  
>       dispc.debugfs = dss_debugfs_create_file("dispc", dispc_dump_regs,
>                                               &dispc);
> @@ -4623,12 +4642,14 @@ static int dispc_bind(struct device *dev, struct 
> device *master, void *data)
>       return r;
>  }
>  
> -static void dispc_unbind(struct device *dev, struct device *master,
> -                            void *data)
> +static void dispc_unbind(struct device *dev, struct device *master, void 
> *data)
>  {
> +     struct dss_device *dss = dispc.dss;
> +
>       dss_debugfs_remove_file(dispc.debugfs);
>  
>       dispc_set_ops(NULL);
> +     dss->dispc = NULL;
>  
>       pm_runtime_disable(dev);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c 
> b/drivers/gpu/drm/omapdrm/dss/dpi.c
> index ae43ba81eb96..aa10db453fd0 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dpi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
> @@ -407,7 +407,7 @@ static int dpi_display_enable(struct omap_dss_device 
> *dssdev)
>                       goto err_reg_enable;
>       }
>  
> -     r = dispc_runtime_get();
> +     r = dispc_runtime_get(dpi->dss->dispc);
>       if (r)
>               goto err_get_dispc;
>  
> @@ -443,7 +443,7 @@ static int dpi_display_enable(struct omap_dss_device 
> *dssdev)
>               dss_pll_disable(dpi->pll);
>  err_pll_init:
>  err_src_sel:
> -     dispc_runtime_put();
> +     dispc_runtime_put(dpi->dss->dispc);
>  err_get_dispc:
>       if (dpi->vdds_dsi_reg)
>               regulator_disable(dpi->vdds_dsi_reg);
> @@ -467,7 +467,7 @@ static void dpi_display_disable(struct omap_dss_device 
> *dssdev)
>               dss_pll_disable(dpi->pll);
>       }
>  
> -     dispc_runtime_put();
> +     dispc_runtime_put(dpi->dss->dispc);
>  
>       if (dpi->vdds_dsi_reg)
>               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 eafea72998dd..1cac221e499a 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -5529,7 +5529,7 @@ static int dsi_runtime_suspend(struct device *dev)
>       /* wait for current handler to finish before turning the DSI off */
>       synchronize_irq(dsi->irq);
>  
> -     dispc_runtime_put();
> +     dispc_runtime_put(dsi->dss->dispc);
>  
>       return 0;
>  }
> @@ -5539,7 +5539,7 @@ static int dsi_runtime_resume(struct device *dev)
>       struct dsi_data *dsi = dev_get_drvdata(dev);
>       int r;
>  
> -     r = dispc_runtime_get();
> +     r = dispc_runtime_get(dsi->dss->dispc);
>       if (r)
>               return r;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c 
> b/drivers/gpu/drm/omapdrm/dss/dss.c
> index 0e8c70591308..fcdd7d00caa8 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.c
> @@ -887,6 +887,11 @@ struct dss_device *dss_get_device(struct device *dev)
>       return dev_get_drvdata(dev);
>  }
>  
> +struct dispc_device *dss_get_dispc(struct dss_device *dss)
> +{
> +     return dss->dispc;
> +}
> +
>  /* DEBUGFS */
>  #if defined(CONFIG_OMAP2_DSS_DEBUGFS)
>  static int dss_debug_dump_clocks(struct seq_file *s, void *p)
> @@ -1385,7 +1390,7 @@ static int dss_bind(struct device *dev)
>  
>       omapdss_gather_components(dev);
>  
> -     r = omapdrm_init(&dss->drm, dev);
> +     r = omapdrm_init(dss, &dss->drm, dev);
>       if (r)
>               goto err_drm_init;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h 
> b/drivers/gpu/drm/omapdrm/dss/dss.h
> index cda2cbd888f0..5f3e26bec402 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.h
> @@ -29,6 +29,7 @@
>  #include "../omap_drv.h"
>  
>  struct dentry;
> +struct dispc_device;
>  struct dss_debugfs_entry;
>  struct dss_device;
>  struct platform_device;
> @@ -276,6 +277,8 @@ struct dss_device {
>  
>       struct dss_pll  *video1_pll;
>       struct dss_pll  *video2_pll;
> +
> +     struct dispc_device *dispc;
>  };
>  
>  /* core */
> @@ -416,8 +419,8 @@ int dispc_init_platform_driver(void) __init;
>  void dispc_uninit_platform_driver(void);
>  void dispc_dump_clocks(struct seq_file *s);
>  
> -int dispc_runtime_get(void);
> -void dispc_runtime_put(void);
> +int dispc_runtime_get(struct dispc_device *dispc);
> +void dispc_runtime_put(struct dispc_device *dispc);
>  
>  void dispc_enable_sidle(void);
>  void dispc_disable_sidle(void);
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c 
> b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index 501813f03466..cf4b2c9bbcbd 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -847,16 +847,19 @@ static int hdmi4_remove(struct platform_device *pdev)
>  
>  static int hdmi_runtime_suspend(struct device *dev)
>  {
> -     dispc_runtime_put();
> +     struct omap_hdmi *hdmi = dev_get_drvdata(dev);
> +
> +     dispc_runtime_put(hdmi->dss->dispc);
>  
>       return 0;
>  }
>  
>  static int hdmi_runtime_resume(struct device *dev)
>  {
> +     struct omap_hdmi *hdmi = dev_get_drvdata(dev);
>       int r;
>  
> -     r = dispc_runtime_get();
> +     r = dispc_runtime_get(hdmi->dss->dispc);
>       if (r < 0)
>               return r;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c 
> b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index 44954bdea6ce..66b603c5b2fc 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -839,16 +839,19 @@ static int hdmi5_remove(struct platform_device *pdev)
>  
>  static int hdmi_runtime_suspend(struct device *dev)
>  {
> -     dispc_runtime_put();
> +     struct omap_hdmi *hdmi = dev_get_drvdata(dev);
> +
> +     dispc_runtime_put(hdmi->dss->dispc);
>  
>       return 0;
>  }
>  
>  static int hdmi_runtime_resume(struct device *dev)
>  {
> +     struct omap_hdmi *hdmi = dev_get_drvdata(dev);
>       int r;
>  
> -     r = dispc_runtime_get();
> +     r = dispc_runtime_get(hdmi->dss->dispc);
>       if (r < 0)
>               return r;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h 
> b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> index 76ce94376454..9ebd695de075 100644
> --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
> @@ -61,6 +61,8 @@
>  
>  struct omap_drm_private;
>  struct omap_dss_device;
> +struct dispc_device;
> +struct dss_device;
>  struct dss_lcd_mgr_config;
>  struct snd_aes_iec958;
>  struct snd_cea_861_aud_if;
> @@ -683,49 +685,64 @@ void dss_mgr_unregister_framedone_handler(struct 
> omap_dss_device *dssdev,
>  /* dispc ops */
>  
>  struct dispc_ops {
> -     u32 (*read_irqstatus)(void);
> -     void (*clear_irqstatus)(u32 mask);
> -     void (*write_irqenable)(u32 mask);
> -
> -     int (*request_irq)(irq_handler_t handler, void *dev_id);
> -     void (*free_irq)(void *dev_id);
> -
> -     int (*runtime_get)(void);
> -     void (*runtime_put)(void);
> -
> -     int (*get_num_ovls)(void);
> -     int (*get_num_mgrs)(void);
> -
> -     void (*mgr_enable)(enum omap_channel channel, bool enable);
> -     bool (*mgr_is_enabled)(enum omap_channel channel);
> -     u32 (*mgr_get_vsync_irq)(enum omap_channel channel);
> -     u32 (*mgr_get_framedone_irq)(enum omap_channel channel);
> -     u32 (*mgr_get_sync_lost_irq)(enum omap_channel channel);
> -     bool (*mgr_go_busy)(enum omap_channel channel);
> -     void (*mgr_go)(enum omap_channel channel);
> -     void (*mgr_set_lcd_config)(enum omap_channel channel,
> -                     const struct dss_lcd_mgr_config *config);
> -     void (*mgr_set_timings)(enum omap_channel channel,
> -                     const struct videomode *vm);
> -     void (*mgr_setup)(enum omap_channel channel,
> -                     const struct omap_overlay_manager_info *info);
> -     enum omap_dss_output_id (*mgr_get_supported_outputs)(enum omap_channel 
> channel);
> -     u32 (*mgr_gamma_size)(enum omap_channel channel);
> -     void (*mgr_set_gamma)(enum omap_channel channel,
> -             const struct drm_color_lut *lut,
> -             unsigned int length);
> -
> -     int (*ovl_enable)(enum omap_plane_id plane, bool enable);
> -     int (*ovl_setup)(enum omap_plane_id plane,
> +     u32 (*read_irqstatus)(struct dispc_device *dispc);
> +     void (*clear_irqstatus)(struct dispc_device *dispc, u32 mask);
> +     void (*write_irqenable)(struct dispc_device *dispc, u32 mask);
> +
> +     int (*request_irq)(struct dispc_device *dispc, irq_handler_t handler,
> +                        void *dev_id);
> +     void (*free_irq)(struct dispc_device *dispc, void *dev_id);
> +
> +     int (*runtime_get)(struct dispc_device *dispc);
> +     void (*runtime_put)(struct dispc_device *dispc);
> +
> +     int (*get_num_ovls)(struct dispc_device *dispc);
> +     int (*get_num_mgrs)(struct dispc_device *dispc);
> +
> +     void (*mgr_enable)(struct dispc_device *dispc,
> +                        enum omap_channel channel, bool enable);
> +     bool (*mgr_is_enabled)(struct dispc_device *dispc,
> +                            enum omap_channel channel);
> +     u32 (*mgr_get_vsync_irq)(struct dispc_device *dispc,
> +                              enum omap_channel channel);
> +     u32 (*mgr_get_framedone_irq)(struct dispc_device *dispc,
> +                                  enum omap_channel channel);
> +     u32 (*mgr_get_sync_lost_irq)(struct dispc_device *dispc,
> +                                  enum omap_channel channel);
> +     bool (*mgr_go_busy)(struct dispc_device *dispc,
> +                         enum omap_channel channel);
> +     void (*mgr_go)(struct dispc_device *dispc, enum omap_channel channel);
> +     void (*mgr_set_lcd_config)(struct dispc_device *dispc,
> +                                enum omap_channel channel,
> +                                const struct dss_lcd_mgr_config *config);
> +     void (*mgr_set_timings)(struct dispc_device *dispc,
> +                             enum omap_channel channel,
> +                             const struct videomode *vm);
> +     void (*mgr_setup)(struct dispc_device *dispc, enum omap_channel channel,
> +                       const struct omap_overlay_manager_info *info);
> +     enum omap_dss_output_id (*mgr_get_supported_outputs)(
> +                     struct dispc_device *dispc, enum omap_channel channel);
> +     u32 (*mgr_gamma_size)(struct dispc_device *dispc,
> +                           enum omap_channel channel);
> +     void (*mgr_set_gamma)(struct dispc_device *dispc,
> +                           enum omap_channel channel,
> +                           const struct drm_color_lut *lut,
> +                           unsigned int length);
> +
> +     int (*ovl_enable)(struct dispc_device *dispc, enum omap_plane_id plane,
> +                       bool enable);
> +     int (*ovl_setup)(struct dispc_device *dispc, enum omap_plane_id plane,
>                        const struct omap_overlay_info *oi,
> -                     const struct videomode *vm, bool mem_to_mem,
> -                     enum omap_channel channel);
> +                      const struct videomode *vm, bool mem_to_mem,
> +                      enum omap_channel channel);
>  
> -     const u32 *(*ovl_get_color_modes)(enum omap_plane_id plane);
> +     const u32 *(*ovl_get_color_modes)(struct dispc_device *dispc,
> +                                       enum omap_plane_id plane);
>  };
>  
>  void dispc_set_ops(const struct dispc_ops *o);
>  const struct dispc_ops *dispc_get_ops(void);
> +struct dispc_device *dss_get_dispc(struct dss_device *dss);
>  
>  bool omapdss_component_is_display(struct device_node *node);
>  bool omapdss_component_is_output(struct device_node *node);
> diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c 
> b/drivers/gpu/drm/omapdrm/dss/sdi.c
> index c41bf0d7dd18..efa73cfabce6 100644
> --- a/drivers/gpu/drm/omapdrm/dss/sdi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
> @@ -144,7 +144,7 @@ static int sdi_display_enable(struct omap_dss_device 
> *dssdev)
>       if (r)
>               goto err_reg_enable;
>  
> -     r = dispc_runtime_get();
> +     r = dispc_runtime_get(sdi->dss->dispc);
>       if (r)
>               goto err_get_dispc;
>  
> @@ -206,7 +206,7 @@ static int sdi_display_enable(struct omap_dss_device 
> *dssdev)
>  err_sdi_enable:
>  err_set_dss_clock_div:
>  err_calc_clock_div:
> -     dispc_runtime_put();
> +     dispc_runtime_put(sdi->dss->dispc);
>  err_get_dispc:
>       regulator_disable(sdi->vdds_sdi_reg);
>  err_reg_enable:
> @@ -221,7 +221,7 @@ static void sdi_display_disable(struct omap_dss_device 
> *dssdev)
>  
>       dss_sdi_disable(sdi->dss);
>  
> -     dispc_runtime_put();
> +     dispc_runtime_put(sdi->dss->dispc);
>  
>       regulator_disable(sdi->vdds_sdi_reg);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c 
> b/drivers/gpu/drm/omapdrm/dss/venc.c
> index f120d2910d0d..13ed7426ea09 100644
> --- a/drivers/gpu/drm/omapdrm/dss/venc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
> @@ -990,7 +990,7 @@ static int venc_runtime_suspend(struct device *dev)
>       if (venc->tv_dac_clk)
>               clk_disable_unprepare(venc->tv_dac_clk);
>  
> -     dispc_runtime_put();
> +     dispc_runtime_put(venc->dss->dispc);
>  
>       return 0;
>  }
> @@ -1000,7 +1000,7 @@ static int venc_runtime_resume(struct device *dev)
>       struct venc_device *venc = dev_get_drvdata(dev);
>       int r;
>  
> -     r = dispc_runtime_get();
> +     r = dispc_runtime_get(venc->dss->dispc);
>       if (r < 0)
>               return r;
>  
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c 
> b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index 90a61a8199b4..494d10cd3233 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -118,12 +118,13 @@ static int omap_crtc_dss_connect(struct 
> omap_drm_private *priv,
>               enum omap_channel channel,
>               struct omap_dss_device *dst)
>  {
> -     const struct dispc_ops *dispc_ops = dispc_get_ops();
> +     const struct dispc_ops *dispc_ops = priv->dispc_ops;
> +     struct dispc_device *dispc = priv->dispc;
>  
>       if (omap_crtc_output[channel])
>               return -EINVAL;
>  
> -     if ((dispc_ops->mgr_get_supported_outputs(channel) & dst->id) == 0)
> +     if (!(dispc_ops->mgr_get_supported_outputs(dispc, channel) & dst->id))
>               return -EINVAL;
>  
>       omap_crtc_output[channel] = dst;
> @@ -160,7 +161,7 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, 
> bool enable)
>               return;
>  
>       if (omap_crtc_output[channel]->output_type == OMAP_DISPLAY_TYPE_HDMI) {
> -             priv->dispc_ops->mgr_enable(channel, enable);
> +             priv->dispc_ops->mgr_enable(priv->dispc, channel, enable);
>               omap_crtc->enabled = enable;
>               return;
>       }
> @@ -173,8 +174,9 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, 
> bool enable)
>               omap_crtc->ignore_digit_sync_lost = true;
>       }
>  
> -     framedone_irq = priv->dispc_ops->mgr_get_framedone_irq(channel);
> -     vsync_irq = priv->dispc_ops->mgr_get_vsync_irq(channel);
> +     framedone_irq = priv->dispc_ops->mgr_get_framedone_irq(priv->dispc,
> +                                                            channel);
> +     vsync_irq = priv->dispc_ops->mgr_get_vsync_irq(priv->dispc, channel);
>  
>       if (enable) {
>               wait = omap_irq_wait_init(dev, vsync_irq, 1);
> @@ -194,7 +196,7 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, 
> bool enable)
>                       wait = omap_irq_wait_init(dev, vsync_irq, 2);
>       }
>  
> -     priv->dispc_ops->mgr_enable(channel, enable);
> +     priv->dispc_ops->mgr_enable(priv->dispc, channel, enable);
>       omap_crtc->enabled = enable;
>  
>       ret = omap_irq_wait(dev, wait, msecs_to_jiffies(100));
> @@ -216,7 +218,8 @@ static int omap_crtc_dss_enable(struct omap_drm_private 
> *priv,
>  {
>       struct omap_crtc *omap_crtc = omap_crtcs[channel];
>  
> -     priv->dispc_ops->mgr_set_timings(omap_crtc->channel, &omap_crtc->vm);
> +     priv->dispc_ops->mgr_set_timings(priv->dispc, omap_crtc->channel,
> +                                      &omap_crtc->vm);
>       omap_crtc_set_enabled(&omap_crtc->base, true);
>  
>       return 0;
> @@ -246,7 +249,8 @@ static void omap_crtc_dss_set_lcd_config(struct 
> omap_drm_private *priv,
>       struct omap_crtc *omap_crtc = omap_crtcs[channel];
>  
>       DBG("%s", omap_crtc->name);
> -     priv->dispc_ops->mgr_set_lcd_config(omap_crtc->channel, config);
> +     priv->dispc_ops->mgr_set_lcd_config(priv->dispc, omap_crtc->channel,
> +                                         config);
>  }
>  
>  static int omap_crtc_dss_register_framedone(
> @@ -303,7 +307,7 @@ void omap_crtc_vblank_irq(struct drm_crtc *crtc)
>        * If the dispc is busy we're racing the flush operation. Try again on
>        * the next vblank interrupt.
>        */
> -     if (priv->dispc_ops->mgr_go_busy(omap_crtc->channel)) {
> +     if (priv->dispc_ops->mgr_go_busy(priv->dispc, omap_crtc->channel)) {
>               spin_unlock(&crtc->dev->event_lock);
>               return;
>       }
> @@ -340,7 +344,7 @@ static void omap_crtc_write_crtc_properties(struct 
> drm_crtc *crtc)
>       info.partial_alpha_enabled = false;
>       info.cpr_enable = false;
>  
> -     priv->dispc_ops->mgr_setup(omap_crtc->channel, &info);
> +     priv->dispc_ops->mgr_setup(priv->dispc, omap_crtc->channel, &info);
>  }
>  
>  /* 
> -----------------------------------------------------------------------------
> @@ -505,7 +509,8 @@ static void omap_crtc_atomic_flush(struct drm_crtc *crtc,
>                       length = crtc->state->gamma_lut->length /
>                               sizeof(*lut);
>               }
> -             priv->dispc_ops->mgr_set_gamma(omap_crtc->channel, lut, length);
> +             priv->dispc_ops->mgr_set_gamma(priv->dispc, omap_crtc->channel,
> +                                            lut, length);
>       }
>  
>       omap_crtc_write_crtc_properties(crtc);
> @@ -520,7 +525,7 @@ static void omap_crtc_atomic_flush(struct drm_crtc *crtc,
>       WARN_ON(ret != 0);
>  
>       spin_lock_irq(&crtc->dev->event_lock);
> -     priv->dispc_ops->mgr_go(omap_crtc->channel);
> +     priv->dispc_ops->mgr_go(priv->dispc, omap_crtc->channel);
>       omap_crtc_arm_event(crtc);
>       spin_unlock_irq(&crtc->dev->event_lock);
>  }
> @@ -701,7 +706,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>        * extracted with dispc_mgr_gamma_size(). If it returns 0
>        * gamma table is not supprted.
>        */
> -     if (priv->dispc_ops->mgr_gamma_size(channel)) {
> +     if (priv->dispc_ops->mgr_gamma_size(priv->dispc, channel)) {
>               unsigned int gamma_lut_size = 256;
>  
>               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 baf8e32b899b..36b2d89f60db 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -79,7 +79,7 @@ static void omap_atomic_commit_tail(struct drm_atomic_state 
> *old_state)
>       struct drm_device *dev = old_state->dev;
>       struct omap_drm_private *priv = dev->dev_private;
>  
> -     priv->dispc_ops->runtime_get();
> +     priv->dispc_ops->runtime_get(priv->dispc);
>  
>       /* Apply the atomic update. */
>       drm_atomic_helper_commit_modeset_disables(dev, old_state);
> @@ -123,7 +123,7 @@ static void omap_atomic_commit_tail(struct 
> drm_atomic_state *old_state)
>  
>       drm_atomic_helper_cleanup_planes(dev, old_state);
>  
> -     priv->dispc_ops->runtime_put();
> +     priv->dispc_ops->runtime_put(priv->dispc);
>  }
>  
>  static const struct drm_mode_config_helper_funcs 
> omap_mode_config_helper_funcs = {
> @@ -201,7 +201,7 @@ static int omap_connect_dssdevs(void)
>  static int omap_modeset_init_properties(struct drm_device *dev)
>  {
>       struct omap_drm_private *priv = dev->dev_private;
> -     unsigned int num_planes = priv->dispc_ops->get_num_ovls();
> +     unsigned int num_planes = priv->dispc_ops->get_num_ovls(priv->dispc);
>  
>       priv->zorder_prop = drm_property_create_range(dev, 0, "zorder", 0,
>                                                     num_planes - 1);
> @@ -215,8 +215,8 @@ static int omap_modeset_init(struct drm_device *dev)
>  {
>       struct omap_drm_private *priv = dev->dev_private;
>       struct omap_dss_device *dssdev = NULL;
> -     int num_ovls = priv->dispc_ops->get_num_ovls();
> -     int num_mgrs = priv->dispc_ops->get_num_mgrs();
> +     int num_ovls = priv->dispc_ops->get_num_ovls(priv->dispc);
> +     int num_mgrs = priv->dispc_ops->get_num_mgrs(priv->dispc);
>       int num_crtcs, crtc_idx, plane_idx;
>       int ret;
>       u32 plane_crtc_mask;
> @@ -542,7 +542,8 @@ static const struct soc_device_attribute 
> omapdrm_soc_devices[] = {
>       { /* sentinel */ }
>  };
>  
> -int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
> +int omapdrm_init(struct dss_device *dss, struct omap_drm_private *priv,
> +              struct device *dev)
>  {
>       const struct soc_device_attribute *soc;
>       struct drm_device *ddev;
> @@ -553,14 +554,15 @@ int omapdrm_init(struct omap_drm_private *priv, struct 
> device *dev)
>  
>       priv->dev = dev;
>  
> +     priv->dispc = dss_get_dispc(dss);
> +     priv->dispc_ops = dispc_get_ops();
> +
>       omap_crtc_pre_init();
>  
>       ret = omap_connect_dssdevs();
>       if (ret)
>               goto err_crtc_uninit;
>  
> -     priv->dispc_ops = dispc_get_ops();
> -
>       soc = soc_device_match(omapdrm_soc_devices);
>       priv->omaprev = soc ? (unsigned int)soc->data : 0;
>       priv->wq = alloc_ordered_workqueue("omapdrm", 0);
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h 
> b/drivers/gpu/drm/omapdrm/omap_drv.h
> index e10b9105379a..3ccc1b289201 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.h
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
> @@ -45,6 +45,7 @@
>  
>  #define MODULE_NAME     "omapdrm"
>  
> +struct dss_device;
>  struct omap_drm_usergart;
>  
>  struct omap_drm_private {
> @@ -52,6 +53,7 @@ struct omap_drm_private {
>       struct device *dev;
>       u32 omaprev;
>  
> +     struct dispc_device *dispc;
>       const struct dispc_ops *dispc_ops;
>  
>       unsigned int num_crtcs;
> @@ -88,7 +90,8 @@ struct omap_drm_private {
>       u32 irq_mask;                   /* enabled irqs in addition to 
> wait_list */
>  };
>  
> -int omapdrm_init(struct omap_drm_private *priv, struct device *dev);
> +int omapdrm_init(struct dss_device *dss, struct omap_drm_private *priv,
> +              struct device *dev);
>  void omapdrm_cleanup(struct omap_drm_private *priv);
>  int omap_drm_suspend(struct omap_drm_private *priv);
>  int omap_drm_resume(struct omap_drm_private *priv);
> diff --git a/drivers/gpu/drm/omapdrm/omap_irq.c 
> b/drivers/gpu/drm/omapdrm/omap_irq.c
> index ef5132237100..dd2180b641e0 100644
> --- a/drivers/gpu/drm/omapdrm/omap_irq.c
> +++ b/drivers/gpu/drm/omapdrm/omap_irq.c
> @@ -40,7 +40,7 @@ static void omap_irq_update(struct drm_device *dev)
>  
>       DBG("irqmask=%08x", irqmask);
>  
> -     priv->dispc_ops->write_irqenable(irqmask);
> +     priv->dispc_ops->write_irqenable(priv->dispc, irqmask);
>  }
>  
>  static void omap_irq_wait_handler(struct omap_irq_wait *wait)
> @@ -110,7 +110,8 @@ int omap_irq_enable_vblank(struct drm_crtc *crtc)
>       DBG("dev=%p, crtc=%u", dev, channel);
>  
>       spin_lock_irqsave(&priv->wait_lock, flags);
> -     priv->irq_mask |= priv->dispc_ops->mgr_get_vsync_irq(channel);
> +     priv->irq_mask |= priv->dispc_ops->mgr_get_vsync_irq(priv->dispc,
> +                                                          channel);
>       omap_irq_update(dev);
>       spin_unlock_irqrestore(&priv->wait_lock, flags);
>  
> @@ -136,7 +137,8 @@ void omap_irq_disable_vblank(struct drm_crtc *crtc)
>       DBG("dev=%p, crtc=%u", dev, channel);
>  
>       spin_lock_irqsave(&priv->wait_lock, flags);
> -     priv->irq_mask &= ~priv->dispc_ops->mgr_get_vsync_irq(channel);
> +     priv->irq_mask &= ~priv->dispc_ops->mgr_get_vsync_irq(priv->dispc,
> +                                                           channel);
>       omap_irq_update(dev);
>       spin_unlock_irqrestore(&priv->wait_lock, flags);
>  }
> @@ -200,9 +202,9 @@ static irqreturn_t omap_irq_handler(int irq, void *arg)
>       unsigned int id;
>       u32 irqstatus;
>  
> -     irqstatus = priv->dispc_ops->read_irqstatus();
> -     priv->dispc_ops->clear_irqstatus(irqstatus);
> -     priv->dispc_ops->read_irqstatus();        /* flush posted write */
> +     irqstatus = priv->dispc_ops->read_irqstatus(priv->dispc);
> +     priv->dispc_ops->clear_irqstatus(priv->dispc, irqstatus);
> +     priv->dispc_ops->read_irqstatus(priv->dispc);   /* flush posted write */
>  
>       VERB("irqs: %08x", irqstatus);
>  
> @@ -210,12 +212,12 @@ static irqreturn_t omap_irq_handler(int irq, void *arg)
>               struct drm_crtc *crtc = priv->crtcs[id];
>               enum omap_channel channel = omap_crtc_channel(crtc);
>  
> -             if (irqstatus & priv->dispc_ops->mgr_get_vsync_irq(channel)) {
> +             if (irqstatus & priv->dispc_ops->mgr_get_vsync_irq(priv->dispc, 
> channel)) {
>                       drm_handle_vblank(dev, id);
>                       omap_crtc_vblank_irq(crtc);
>               }
>  
> -             if (irqstatus & priv->dispc_ops->mgr_get_sync_lost_irq(channel))
> +             if (irqstatus & 
> priv->dispc_ops->mgr_get_sync_lost_irq(priv->dispc, channel))
>                       omap_crtc_error_irq(crtc, irqstatus);
>       }
>  
> @@ -249,7 +251,7 @@ static const u32 omap_underflow_irqs[] = {
>  int omap_drm_irq_install(struct drm_device *dev)
>  {
>       struct omap_drm_private *priv = dev->dev_private;
> -     unsigned int num_mgrs = priv->dispc_ops->get_num_mgrs();
> +     unsigned int num_mgrs = priv->dispc_ops->get_num_mgrs(priv->dispc);
>       unsigned int max_planes;
>       unsigned int i;
>       int ret;
> @@ -267,13 +269,13 @@ int omap_drm_irq_install(struct drm_device *dev)
>       }
>  
>       for (i = 0; i < num_mgrs; ++i)
> -             priv->irq_mask |= priv->dispc_ops->mgr_get_sync_lost_irq(i);
> +             priv->irq_mask |= 
> priv->dispc_ops->mgr_get_sync_lost_irq(priv->dispc, i);
>  
> -     priv->dispc_ops->runtime_get();
> -     priv->dispc_ops->clear_irqstatus(0xffffffff);
> -     priv->dispc_ops->runtime_put();
> +     priv->dispc_ops->runtime_get(priv->dispc);
> +     priv->dispc_ops->clear_irqstatus(priv->dispc, 0xffffffff);
> +     priv->dispc_ops->runtime_put(priv->dispc);
>  
> -     ret = priv->dispc_ops->request_irq(omap_irq_handler, dev);
> +     ret = priv->dispc_ops->request_irq(priv->dispc, omap_irq_handler, dev);
>       if (ret < 0)
>               return ret;
>  
> @@ -291,5 +293,5 @@ void omap_drm_irq_uninstall(struct drm_device *dev)
>  
>       dev->irq_enabled = false;
>  
> -     priv->dispc_ops->free_irq(dev);
> +     priv->dispc_ops->free_irq(priv->dispc, dev);
>  }
> diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c 
> b/drivers/gpu/drm/omapdrm/omap_plane.c
> index 903e0fa5442a..26b32b04c17b 100644
> --- a/drivers/gpu/drm/omapdrm/omap_plane.c
> +++ b/drivers/gpu/drm/omapdrm/omap_plane.c
> @@ -79,17 +79,17 @@ static void omap_plane_atomic_update(struct drm_plane 
> *plane,
>                       &info.paddr, &info.p_uv_addr);
>  
>       /* and finally, update omapdss: */
> -     ret = priv->dispc_ops->ovl_setup(omap_plane->id, &info,
> +     ret = priv->dispc_ops->ovl_setup(priv->dispc, omap_plane->id, &info,
>                             omap_crtc_timings(state->crtc), false,
>                             omap_crtc_channel(state->crtc));
>       if (ret) {
>               dev_err(plane->dev->dev, "Failed to setup plane %s\n",
>                       omap_plane->name);
> -             priv->dispc_ops->ovl_enable(omap_plane->id, false);
> +             priv->dispc_ops->ovl_enable(priv->dispc, omap_plane->id, false);
>               return;
>       }
>  
> -     priv->dispc_ops->ovl_enable(omap_plane->id, true);
> +     priv->dispc_ops->ovl_enable(priv->dispc, omap_plane->id, true);
>  }
>  
>  static void omap_plane_atomic_disable(struct drm_plane *plane,
> @@ -102,7 +102,7 @@ static void omap_plane_atomic_disable(struct drm_plane 
> *plane,
>       plane->state->zpos = plane->type == DRM_PLANE_TYPE_PRIMARY
>                          ? 0 : omap_plane->id;
>  
> -     priv->dispc_ops->ovl_enable(omap_plane->id, false);
> +     priv->dispc_ops->ovl_enable(priv->dispc, omap_plane->id, false);
>  }
>  
>  static int omap_plane_atomic_check(struct drm_plane *plane,
> @@ -261,7 +261,7 @@ struct drm_plane *omap_plane_init(struct drm_device *dev,
>               u32 possible_crtcs)
>  {
>       struct omap_drm_private *priv = dev->dev_private;
> -     unsigned int num_planes = priv->dispc_ops->get_num_ovls();
> +     unsigned int num_planes = priv->dispc_ops->get_num_ovls(priv->dispc);
>       struct drm_plane *plane;
>       struct omap_plane *omap_plane;
>       enum omap_plane_id id;
> @@ -280,7 +280,7 @@ struct drm_plane *omap_plane_init(struct drm_device *dev,
>       if (!omap_plane)
>               return ERR_PTR(-ENOMEM);
>  
> -     formats = priv->dispc_ops->ovl_get_color_modes(id);
> +     formats = priv->dispc_ops->ovl_get_color_modes(priv->dispc, id);
>       for (nformats = 0; formats[nformats]; ++nformats)
>               ;
>       omap_plane->id = id;
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

Attachment: signature.asc
Description: PGP signature

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to