0001
0002
0003
0004
0005
0006
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
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
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
0111 OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI,
0112
0113
0114 OMAP_DISPLAY_TYPE_VENC,
0115 };
0116
0117 static const enum omap_display_type omap3430_dss_supported_displays[] = {
0118
0119 OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
0120 OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI,
0121
0122
0123 OMAP_DISPLAY_TYPE_VENC,
0124 };
0125
0126 static const enum omap_display_type omap3630_dss_supported_displays[] = {
0127
0128 OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
0129 OMAP_DISPLAY_TYPE_DSI,
0130
0131
0132 OMAP_DISPLAY_TYPE_VENC,
0133 };
0134
0135 static const enum omap_display_type am43xx_dss_supported_displays[] = {
0136
0137 OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI,
0138 };
0139
0140 static const enum omap_display_type omap4_dss_supported_displays[] = {
0141
0142 OMAP_DISPLAY_TYPE_DBI | OMAP_DISPLAY_TYPE_DSI,
0143
0144
0145 OMAP_DISPLAY_TYPE_VENC | OMAP_DISPLAY_TYPE_HDMI,
0146
0147
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
0154 OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
0155 OMAP_DISPLAY_TYPE_DSI,
0156
0157
0158 OMAP_DISPLAY_TYPE_HDMI | OMAP_DISPLAY_TYPE_DPI,
0159
0160
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
0167 OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI,
0168
0169
0170 OMAP_DSS_OUTPUT_VENC,
0171 };
0172
0173 static const enum omap_dss_output_id omap3430_dss_supported_outputs[] = {
0174
0175 OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |
0176 OMAP_DSS_OUTPUT_SDI | OMAP_DSS_OUTPUT_DSI1,
0177
0178
0179 OMAP_DSS_OUTPUT_VENC,
0180 };
0181
0182 static const enum omap_dss_output_id omap3630_dss_supported_outputs[] = {
0183
0184 OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |
0185 OMAP_DSS_OUTPUT_DSI1,
0186
0187
0188 OMAP_DSS_OUTPUT_VENC,
0189 };
0190
0191 static const enum omap_dss_output_id am43xx_dss_supported_outputs[] = {
0192
0193 OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI,
0194 };
0195
0196 static const enum omap_dss_output_id omap4_dss_supported_outputs[] = {
0197
0198 OMAP_DSS_OUTPUT_DBI | OMAP_DSS_OUTPUT_DSI1,
0199
0200
0201 OMAP_DSS_OUTPUT_VENC | OMAP_DSS_OUTPUT_HDMI,
0202
0203
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
0210 OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |
0211 OMAP_DSS_OUTPUT_DSI1 | OMAP_DSS_OUTPUT_DSI2,
0212
0213
0214 OMAP_DSS_OUTPUT_HDMI,
0215
0216
0217 OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |
0218 OMAP_DSS_OUTPUT_DSI1,
0219
0220
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
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
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
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
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
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
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
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
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
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
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
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
0319 OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
0320
0321
0322 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
0323 OMAP_DSS_OVL_CAP_REPLICATION,
0324
0325
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
0332 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_POS |
0333 OMAP_DSS_OVL_CAP_REPLICATION,
0334
0335
0336 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
0337 OMAP_DSS_OVL_CAP_REPLICATION,
0338
0339
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
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
0350 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
0351 OMAP_DSS_OVL_CAP_REPLICATION,
0352
0353
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
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
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
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
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
0415
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
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
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
0653
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
0716
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
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
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
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
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
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 }