aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/video/omap2/dss/dispc.c20
-rw-r--r--drivers/video/omap2/dss/dss_features.c38
-rw-r--r--include/video/omapdss.h2
3 files changed, 42 insertions, 18 deletions
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
index 334842a3b52..3e1007810f8 100644
--- a/drivers/video/omap2/dss/dispc.c
+++ b/drivers/video/omap2/dss/dispc.c
@@ -698,9 +698,15 @@ static void dispc_ovl_set_ba1_uv(enum omap_plane plane, u32 paddr)
698 dispc_write_reg(DISPC_OVL_BA1_UV(plane), paddr); 698 dispc_write_reg(DISPC_OVL_BA1_UV(plane), paddr);
699} 699}
700 700
701static void dispc_ovl_set_pos(enum omap_plane plane, int x, int y) 701static void dispc_ovl_set_pos(enum omap_plane plane,
702 enum omap_overlay_caps caps, int x, int y)
702{ 703{
703 u32 val = FLD_VAL(y, 26, 16) | FLD_VAL(x, 10, 0); 704 u32 val;
705
706 if ((caps & OMAP_DSS_OVL_CAP_POS) == 0)
707 return;
708
709 val = FLD_VAL(y, 26, 16) | FLD_VAL(x, 10, 0);
704 710
705 dispc_write_reg(DISPC_OVL_POSITION(plane), val); 711 dispc_write_reg(DISPC_OVL_POSITION(plane), val);
706} 712}
@@ -1051,11 +1057,15 @@ static void dispc_ovl_set_vid_color_conv(enum omap_plane plane, bool enable)
1051 dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), val); 1057 dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), val);
1052} 1058}
1053 1059
1054static void dispc_ovl_enable_replication(enum omap_plane plane, bool enable) 1060static void dispc_ovl_enable_replication(enum omap_plane plane,
1061 enum omap_overlay_caps caps, bool enable)
1055{ 1062{
1056 static const unsigned shifts[] = { 5, 10, 10, 10 }; 1063 static const unsigned shifts[] = { 5, 10, 10, 10 };
1057 int shift; 1064 int shift;
1058 1065
1066 if ((caps & OMAP_DSS_OVL_CAP_REPLICATION) == 0)
1067 return;
1068
1059 shift = shifts[plane]; 1069 shift = shifts[plane];
1060 REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable, shift, shift); 1070 REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable, shift, shift);
1061} 1071}
@@ -2385,7 +2395,7 @@ int dispc_ovl_setup(enum omap_plane plane, const struct omap_overlay_info *oi,
2385 DSSDBG("%d,%d %dx%d -> %dx%d\n", oi->pos_x, oi->pos_y, in_width, 2395 DSSDBG("%d,%d %dx%d -> %dx%d\n", oi->pos_x, oi->pos_y, in_width,
2386 in_height, out_width, out_height); 2396 in_height, out_width, out_height);
2387 2397
2388 dispc_ovl_set_pos(plane, oi->pos_x, pos_y); 2398 dispc_ovl_set_pos(plane, caps, oi->pos_x, pos_y);
2389 2399
2390 dispc_ovl_set_input_size(plane, in_width, in_height); 2400 dispc_ovl_set_input_size(plane, in_width, in_height);
2391 2401
@@ -2405,7 +2415,7 @@ int dispc_ovl_setup(enum omap_plane plane, const struct omap_overlay_info *oi,
2405 dispc_ovl_set_pre_mult_alpha(plane, caps, oi->pre_mult_alpha); 2415 dispc_ovl_set_pre_mult_alpha(plane, caps, oi->pre_mult_alpha);
2406 dispc_ovl_setup_global_alpha(plane, caps, oi->global_alpha); 2416 dispc_ovl_setup_global_alpha(plane, caps, oi->global_alpha);
2407 2417
2408 dispc_ovl_enable_replication(plane, replication); 2418 dispc_ovl_enable_replication(plane, caps, replication);
2409 2419
2410 return 0; 2420 return 0;
2411} 2421}
diff --git a/drivers/video/omap2/dss/dss_features.c b/drivers/video/omap2/dss/dss_features.c
index bfe7fc7b859..5a5c25b134b 100644
--- a/drivers/video/omap2/dss/dss_features.c
+++ b/drivers/video/omap2/dss/dss_features.c
@@ -314,54 +314,66 @@ static const enum omap_color_mode omap4_dss_supported_color_modes[] = {
314 314
315static const enum omap_overlay_caps omap2_dss_overlay_caps[] = { 315static const enum omap_overlay_caps omap2_dss_overlay_caps[] = {
316 /* OMAP_DSS_GFX */ 316 /* OMAP_DSS_GFX */
317 0, 317 OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
318 318
319 /* OMAP_DSS_VIDEO1 */ 319 /* OMAP_DSS_VIDEO1 */
320 OMAP_DSS_OVL_CAP_SCALE, 320 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
321 OMAP_DSS_OVL_CAP_REPLICATION,
321 322
322 /* OMAP_DSS_VIDEO2 */ 323 /* OMAP_DSS_VIDEO2 */
323 OMAP_DSS_OVL_CAP_SCALE, 324 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
325 OMAP_DSS_OVL_CAP_REPLICATION,
324}; 326};
325 327
326static const enum omap_overlay_caps omap3430_dss_overlay_caps[] = { 328static const enum omap_overlay_caps omap3430_dss_overlay_caps[] = {
327 /* OMAP_DSS_GFX */ 329 /* OMAP_DSS_GFX */
328 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA, 330 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_POS |
331 OMAP_DSS_OVL_CAP_REPLICATION,
329 332
330 /* OMAP_DSS_VIDEO1 */ 333 /* OMAP_DSS_VIDEO1 */
331 OMAP_DSS_OVL_CAP_SCALE, 334 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
335 OMAP_DSS_OVL_CAP_REPLICATION,
332 336
333 /* OMAP_DSS_VIDEO2 */ 337 /* OMAP_DSS_VIDEO2 */
334 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA, 338 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
339 OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
335}; 340};
336 341
337static const enum omap_overlay_caps omap3630_dss_overlay_caps[] = { 342static const enum omap_overlay_caps omap3630_dss_overlay_caps[] = {
338 /* OMAP_DSS_GFX */ 343 /* OMAP_DSS_GFX */
339 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA, 344 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA |
345 OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
340 346
341 /* OMAP_DSS_VIDEO1 */ 347 /* OMAP_DSS_VIDEO1 */
342 OMAP_DSS_OVL_CAP_SCALE, 348 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
349 OMAP_DSS_OVL_CAP_REPLICATION,
343 350
344 /* OMAP_DSS_VIDEO2 */ 351 /* OMAP_DSS_VIDEO2 */
345 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | 352 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
346 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA, 353 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_POS |
354 OMAP_DSS_OVL_CAP_REPLICATION,
347}; 355};
348 356
349static const enum omap_overlay_caps omap4_dss_overlay_caps[] = { 357static const enum omap_overlay_caps omap4_dss_overlay_caps[] = {
350 /* OMAP_DSS_GFX */ 358 /* OMAP_DSS_GFX */
351 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | 359 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA |
352 OMAP_DSS_OVL_CAP_ZORDER, 360 OMAP_DSS_OVL_CAP_ZORDER | OMAP_DSS_OVL_CAP_POS |
361 OMAP_DSS_OVL_CAP_REPLICATION,
353 362
354 /* OMAP_DSS_VIDEO1 */ 363 /* OMAP_DSS_VIDEO1 */
355 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | 364 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
356 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER, 365 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER |
366 OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
357 367
358 /* OMAP_DSS_VIDEO2 */ 368 /* OMAP_DSS_VIDEO2 */
359 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | 369 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
360 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER, 370 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER |
371 OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
361 372
362 /* OMAP_DSS_VIDEO3 */ 373 /* OMAP_DSS_VIDEO3 */
363 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | 374 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
364 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER, 375 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER |
376 OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
365}; 377};
366 378
367static const char * const omap2_dss_clk_source_names[] = { 379static const char * const omap2_dss_clk_source_names[] = {
diff --git a/include/video/omapdss.h b/include/video/omapdss.h
index e65e2e9e16e..46097bd052a 100644
--- a/include/video/omapdss.h
+++ b/include/video/omapdss.h
@@ -187,6 +187,8 @@ enum omap_overlay_caps {
187 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA = 1 << 1, 187 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA = 1 << 1,
188 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA = 1 << 2, 188 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA = 1 << 2,
189 OMAP_DSS_OVL_CAP_ZORDER = 1 << 3, 189 OMAP_DSS_OVL_CAP_ZORDER = 1 << 3,
190 OMAP_DSS_OVL_CAP_POS = 1 << 4,
191 OMAP_DSS_OVL_CAP_REPLICATION = 1 << 5,
190}; 192};
191 193
192enum omap_overlay_manager_caps { 194enum omap_overlay_manager_caps {