Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * linux/drivers/video/omap2/dss/dss_features.c
0004  *
0005  * Copyright (C) 2010 Texas Instruments
0006  * Author: Archit Taneja <archit@ti.com>
0007  */
0008 
0009 #include <linux/kernel.h>
0010 #include <linux/module.h>
0011 #include <linux/types.h>
0012 #include <linux/err.h>
0013 #include <linux/slab.h>
0014 
0015 #include <video/omapfb_dss.h>
0016 
0017 #include "dss.h"
0018 #include "dss_features.h"
0019 
0020 /* Defines a generic omap register field */
0021 struct dss_reg_field {
0022     u8 start, end;
0023 };
0024 
0025 struct dss_param_range {
0026     int min, max;
0027 };
0028 
0029 struct omap_dss_features {
0030     const struct dss_reg_field *reg_fields;
0031     const int num_reg_fields;
0032 
0033     const enum dss_feat_id *features;
0034     const int num_features;
0035 
0036     const int num_mgrs;
0037     const int num_ovls;
0038     const enum omap_display_type *supported_displays;
0039     const enum omap_dss_output_id *supported_outputs;
0040     const enum omap_color_mode *supported_color_modes;
0041     const enum omap_overlay_caps *overlay_caps;
0042     const char * const *clksrc_names;
0043     const struct dss_param_range *dss_params;
0044 
0045     const enum omap_dss_rotation_type supported_rotation_types;
0046 
0047     const u32 buffer_size_unit;
0048     const u32 burst_size_unit;
0049 };
0050 
0051 /* This struct is assigned to one of the below during initialization */
0052 static const struct omap_dss_features *omap_current_dss_features;
0053 
0054 static const struct dss_reg_field omap2_dss_reg_fields[] = {
0055     [FEAT_REG_FIRHINC]          = { 11, 0 },
0056     [FEAT_REG_FIRVINC]          = { 27, 16 },
0057     [FEAT_REG_FIFOLOWTHRESHOLD]     = { 8, 0 },
0058     [FEAT_REG_FIFOHIGHTHRESHOLD]        = { 24, 16 },
0059     [FEAT_REG_FIFOSIZE]         = { 8, 0 },
0060     [FEAT_REG_HORIZONTALACCU]       = { 9, 0 },
0061     [FEAT_REG_VERTICALACCU]         = { 25, 16 },
0062     [FEAT_REG_DISPC_CLK_SWITCH]     = { 0, 0 },
0063 };
0064 
0065 static const struct dss_reg_field omap3_dss_reg_fields[] = {
0066     [FEAT_REG_FIRHINC]          = { 12, 0 },
0067     [FEAT_REG_FIRVINC]          = { 28, 16 },
0068     [FEAT_REG_FIFOLOWTHRESHOLD]     = { 11, 0 },
0069     [FEAT_REG_FIFOHIGHTHRESHOLD]        = { 27, 16 },
0070     [FEAT_REG_FIFOSIZE]         = { 10, 0 },
0071     [FEAT_REG_HORIZONTALACCU]       = { 9, 0 },
0072     [FEAT_REG_VERTICALACCU]         = { 25, 16 },
0073     [FEAT_REG_DISPC_CLK_SWITCH]     = { 0, 0 },
0074 };
0075 
0076 static const struct dss_reg_field am43xx_dss_reg_fields[] = {
0077     [FEAT_REG_FIRHINC]          = { 12, 0 },
0078     [FEAT_REG_FIRVINC]          = { 28, 16 },
0079     [FEAT_REG_FIFOLOWTHRESHOLD] = { 11, 0 },
0080     [FEAT_REG_FIFOHIGHTHRESHOLD]        = { 27, 16 },
0081     [FEAT_REG_FIFOSIZE]     = { 10, 0 },
0082     [FEAT_REG_HORIZONTALACCU]       = { 9, 0 },
0083     [FEAT_REG_VERTICALACCU]         = { 25, 16 },
0084     [FEAT_REG_DISPC_CLK_SWITCH]     = { 0, 0 },
0085 };
0086 
0087 static const struct dss_reg_field omap4_dss_reg_fields[] = {
0088     [FEAT_REG_FIRHINC]          = { 12, 0 },
0089     [FEAT_REG_FIRVINC]          = { 28, 16 },
0090     [FEAT_REG_FIFOLOWTHRESHOLD]     = { 15, 0 },
0091     [FEAT_REG_FIFOHIGHTHRESHOLD]        = { 31, 16 },
0092     [FEAT_REG_FIFOSIZE]         = { 15, 0 },
0093     [FEAT_REG_HORIZONTALACCU]       = { 10, 0 },
0094     [FEAT_REG_VERTICALACCU]         = { 26, 16 },
0095     [FEAT_REG_DISPC_CLK_SWITCH]     = { 9, 8 },
0096 };
0097 
0098 static const struct dss_reg_field omap5_dss_reg_fields[] = {
0099     [FEAT_REG_FIRHINC]          = { 12, 0 },
0100     [FEAT_REG_FIRVINC]          = { 28, 16 },
0101     [FEAT_REG_FIFOLOWTHRESHOLD]     = { 15, 0 },
0102     [FEAT_REG_FIFOHIGHTHRESHOLD]        = { 31, 16 },
0103     [FEAT_REG_FIFOSIZE]         = { 15, 0 },
0104     [FEAT_REG_HORIZONTALACCU]       = { 10, 0 },
0105     [FEAT_REG_VERTICALACCU]         = { 26, 16 },
0106     [FEAT_REG_DISPC_CLK_SWITCH]     = { 9, 7 },
0107 };
0108 
0109 static const enum omap_display_type omap2_dss_supported_displays[] = {
0110     /* OMAP_DSS_CHANNEL_LCD */
0111     OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI,
0112 
0113     /* OMAP_DSS_CHANNEL_DIGIT */
0114     OMAP_DISPLAY_TYPE_VENC,
0115 };
0116 
0117 static const enum omap_display_type omap3430_dss_supported_displays[] = {
0118     /* OMAP_DSS_CHANNEL_LCD */
0119     OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
0120     OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI,
0121 
0122     /* OMAP_DSS_CHANNEL_DIGIT */
0123     OMAP_DISPLAY_TYPE_VENC,
0124 };
0125 
0126 static const enum omap_display_type omap3630_dss_supported_displays[] = {
0127     /* OMAP_DSS_CHANNEL_LCD */
0128     OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
0129     OMAP_DISPLAY_TYPE_DSI,
0130 
0131     /* OMAP_DSS_CHANNEL_DIGIT */
0132     OMAP_DISPLAY_TYPE_VENC,
0133 };
0134 
0135 static const enum omap_display_type am43xx_dss_supported_displays[] = {
0136     /* OMAP_DSS_CHANNEL_LCD */
0137     OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI,
0138 };
0139 
0140 static const enum omap_display_type omap4_dss_supported_displays[] = {
0141     /* OMAP_DSS_CHANNEL_LCD */
0142     OMAP_DISPLAY_TYPE_DBI | OMAP_DISPLAY_TYPE_DSI,
0143 
0144     /* OMAP_DSS_CHANNEL_DIGIT */
0145     OMAP_DISPLAY_TYPE_VENC | OMAP_DISPLAY_TYPE_HDMI,
0146 
0147     /* OMAP_DSS_CHANNEL_LCD2 */
0148     OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
0149     OMAP_DISPLAY_TYPE_DSI,
0150 };
0151 
0152 static const enum omap_display_type omap5_dss_supported_displays[] = {
0153     /* OMAP_DSS_CHANNEL_LCD */
0154     OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
0155     OMAP_DISPLAY_TYPE_DSI,
0156 
0157     /* OMAP_DSS_CHANNEL_DIGIT */
0158     OMAP_DISPLAY_TYPE_HDMI | OMAP_DISPLAY_TYPE_DPI,
0159 
0160     /* OMAP_DSS_CHANNEL_LCD2 */
0161     OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
0162     OMAP_DISPLAY_TYPE_DSI,
0163 };
0164 
0165 static const enum omap_dss_output_id omap2_dss_supported_outputs[] = {
0166     /* OMAP_DSS_CHANNEL_LCD */
0167     OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI,
0168 
0169     /* OMAP_DSS_CHANNEL_DIGIT */
0170     OMAP_DSS_OUTPUT_VENC,
0171 };
0172 
0173 static const enum omap_dss_output_id omap3430_dss_supported_outputs[] = {
0174     /* OMAP_DSS_CHANNEL_LCD */
0175     OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |
0176     OMAP_DSS_OUTPUT_SDI | OMAP_DSS_OUTPUT_DSI1,
0177 
0178     /* OMAP_DSS_CHANNEL_DIGIT */
0179     OMAP_DSS_OUTPUT_VENC,
0180 };
0181 
0182 static const enum omap_dss_output_id omap3630_dss_supported_outputs[] = {
0183     /* OMAP_DSS_CHANNEL_LCD */
0184     OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |
0185     OMAP_DSS_OUTPUT_DSI1,
0186 
0187     /* OMAP_DSS_CHANNEL_DIGIT */
0188     OMAP_DSS_OUTPUT_VENC,
0189 };
0190 
0191 static const enum omap_dss_output_id am43xx_dss_supported_outputs[] = {
0192     /* OMAP_DSS_CHANNEL_LCD */
0193     OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI,
0194 };
0195 
0196 static const enum omap_dss_output_id omap4_dss_supported_outputs[] = {
0197     /* OMAP_DSS_CHANNEL_LCD */
0198     OMAP_DSS_OUTPUT_DBI | OMAP_DSS_OUTPUT_DSI1,
0199 
0200     /* OMAP_DSS_CHANNEL_DIGIT */
0201     OMAP_DSS_OUTPUT_VENC | OMAP_DSS_OUTPUT_HDMI,
0202 
0203     /* OMAP_DSS_CHANNEL_LCD2 */
0204     OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |
0205     OMAP_DSS_OUTPUT_DSI2,
0206 };
0207 
0208 static const enum omap_dss_output_id omap5_dss_supported_outputs[] = {
0209     /* OMAP_DSS_CHANNEL_LCD */
0210     OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |
0211     OMAP_DSS_OUTPUT_DSI1 | OMAP_DSS_OUTPUT_DSI2,
0212 
0213     /* OMAP_DSS_CHANNEL_DIGIT */
0214     OMAP_DSS_OUTPUT_HDMI,
0215 
0216     /* OMAP_DSS_CHANNEL_LCD2 */
0217     OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |
0218     OMAP_DSS_OUTPUT_DSI1,
0219 
0220     /* OMAP_DSS_CHANNEL_LCD3 */
0221     OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |
0222     OMAP_DSS_OUTPUT_DSI2,
0223 };
0224 
0225 static const enum omap_color_mode omap2_dss_supported_color_modes[] = {
0226     /* OMAP_DSS_GFX */
0227     OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
0228     OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
0229     OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
0230     OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P,
0231 
0232     /* OMAP_DSS_VIDEO1 */
0233     OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
0234     OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
0235     OMAP_DSS_COLOR_UYVY,
0236 
0237     /* OMAP_DSS_VIDEO2 */
0238     OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
0239     OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
0240     OMAP_DSS_COLOR_UYVY,
0241 };
0242 
0243 static const enum omap_color_mode omap3_dss_supported_color_modes[] = {
0244     /* OMAP_DSS_GFX */
0245     OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
0246     OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
0247     OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
0248     OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
0249     OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 |
0250     OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
0251 
0252     /* OMAP_DSS_VIDEO1 */
0253     OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P |
0254     OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
0255     OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY,
0256 
0257     /* OMAP_DSS_VIDEO2 */
0258     OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
0259     OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
0260     OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
0261     OMAP_DSS_COLOR_UYVY | OMAP_DSS_COLOR_ARGB32 |
0262     OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
0263 };
0264 
0265 static const enum omap_color_mode omap4_dss_supported_color_modes[] = {
0266     /* OMAP_DSS_GFX */
0267     OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
0268     OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
0269     OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
0270     OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
0271     OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 |
0272     OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32 |
0273     OMAP_DSS_COLOR_ARGB16_1555 | OMAP_DSS_COLOR_RGBX16 |
0274     OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_XRGB16_1555,
0275 
0276     /* OMAP_DSS_VIDEO1 */
0277     OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |
0278     OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |
0279     OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |
0280     OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |
0281     OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |
0282     OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |
0283     OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |
0284     OMAP_DSS_COLOR_RGBX32,
0285 
0286        /* OMAP_DSS_VIDEO2 */
0287     OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |
0288     OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |
0289     OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |
0290     OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |
0291     OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |
0292     OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |
0293     OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |
0294     OMAP_DSS_COLOR_RGBX32,
0295 
0296     /* OMAP_DSS_VIDEO3 */
0297     OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |
0298     OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |
0299     OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |
0300     OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |
0301     OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |
0302     OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |
0303     OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |
0304     OMAP_DSS_COLOR_RGBX32,
0305 
0306     /* OMAP_DSS_WB */
0307     OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |
0308     OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |
0309     OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |
0310     OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |
0311     OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |
0312     OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |
0313     OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |
0314     OMAP_DSS_COLOR_RGBX32,
0315 };
0316 
0317 static const enum omap_overlay_caps omap2_dss_overlay_caps[] = {
0318     /* OMAP_DSS_GFX */
0319     OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
0320 
0321     /* OMAP_DSS_VIDEO1 */
0322     OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
0323         OMAP_DSS_OVL_CAP_REPLICATION,
0324 
0325     /* OMAP_DSS_VIDEO2 */
0326     OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
0327         OMAP_DSS_OVL_CAP_REPLICATION,
0328 };
0329 
0330 static const enum omap_overlay_caps omap3430_dss_overlay_caps[] = {
0331     /* OMAP_DSS_GFX */
0332     OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_POS |
0333         OMAP_DSS_OVL_CAP_REPLICATION,
0334 
0335     /* OMAP_DSS_VIDEO1 */
0336     OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
0337         OMAP_DSS_OVL_CAP_REPLICATION,
0338 
0339     /* OMAP_DSS_VIDEO2 */
0340     OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
0341         OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
0342 };
0343 
0344 static const enum omap_overlay_caps omap3630_dss_overlay_caps[] = {
0345     /* OMAP_DSS_GFX */
0346     OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA |
0347         OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
0348 
0349     /* OMAP_DSS_VIDEO1 */
0350     OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
0351         OMAP_DSS_OVL_CAP_REPLICATION,
0352 
0353     /* OMAP_DSS_VIDEO2 */
0354     OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
0355         OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_POS |
0356         OMAP_DSS_OVL_CAP_REPLICATION,
0357 };
0358 
0359 static const enum omap_overlay_caps omap4_dss_overlay_caps[] = {
0360     /* OMAP_DSS_GFX */
0361     OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA |
0362         OMAP_DSS_OVL_CAP_ZORDER | OMAP_DSS_OVL_CAP_POS |
0363         OMAP_DSS_OVL_CAP_REPLICATION,
0364 
0365     /* OMAP_DSS_VIDEO1 */
0366     OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
0367         OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER |
0368         OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
0369 
0370     /* OMAP_DSS_VIDEO2 */
0371     OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
0372         OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER |
0373         OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
0374 
0375     /* OMAP_DSS_VIDEO3 */
0376     OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
0377         OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER |
0378         OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
0379 };
0380 
0381 static const char * const omap2_dss_clk_source_names[] = {
0382     [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC]  = "N/A",
0383     [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI]    = "N/A",
0384     [OMAP_DSS_CLK_SRC_FCK]          = "DSS_FCLK1",
0385 };
0386 
0387 static const char * const omap3_dss_clk_source_names[] = {
0388     [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC]  = "DSI1_PLL_FCLK",
0389     [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI]    = "DSI2_PLL_FCLK",
0390     [OMAP_DSS_CLK_SRC_FCK]          = "DSS1_ALWON_FCLK",
0391 };
0392 
0393 static const char * const omap4_dss_clk_source_names[] = {
0394     [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC]  = "PLL1_CLK1",
0395     [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI]    = "PLL1_CLK2",
0396     [OMAP_DSS_CLK_SRC_FCK]          = "DSS_FCLK",
0397     [OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC] = "PLL2_CLK1",
0398     [OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI]   = "PLL2_CLK2",
0399 };
0400 
0401 static const char * const omap5_dss_clk_source_names[] = {
0402     [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC]  = "DPLL_DSI1_A_CLK1",
0403     [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI]    = "DPLL_DSI1_A_CLK2",
0404     [OMAP_DSS_CLK_SRC_FCK]          = "DSS_CLK",
0405     [OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC] = "DPLL_DSI1_C_CLK1",
0406     [OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI]   = "DPLL_DSI1_C_CLK2",
0407 };
0408 
0409 static const struct dss_param_range omap2_dss_param_range[] = {
0410     [FEAT_PARAM_DSS_FCK]            = { 0, 133000000 },
0411     [FEAT_PARAM_DSS_PCD]            = { 2, 255 },
0412     [FEAT_PARAM_DOWNSCALE]          = { 1, 2 },
0413     /*
0414      * Assuming the line width buffer to be 768 pixels as OMAP2 DISPC
0415      * scaler cannot scale a image with width more than 768.
0416      */
0417     [FEAT_PARAM_LINEWIDTH]          = { 1, 768 },
0418 };
0419 
0420 static const struct dss_param_range omap3_dss_param_range[] = {
0421     [FEAT_PARAM_DSS_FCK]            = { 0, 173000000 },
0422     [FEAT_PARAM_DSS_PCD]            = { 1, 255 },
0423     [FEAT_PARAM_DSIPLL_LPDIV]       = { 1, (1 << 13) - 1},
0424     [FEAT_PARAM_DSI_FCK]            = { 0, 173000000 },
0425     [FEAT_PARAM_DOWNSCALE]          = { 1, 4 },
0426     [FEAT_PARAM_LINEWIDTH]          = { 1, 1024 },
0427 };
0428 
0429 static const struct dss_param_range am43xx_dss_param_range[] = {
0430     [FEAT_PARAM_DSS_FCK]            = { 0, 200000000 },
0431     [FEAT_PARAM_DSS_PCD]            = { 1, 255 },
0432     [FEAT_PARAM_DOWNSCALE]          = { 1, 4 },
0433     [FEAT_PARAM_LINEWIDTH]          = { 1, 1024 },
0434 };
0435 
0436 static const struct dss_param_range omap4_dss_param_range[] = {
0437     [FEAT_PARAM_DSS_FCK]            = { 0, 186000000 },
0438     [FEAT_PARAM_DSS_PCD]            = { 1, 255 },
0439     [FEAT_PARAM_DSIPLL_LPDIV]       = { 0, (1 << 13) - 1 },
0440     [FEAT_PARAM_DSI_FCK]            = { 0, 170000000 },
0441     [FEAT_PARAM_DOWNSCALE]          = { 1, 4 },
0442     [FEAT_PARAM_LINEWIDTH]          = { 1, 2048 },
0443 };
0444 
0445 static const struct dss_param_range omap5_dss_param_range[] = {
0446     [FEAT_PARAM_DSS_FCK]            = { 0, 209250000 },
0447     [FEAT_PARAM_DSS_PCD]            = { 1, 255 },
0448     [FEAT_PARAM_DSIPLL_LPDIV]       = { 0, (1 << 13) - 1 },
0449     [FEAT_PARAM_DSI_FCK]            = { 0, 209250000 },
0450     [FEAT_PARAM_DOWNSCALE]          = { 1, 4 },
0451     [FEAT_PARAM_LINEWIDTH]          = { 1, 2048 },
0452 };
0453 
0454 static const enum dss_feat_id omap2_dss_feat_list[] = {
0455     FEAT_LCDENABLEPOL,
0456     FEAT_LCDENABLESIGNAL,
0457     FEAT_PCKFREEENABLE,
0458     FEAT_FUNCGATED,
0459     FEAT_ROWREPEATENABLE,
0460     FEAT_RESIZECONF,
0461 };
0462 
0463 static const enum dss_feat_id omap3430_dss_feat_list[] = {
0464     FEAT_LCDENABLEPOL,
0465     FEAT_LCDENABLESIGNAL,
0466     FEAT_PCKFREEENABLE,
0467     FEAT_FUNCGATED,
0468     FEAT_LINEBUFFERSPLIT,
0469     FEAT_ROWREPEATENABLE,
0470     FEAT_RESIZECONF,
0471     FEAT_DSI_REVERSE_TXCLKESC,
0472     FEAT_VENC_REQUIRES_TV_DAC_CLK,
0473     FEAT_CPR,
0474     FEAT_PRELOAD,
0475     FEAT_FIR_COEF_V,
0476     FEAT_ALPHA_FIXED_ZORDER,
0477     FEAT_FIFO_MERGE,
0478     FEAT_OMAP3_DSI_FIFO_BUG,
0479     FEAT_DPI_USES_VDDS_DSI,
0480 };
0481 
0482 static const enum dss_feat_id am35xx_dss_feat_list[] = {
0483     FEAT_LCDENABLEPOL,
0484     FEAT_LCDENABLESIGNAL,
0485     FEAT_PCKFREEENABLE,
0486     FEAT_FUNCGATED,
0487     FEAT_LINEBUFFERSPLIT,
0488     FEAT_ROWREPEATENABLE,
0489     FEAT_RESIZECONF,
0490     FEAT_DSI_REVERSE_TXCLKESC,
0491     FEAT_VENC_REQUIRES_TV_DAC_CLK,
0492     FEAT_CPR,
0493     FEAT_PRELOAD,
0494     FEAT_FIR_COEF_V,
0495     FEAT_ALPHA_FIXED_ZORDER,
0496     FEAT_FIFO_MERGE,
0497     FEAT_OMAP3_DSI_FIFO_BUG,
0498 };
0499 
0500 static const enum dss_feat_id am43xx_dss_feat_list[] = {
0501     FEAT_LCDENABLEPOL,
0502     FEAT_LCDENABLESIGNAL,
0503     FEAT_PCKFREEENABLE,
0504     FEAT_FUNCGATED,
0505     FEAT_LINEBUFFERSPLIT,
0506     FEAT_ROWREPEATENABLE,
0507     FEAT_RESIZECONF,
0508     FEAT_CPR,
0509     FEAT_PRELOAD,
0510     FEAT_FIR_COEF_V,
0511     FEAT_ALPHA_FIXED_ZORDER,
0512     FEAT_FIFO_MERGE,
0513 };
0514 
0515 static const enum dss_feat_id omap3630_dss_feat_list[] = {
0516     FEAT_LCDENABLEPOL,
0517     FEAT_LCDENABLESIGNAL,
0518     FEAT_PCKFREEENABLE,
0519     FEAT_FUNCGATED,
0520     FEAT_LINEBUFFERSPLIT,
0521     FEAT_ROWREPEATENABLE,
0522     FEAT_RESIZECONF,
0523     FEAT_DSI_PLL_PWR_BUG,
0524     FEAT_CPR,
0525     FEAT_PRELOAD,
0526     FEAT_FIR_COEF_V,
0527     FEAT_ALPHA_FIXED_ZORDER,
0528     FEAT_FIFO_MERGE,
0529     FEAT_OMAP3_DSI_FIFO_BUG,
0530     FEAT_DPI_USES_VDDS_DSI,
0531 };
0532 
0533 static const enum dss_feat_id omap4430_es1_0_dss_feat_list[] = {
0534     FEAT_MGR_LCD2,
0535     FEAT_CORE_CLK_DIV,
0536     FEAT_LCD_CLK_SRC,
0537     FEAT_DSI_DCS_CMD_CONFIG_VC,
0538     FEAT_DSI_VC_OCP_WIDTH,
0539     FEAT_DSI_GNQ,
0540     FEAT_HANDLE_UV_SEPARATE,
0541     FEAT_ATTR2,
0542     FEAT_CPR,
0543     FEAT_PRELOAD,
0544     FEAT_FIR_COEF_V,
0545     FEAT_ALPHA_FREE_ZORDER,
0546     FEAT_FIFO_MERGE,
0547     FEAT_BURST_2D,
0548 };
0549 
0550 static const enum dss_feat_id omap4430_es2_0_1_2_dss_feat_list[] = {
0551     FEAT_MGR_LCD2,
0552     FEAT_CORE_CLK_DIV,
0553     FEAT_LCD_CLK_SRC,
0554     FEAT_DSI_DCS_CMD_CONFIG_VC,
0555     FEAT_DSI_VC_OCP_WIDTH,
0556     FEAT_DSI_GNQ,
0557     FEAT_HDMI_CTS_SWMODE,
0558     FEAT_HANDLE_UV_SEPARATE,
0559     FEAT_ATTR2,
0560     FEAT_CPR,
0561     FEAT_PRELOAD,
0562     FEAT_FIR_COEF_V,
0563     FEAT_ALPHA_FREE_ZORDER,
0564     FEAT_FIFO_MERGE,
0565     FEAT_BURST_2D,
0566 };
0567 
0568 static const enum dss_feat_id omap4_dss_feat_list[] = {
0569     FEAT_MGR_LCD2,
0570     FEAT_CORE_CLK_DIV,
0571     FEAT_LCD_CLK_SRC,
0572     FEAT_DSI_DCS_CMD_CONFIG_VC,
0573     FEAT_DSI_VC_OCP_WIDTH,
0574     FEAT_DSI_GNQ,
0575     FEAT_HDMI_CTS_SWMODE,
0576     FEAT_HDMI_AUDIO_USE_MCLK,
0577     FEAT_HANDLE_UV_SEPARATE,
0578     FEAT_ATTR2,
0579     FEAT_CPR,
0580     FEAT_PRELOAD,
0581     FEAT_FIR_COEF_V,
0582     FEAT_ALPHA_FREE_ZORDER,
0583     FEAT_FIFO_MERGE,
0584     FEAT_BURST_2D,
0585 };
0586 
0587 static const enum dss_feat_id omap5_dss_feat_list[] = {
0588     FEAT_MGR_LCD2,
0589     FEAT_MGR_LCD3,
0590     FEAT_CORE_CLK_DIV,
0591     FEAT_LCD_CLK_SRC,
0592     FEAT_DSI_DCS_CMD_CONFIG_VC,
0593     FEAT_DSI_VC_OCP_WIDTH,
0594     FEAT_DSI_GNQ,
0595     FEAT_HDMI_CTS_SWMODE,
0596     FEAT_HDMI_AUDIO_USE_MCLK,
0597     FEAT_HANDLE_UV_SEPARATE,
0598     FEAT_ATTR2,
0599     FEAT_CPR,
0600     FEAT_PRELOAD,
0601     FEAT_FIR_COEF_V,
0602     FEAT_ALPHA_FREE_ZORDER,
0603     FEAT_FIFO_MERGE,
0604     FEAT_BURST_2D,
0605     FEAT_DSI_PHY_DCC,
0606     FEAT_MFLAG,
0607 };
0608 
0609 /* OMAP2 DSS Features */
0610 static const struct omap_dss_features omap2_dss_features = {
0611     .reg_fields = omap2_dss_reg_fields,
0612     .num_reg_fields = ARRAY_SIZE(omap2_dss_reg_fields),
0613 
0614     .features = omap2_dss_feat_list,
0615     .num_features = ARRAY_SIZE(omap2_dss_feat_list),
0616 
0617     .num_mgrs = 2,
0618     .num_ovls = 3,
0619     .supported_displays = omap2_dss_supported_displays,
0620     .supported_outputs = omap2_dss_supported_outputs,
0621     .supported_color_modes = omap2_dss_supported_color_modes,
0622     .overlay_caps = omap2_dss_overlay_caps,
0623     .clksrc_names = omap2_dss_clk_source_names,
0624     .dss_params = omap2_dss_param_range,
0625     .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_VRFB,
0626     .buffer_size_unit = 1,
0627     .burst_size_unit = 8,
0628 };
0629 
0630 /* OMAP3 DSS Features */
0631 static const struct omap_dss_features omap3430_dss_features = {
0632     .reg_fields = omap3_dss_reg_fields,
0633     .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
0634 
0635     .features = omap3430_dss_feat_list,
0636     .num_features = ARRAY_SIZE(omap3430_dss_feat_list),
0637 
0638     .num_mgrs = 2,
0639     .num_ovls = 3,
0640     .supported_displays = omap3430_dss_supported_displays,
0641     .supported_outputs = omap3430_dss_supported_outputs,
0642     .supported_color_modes = omap3_dss_supported_color_modes,
0643     .overlay_caps = omap3430_dss_overlay_caps,
0644     .clksrc_names = omap3_dss_clk_source_names,
0645     .dss_params = omap3_dss_param_range,
0646     .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_VRFB,
0647     .buffer_size_unit = 1,
0648     .burst_size_unit = 8,
0649 };
0650 
0651 /*
0652  * AM35xx DSS Features. This is basically OMAP3 DSS Features without the
0653  * vdds_dsi regulator.
0654  */
0655 static const struct omap_dss_features am35xx_dss_features = {
0656     .reg_fields = omap3_dss_reg_fields,
0657     .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
0658 
0659     .features = am35xx_dss_feat_list,
0660     .num_features = ARRAY_SIZE(am35xx_dss_feat_list),
0661 
0662     .num_mgrs = 2,
0663     .num_ovls = 3,
0664     .supported_displays = omap3430_dss_supported_displays,
0665     .supported_outputs = omap3430_dss_supported_outputs,
0666     .supported_color_modes = omap3_dss_supported_color_modes,
0667     .overlay_caps = omap3430_dss_overlay_caps,
0668     .clksrc_names = omap3_dss_clk_source_names,
0669     .dss_params = omap3_dss_param_range,
0670     .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_VRFB,
0671     .buffer_size_unit = 1,
0672     .burst_size_unit = 8,
0673 };
0674 
0675 static const struct omap_dss_features am43xx_dss_features = {
0676     .reg_fields = am43xx_dss_reg_fields,
0677     .num_reg_fields = ARRAY_SIZE(am43xx_dss_reg_fields),
0678 
0679     .features = am43xx_dss_feat_list,
0680     .num_features = ARRAY_SIZE(am43xx_dss_feat_list),
0681 
0682     .num_mgrs = 1,
0683     .num_ovls = 3,
0684     .supported_displays = am43xx_dss_supported_displays,
0685     .supported_outputs = am43xx_dss_supported_outputs,
0686     .supported_color_modes = omap3_dss_supported_color_modes,
0687     .overlay_caps = omap3430_dss_overlay_caps,
0688     .clksrc_names = omap2_dss_clk_source_names,
0689     .dss_params = am43xx_dss_param_range,
0690     .supported_rotation_types = OMAP_DSS_ROT_DMA,
0691     .buffer_size_unit = 1,
0692     .burst_size_unit = 8,
0693 };
0694 
0695 static const struct omap_dss_features omap3630_dss_features = {
0696     .reg_fields = omap3_dss_reg_fields,
0697     .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
0698 
0699     .features = omap3630_dss_feat_list,
0700     .num_features = ARRAY_SIZE(omap3630_dss_feat_list),
0701 
0702     .num_mgrs = 2,
0703     .num_ovls = 3,
0704     .supported_displays = omap3630_dss_supported_displays,
0705     .supported_outputs = omap3630_dss_supported_outputs,
0706     .supported_color_modes = omap3_dss_supported_color_modes,
0707     .overlay_caps = omap3630_dss_overlay_caps,
0708     .clksrc_names = omap3_dss_clk_source_names,
0709     .dss_params = omap3_dss_param_range,
0710     .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_VRFB,
0711     .buffer_size_unit = 1,
0712     .burst_size_unit = 8,
0713 };
0714 
0715 /* OMAP4 DSS Features */
0716 /* For OMAP4430 ES 1.0 revision */
0717 static const struct omap_dss_features omap4430_es1_0_dss_features  = {
0718     .reg_fields = omap4_dss_reg_fields,
0719     .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),
0720 
0721     .features = omap4430_es1_0_dss_feat_list,
0722     .num_features = ARRAY_SIZE(omap4430_es1_0_dss_feat_list),
0723 
0724     .num_mgrs = 3,
0725     .num_ovls = 4,
0726     .supported_displays = omap4_dss_supported_displays,
0727     .supported_outputs = omap4_dss_supported_outputs,
0728     .supported_color_modes = omap4_dss_supported_color_modes,
0729     .overlay_caps = omap4_dss_overlay_caps,
0730     .clksrc_names = omap4_dss_clk_source_names,
0731     .dss_params = omap4_dss_param_range,
0732     .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_TILER,
0733     .buffer_size_unit = 16,
0734     .burst_size_unit = 16,
0735 };
0736 
0737 /* For OMAP4430 ES 2.0, 2.1 and 2.2 revisions */
0738 static const struct omap_dss_features omap4430_es2_0_1_2_dss_features = {
0739     .reg_fields = omap4_dss_reg_fields,
0740     .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),
0741 
0742     .features = omap4430_es2_0_1_2_dss_feat_list,
0743     .num_features = ARRAY_SIZE(omap4430_es2_0_1_2_dss_feat_list),
0744 
0745     .num_mgrs = 3,
0746     .num_ovls = 4,
0747     .supported_displays = omap4_dss_supported_displays,
0748     .supported_outputs = omap4_dss_supported_outputs,
0749     .supported_color_modes = omap4_dss_supported_color_modes,
0750     .overlay_caps = omap4_dss_overlay_caps,
0751     .clksrc_names = omap4_dss_clk_source_names,
0752     .dss_params = omap4_dss_param_range,
0753     .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_TILER,
0754     .buffer_size_unit = 16,
0755     .burst_size_unit = 16,
0756 };
0757 
0758 /* For all the other OMAP4 versions */
0759 static const struct omap_dss_features omap4_dss_features = {
0760     .reg_fields = omap4_dss_reg_fields,
0761     .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),
0762 
0763     .features = omap4_dss_feat_list,
0764     .num_features = ARRAY_SIZE(omap4_dss_feat_list),
0765 
0766     .num_mgrs = 3,
0767     .num_ovls = 4,
0768     .supported_displays = omap4_dss_supported_displays,
0769     .supported_outputs = omap4_dss_supported_outputs,
0770     .supported_color_modes = omap4_dss_supported_color_modes,
0771     .overlay_caps = omap4_dss_overlay_caps,
0772     .clksrc_names = omap4_dss_clk_source_names,
0773     .dss_params = omap4_dss_param_range,
0774     .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_TILER,
0775     .buffer_size_unit = 16,
0776     .burst_size_unit = 16,
0777 };
0778 
0779 /* OMAP5 DSS Features */
0780 static const struct omap_dss_features omap5_dss_features = {
0781     .reg_fields = omap5_dss_reg_fields,
0782     .num_reg_fields = ARRAY_SIZE(omap5_dss_reg_fields),
0783 
0784     .features = omap5_dss_feat_list,
0785     .num_features = ARRAY_SIZE(omap5_dss_feat_list),
0786 
0787     .num_mgrs = 4,
0788     .num_ovls = 4,
0789     .supported_displays = omap5_dss_supported_displays,
0790     .supported_outputs = omap5_dss_supported_outputs,
0791     .supported_color_modes = omap4_dss_supported_color_modes,
0792     .overlay_caps = omap4_dss_overlay_caps,
0793     .clksrc_names = omap5_dss_clk_source_names,
0794     .dss_params = omap5_dss_param_range,
0795     .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_TILER,
0796     .buffer_size_unit = 16,
0797     .burst_size_unit = 16,
0798 };
0799 
0800 /* Functions returning values related to a DSS feature */
0801 int dss_feat_get_num_mgrs(void)
0802 {
0803     return omap_current_dss_features->num_mgrs;
0804 }
0805 EXPORT_SYMBOL(dss_feat_get_num_mgrs);
0806 
0807 int dss_feat_get_num_ovls(void)
0808 {
0809     return omap_current_dss_features->num_ovls;
0810 }
0811 EXPORT_SYMBOL(dss_feat_get_num_ovls);
0812 
0813 unsigned long dss_feat_get_param_min(enum dss_range_param param)
0814 {
0815     return omap_current_dss_features->dss_params[param].min;
0816 }
0817 
0818 unsigned long dss_feat_get_param_max(enum dss_range_param param)
0819 {
0820     return omap_current_dss_features->dss_params[param].max;
0821 }
0822 
0823 enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel)
0824 {
0825     return omap_current_dss_features->supported_displays[channel];
0826 }
0827 
0828 enum omap_dss_output_id dss_feat_get_supported_outputs(enum omap_channel channel)
0829 {
0830     return omap_current_dss_features->supported_outputs[channel];
0831 }
0832 
0833 enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane)
0834 {
0835     return omap_current_dss_features->supported_color_modes[plane];
0836 }
0837 EXPORT_SYMBOL(dss_feat_get_supported_color_modes);
0838 
0839 enum omap_overlay_caps dss_feat_get_overlay_caps(enum omap_plane plane)
0840 {
0841     return omap_current_dss_features->overlay_caps[plane];
0842 }
0843 
0844 bool dss_feat_color_mode_supported(enum omap_plane plane,
0845         enum omap_color_mode color_mode)
0846 {
0847     return omap_current_dss_features->supported_color_modes[plane] &
0848             color_mode;
0849 }
0850 
0851 const char *dss_feat_get_clk_source_name(enum omap_dss_clk_source id)
0852 {
0853     return omap_current_dss_features->clksrc_names[id];
0854 }
0855 
0856 u32 dss_feat_get_buffer_size_unit(void)
0857 {
0858     return omap_current_dss_features->buffer_size_unit;
0859 }
0860 
0861 u32 dss_feat_get_burst_size_unit(void)
0862 {
0863     return omap_current_dss_features->burst_size_unit;
0864 }
0865 
0866 /* DSS has_feature check */
0867 bool dss_has_feature(enum dss_feat_id id)
0868 {
0869     int i;
0870     const enum dss_feat_id *features = omap_current_dss_features->features;
0871     const int num_features = omap_current_dss_features->num_features;
0872 
0873     for (i = 0; i < num_features; i++) {
0874         if (features[i] == id)
0875             return true;
0876     }
0877 
0878     return false;
0879 }
0880 
0881 void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8 *end)
0882 {
0883     BUG_ON(id >= omap_current_dss_features->num_reg_fields);
0884 
0885     *start = omap_current_dss_features->reg_fields[id].start;
0886     *end = omap_current_dss_features->reg_fields[id].end;
0887 }
0888 
0889 bool dss_feat_rotation_type_supported(enum omap_dss_rotation_type rot_type)
0890 {
0891     return omap_current_dss_features->supported_rotation_types & rot_type;
0892 }
0893 
0894 void dss_features_init(enum omapdss_version version)
0895 {
0896     switch (version) {
0897     case OMAPDSS_VER_OMAP24xx:
0898         omap_current_dss_features = &omap2_dss_features;
0899         break;
0900 
0901     case OMAPDSS_VER_OMAP34xx_ES1:
0902     case OMAPDSS_VER_OMAP34xx_ES3:
0903         omap_current_dss_features = &omap3430_dss_features;
0904         break;
0905 
0906     case OMAPDSS_VER_OMAP3630:
0907         omap_current_dss_features = &omap3630_dss_features;
0908         break;
0909 
0910     case OMAPDSS_VER_OMAP4430_ES1:
0911         omap_current_dss_features = &omap4430_es1_0_dss_features;
0912         break;
0913 
0914     case OMAPDSS_VER_OMAP4430_ES2:
0915         omap_current_dss_features = &omap4430_es2_0_1_2_dss_features;
0916         break;
0917 
0918     case OMAPDSS_VER_OMAP4:
0919         omap_current_dss_features = &omap4_dss_features;
0920         break;
0921 
0922     case OMAPDSS_VER_OMAP5:
0923     case OMAPDSS_VER_DRA7xx:
0924         omap_current_dss_features = &omap5_dss_features;
0925         break;
0926 
0927     case OMAPDSS_VER_AM35xx:
0928         omap_current_dss_features = &am35xx_dss_features;
0929         break;
0930 
0931     case OMAPDSS_VER_AM43xx:
0932         omap_current_dss_features = &am43xx_dss_features;
0933         break;
0934 
0935     default:
0936         DSSWARN("Unsupported OMAP version");
0937         break;
0938     }
0939 }