u16 width, u16 height, u16 out_width, u16 out_height,
                bool mem_to_mem);
        u8 num_fifos;
+       const struct dss_reg_field *reg_fields;
+       const unsigned int num_reg_fields;
        const enum omap_overlay_caps *overlay_caps;
        const u32 **supported_color_modes;
        unsigned int num_mgrs;
        DISPC_MGR_FLD_NUM,
 };
 
+/* DISPC register field id */
+enum dispc_feat_reg_field {
+       FEAT_REG_FIRHINC,
+       FEAT_REG_FIRVINC,
+       FEAT_REG_FIFOHIGHTHRESHOLD,
+       FEAT_REG_FIFOLOWTHRESHOLD,
+       FEAT_REG_FIFOSIZE,
+       FEAT_REG_HORIZONTALACCU,
+       FEAT_REG_VERTICALACCU,
+};
+
 struct dispc_reg_field {
        u16 reg;
        u8 high;
        return dispc.feat->num_mgrs;
 }
 
+static void dispc_get_reg_field(enum dispc_feat_reg_field id,
+                               u8 *start, u8 *end)
+{
+       if (id >= dispc.feat->num_reg_fields)
+               BUG();
+
+       *start = dispc.feat->reg_fields[id].start;
+       *end = dispc.feat->reg_fields[id].end;
+}
+
 #define SR(reg) \
        dispc.ctx[DISPC_##reg / sizeof(u32)] = dispc_read_reg(DISPC_##reg)
 #define RR(reg) \
 
        unit = dispc.feat->buffer_size_unit;
 
-       dss_feat_get_reg_field(FEAT_REG_FIFOSIZE, &start, &end);
+       dispc_get_reg_field(FEAT_REG_FIFOSIZE, &start, &end);
 
        for (fifo = 0; fifo < dispc.feat->num_fifos; ++fifo) {
                size = REG_GET(DISPC_OVL_FIFO_SIZE_STATUS(fifo), start, end);
        low /= unit;
        high /= unit;
 
-       dss_feat_get_reg_field(FEAT_REG_FIFOHIGHTHRESHOLD, &hi_start, &hi_end);
-       dss_feat_get_reg_field(FEAT_REG_FIFOLOWTHRESHOLD, &lo_start, &lo_end);
+       dispc_get_reg_field(FEAT_REG_FIFOHIGHTHRESHOLD, &hi_start, &hi_end);
+       dispc_get_reg_field(FEAT_REG_FIFOLOWTHRESHOLD, &lo_start, &lo_end);
 
        DSSDBG("fifo(%d) threshold (bytes), old %u/%u, new %u/%u\n",
                        plane,
        if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) {
                u8 hinc_start, hinc_end, vinc_start, vinc_end;
 
-               dss_feat_get_reg_field(FEAT_REG_FIRHINC,
-                                       &hinc_start, &hinc_end);
-               dss_feat_get_reg_field(FEAT_REG_FIRVINC,
-                                       &vinc_start, &vinc_end);
+               dispc_get_reg_field(FEAT_REG_FIRHINC, &hinc_start, &hinc_end);
+               dispc_get_reg_field(FEAT_REG_FIRVINC, &vinc_start, &vinc_end);
                val = FLD_VAL(vinc, vinc_start, vinc_end) |
                                FLD_VAL(hinc, hinc_start, hinc_end);
 
        u32 val;
        u8 hor_start, hor_end, vert_start, vert_end;
 
-       dss_feat_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end);
-       dss_feat_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end);
+       dispc_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end);
+       dispc_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end);
 
        val = FLD_VAL(vaccu, vert_start, vert_end) |
                        FLD_VAL(haccu, hor_start, hor_end);
        u32 val;
        u8 hor_start, hor_end, vert_start, vert_end;
 
-       dss_feat_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end);
-       dss_feat_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end);
+       dispc_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end);
+       dispc_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end);
 
        val = FLD_VAL(vaccu, vert_start, vert_end) |
                        FLD_VAL(haccu, hor_start, hor_end);
                dispc_init_mflag();
 }
 
+static const struct dss_reg_field omap2_dispc_reg_fields[] = {
+       [FEAT_REG_FIRHINC]                      = { 11, 0 },
+       [FEAT_REG_FIRVINC]                      = { 27, 16 },
+       [FEAT_REG_FIFOLOWTHRESHOLD]             = { 8, 0 },
+       [FEAT_REG_FIFOHIGHTHRESHOLD]            = { 24, 16 },
+       [FEAT_REG_FIFOSIZE]                     = { 8, 0 },
+       [FEAT_REG_HORIZONTALACCU]               = { 9, 0 },
+       [FEAT_REG_VERTICALACCU]                 = { 25, 16 },
+};
+
+static const struct dss_reg_field omap3_dispc_reg_fields[] = {
+       [FEAT_REG_FIRHINC]                      = { 12, 0 },
+       [FEAT_REG_FIRVINC]                      = { 28, 16 },
+       [FEAT_REG_FIFOLOWTHRESHOLD]             = { 11, 0 },
+       [FEAT_REG_FIFOHIGHTHRESHOLD]            = { 27, 16 },
+       [FEAT_REG_FIFOSIZE]                     = { 10, 0 },
+       [FEAT_REG_HORIZONTALACCU]               = { 9, 0 },
+       [FEAT_REG_VERTICALACCU]                 = { 25, 16 },
+};
+
+static const struct dss_reg_field omap4_dispc_reg_fields[] = {
+       [FEAT_REG_FIRHINC]                      = { 12, 0 },
+       [FEAT_REG_FIRVINC]                      = { 28, 16 },
+       [FEAT_REG_FIFOLOWTHRESHOLD]             = { 15, 0 },
+       [FEAT_REG_FIFOHIGHTHRESHOLD]            = { 31, 16 },
+       [FEAT_REG_FIFOSIZE]                     = { 15, 0 },
+       [FEAT_REG_HORIZONTALACCU]               = { 10, 0 },
+       [FEAT_REG_VERTICALACCU]                 = { 26, 16 },
+};
+
 static const enum omap_overlay_caps omap2_dispc_overlay_caps[] = {
        /* OMAP_DSS_GFX */
        OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
        .calc_scaling           =       dispc_ovl_calc_scaling_24xx,
        .calc_core_clk          =       calc_core_clk_24xx,
        .num_fifos              =       3,
+       .reg_fields             =       omap2_dispc_reg_fields,
+       .num_reg_fields         =       ARRAY_SIZE(omap2_dispc_reg_fields),
        .overlay_caps           =       omap2_dispc_overlay_caps,
        .supported_color_modes  =       omap2_dispc_supported_color_modes,
        .num_mgrs               =       2,
        .calc_scaling           =       dispc_ovl_calc_scaling_34xx,
        .calc_core_clk          =       calc_core_clk_34xx,
        .num_fifos              =       3,
+       .reg_fields             =       omap3_dispc_reg_fields,
+       .num_reg_fields         =       ARRAY_SIZE(omap3_dispc_reg_fields),
        .overlay_caps           =       omap3430_dispc_overlay_caps,
        .supported_color_modes  =       omap3_dispc_supported_color_modes,
        .num_mgrs               =       2,
        .calc_scaling           =       dispc_ovl_calc_scaling_34xx,
        .calc_core_clk          =       calc_core_clk_34xx,
        .num_fifos              =       3,
+       .reg_fields             =       omap3_dispc_reg_fields,
+       .num_reg_fields         =       ARRAY_SIZE(omap3_dispc_reg_fields),
        .overlay_caps           =       omap3430_dispc_overlay_caps,
        .supported_color_modes  =       omap3_dispc_supported_color_modes,
        .num_mgrs               =       2,
        .calc_scaling           =       dispc_ovl_calc_scaling_34xx,
        .calc_core_clk          =       calc_core_clk_34xx,
        .num_fifos              =       3,
+       .reg_fields             =       omap3_dispc_reg_fields,
+       .num_reg_fields         =       ARRAY_SIZE(omap3_dispc_reg_fields),
        .overlay_caps           =       omap3630_dispc_overlay_caps,
        .supported_color_modes  =       omap3_dispc_supported_color_modes,
        .num_mgrs               =       2,
        .calc_scaling           =       dispc_ovl_calc_scaling_34xx,
        .calc_core_clk          =       calc_core_clk_34xx,
        .num_fifos              =       3,
+       .reg_fields             =       omap3_dispc_reg_fields,
+       .num_reg_fields         =       ARRAY_SIZE(omap3_dispc_reg_fields),
        .overlay_caps           =       omap3430_dispc_overlay_caps,
        .supported_color_modes  =       omap3_dispc_supported_color_modes,
        .num_mgrs               =       1,
        .calc_scaling           =       dispc_ovl_calc_scaling_44xx,
        .calc_core_clk          =       calc_core_clk_44xx,
        .num_fifos              =       5,
+       .reg_fields             =       omap4_dispc_reg_fields,
+       .num_reg_fields         =       ARRAY_SIZE(omap4_dispc_reg_fields),
        .overlay_caps           =       omap4_dispc_overlay_caps,
        .supported_color_modes  =       omap4_dispc_supported_color_modes,
        .num_mgrs               =       3,
        .calc_scaling           =       dispc_ovl_calc_scaling_44xx,
        .calc_core_clk          =       calc_core_clk_44xx,
        .num_fifos              =       5,
+       .reg_fields             =       omap4_dispc_reg_fields,
+       .num_reg_fields         =       ARRAY_SIZE(omap4_dispc_reg_fields),
        .overlay_caps           =       omap4_dispc_overlay_caps,
        .supported_color_modes  =       omap4_dispc_supported_color_modes,
        .num_mgrs               =       4,
 
 };
 
 struct omap_dss_features {
-       const struct dss_reg_field *reg_fields;
-       const int num_reg_fields;
-
        const enum dss_feat_id *features;
        const int num_features;
 
 /* This struct is assigned to one of the below during initialization */
 static const struct omap_dss_features *omap_current_dss_features;
 
-static const struct dss_reg_field omap2_dss_reg_fields[] = {
-       [FEAT_REG_FIRHINC]                      = { 11, 0 },
-       [FEAT_REG_FIRVINC]                      = { 27, 16 },
-       [FEAT_REG_FIFOLOWTHRESHOLD]             = { 8, 0 },
-       [FEAT_REG_FIFOHIGHTHRESHOLD]            = { 24, 16 },
-       [FEAT_REG_FIFOSIZE]                     = { 8, 0 },
-       [FEAT_REG_HORIZONTALACCU]               = { 9, 0 },
-       [FEAT_REG_VERTICALACCU]                 = { 25, 16 },
-};
-
-static const struct dss_reg_field omap3_dss_reg_fields[] = {
-       [FEAT_REG_FIRHINC]                      = { 12, 0 },
-       [FEAT_REG_FIRVINC]                      = { 28, 16 },
-       [FEAT_REG_FIFOLOWTHRESHOLD]             = { 11, 0 },
-       [FEAT_REG_FIFOHIGHTHRESHOLD]            = { 27, 16 },
-       [FEAT_REG_FIFOSIZE]                     = { 10, 0 },
-       [FEAT_REG_HORIZONTALACCU]               = { 9, 0 },
-       [FEAT_REG_VERTICALACCU]                 = { 25, 16 },
-};
-
-static const struct dss_reg_field am43xx_dss_reg_fields[] = {
-       [FEAT_REG_FIRHINC]                      = { 12, 0 },
-       [FEAT_REG_FIRVINC]                      = { 28, 16 },
-       [FEAT_REG_FIFOLOWTHRESHOLD]     = { 11, 0 },
-       [FEAT_REG_FIFOHIGHTHRESHOLD]            = { 27, 16 },
-       [FEAT_REG_FIFOSIZE]             = { 10, 0 },
-       [FEAT_REG_HORIZONTALACCU]               = { 9, 0 },
-       [FEAT_REG_VERTICALACCU]                 = { 25, 16 },
-};
-
-static const struct dss_reg_field omap4_dss_reg_fields[] = {
-       [FEAT_REG_FIRHINC]                      = { 12, 0 },
-       [FEAT_REG_FIRVINC]                      = { 28, 16 },
-       [FEAT_REG_FIFOLOWTHRESHOLD]             = { 15, 0 },
-       [FEAT_REG_FIFOHIGHTHRESHOLD]            = { 31, 16 },
-       [FEAT_REG_FIFOSIZE]                     = { 15, 0 },
-       [FEAT_REG_HORIZONTALACCU]               = { 10, 0 },
-       [FEAT_REG_VERTICALACCU]                 = { 26, 16 },
-};
-
-static const struct dss_reg_field omap5_dss_reg_fields[] = {
-       [FEAT_REG_FIRHINC]                      = { 12, 0 },
-       [FEAT_REG_FIRVINC]                      = { 28, 16 },
-       [FEAT_REG_FIFOLOWTHRESHOLD]             = { 15, 0 },
-       [FEAT_REG_FIFOHIGHTHRESHOLD]            = { 31, 16 },
-       [FEAT_REG_FIFOSIZE]                     = { 15, 0 },
-       [FEAT_REG_HORIZONTALACCU]               = { 10, 0 },
-       [FEAT_REG_VERTICALACCU]                 = { 26, 16 },
-};
-
 static const enum omap_dss_output_id omap2_dss_supported_outputs[] = {
        /* OMAP_DSS_CHANNEL_LCD */
        OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI,
 
 /* OMAP2 DSS Features */
 static const struct omap_dss_features omap2_dss_features = {
-       .reg_fields = omap2_dss_reg_fields,
-       .num_reg_fields = ARRAY_SIZE(omap2_dss_reg_fields),
-
        .features = omap2_dss_feat_list,
        .num_features = ARRAY_SIZE(omap2_dss_feat_list),
 
 
 /* OMAP3 DSS Features */
 static const struct omap_dss_features omap3430_dss_features = {
-       .reg_fields = omap3_dss_reg_fields,
-       .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
-
        .features = omap3430_dss_feat_list,
        .num_features = ARRAY_SIZE(omap3430_dss_feat_list),
 
  * vdds_dsi regulator.
  */
 static const struct omap_dss_features am35xx_dss_features = {
-       .reg_fields = omap3_dss_reg_fields,
-       .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
-
        .features = am35xx_dss_feat_list,
        .num_features = ARRAY_SIZE(am35xx_dss_feat_list),
 
 };
 
 static const struct omap_dss_features am43xx_dss_features = {
-       .reg_fields = am43xx_dss_reg_fields,
-       .num_reg_fields = ARRAY_SIZE(am43xx_dss_reg_fields),
-
        .features = am43xx_dss_feat_list,
        .num_features = ARRAY_SIZE(am43xx_dss_feat_list),
 
 };
 
 static const struct omap_dss_features omap3630_dss_features = {
-       .reg_fields = omap3_dss_reg_fields,
-       .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
-
        .features = omap3630_dss_feat_list,
        .num_features = ARRAY_SIZE(omap3630_dss_feat_list),
 
 /* OMAP4 DSS Features */
 /* For OMAP4430 ES 1.0 revision */
 static const struct omap_dss_features omap4430_es1_0_dss_features  = {
-       .reg_fields = omap4_dss_reg_fields,
-       .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),
-
        .features = omap4430_es1_0_dss_feat_list,
        .num_features = ARRAY_SIZE(omap4430_es1_0_dss_feat_list),
 
 
 /* For OMAP4430 ES 2.0, 2.1 and 2.2 revisions */
 static const struct omap_dss_features omap4430_es2_0_1_2_dss_features = {
-       .reg_fields = omap4_dss_reg_fields,
-       .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),
-
        .features = omap4430_es2_0_1_2_dss_feat_list,
        .num_features = ARRAY_SIZE(omap4430_es2_0_1_2_dss_feat_list),
 
 
 /* For all the other OMAP4 versions */
 static const struct omap_dss_features omap4_dss_features = {
-       .reg_fields = omap4_dss_reg_fields,
-       .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),
-
        .features = omap4_dss_feat_list,
        .num_features = ARRAY_SIZE(omap4_dss_feat_list),
 
 
 /* OMAP5 DSS Features */
 static const struct omap_dss_features omap5_dss_features = {
-       .reg_fields = omap5_dss_reg_fields,
-       .num_reg_fields = ARRAY_SIZE(omap5_dss_reg_fields),
-
        .features = omap5_dss_feat_list,
        .num_features = ARRAY_SIZE(omap5_dss_feat_list),
 
        return false;
 }
 
-void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8 *end)
-{
-       if (id >= omap_current_dss_features->num_reg_fields)
-               BUG();
-
-       *start = omap_current_dss_features->reg_fields[id].start;
-       *end = omap_current_dss_features->reg_fields[id].end;
-}
-
 void dss_features_init(enum omapdss_version version)
 {
        switch (version) {