aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArchit Taneja <archit@ti.com>2011-09-26 02:17:29 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2011-10-03 09:51:54 -0400
commit11354dd58da1134ec9c96b65104e5cf2d50e1eb9 (patch)
treea836cd3a6ece346f3cdad52f690ab4bfeba200ca
parent28748782b736b1a87bd1224d678e416a8375ea13 (diff)
OMAPDSS/OMAP_VOUT: Fix incorrect OMAP3-alpha compatibility setting
On OMAP3, in order to enable alpha blending for LCD and TV managers, we needed to set LCDALPHABLENDERENABLE/TVALPHABLENDERENABLE bits in DISPC_CONFIG. On OMAP4, alpha blending is always enabled by default, if the above bits are set, we switch to an OMAP3 compatibility mode where the zorder values in the pipeline attribute registers are ignored and a fixed priority is configured. Rename the manager_info member "alpha_enabled" to "partial_alpha_enabled" for more clarity. Introduce two dss_features FEAT_ALPHA_FIXED_ZORDER and FEAT_ALPHA_FREE_ZORDER which represent OMAP3-alpha compatibility mode and OMAP4 alpha mode respectively. Introduce an overlay cap for ZORDER. The DSS2 user is expected to check for the ZORDER cap, if an overlay doesn't have this cap, the user is expected to set the parameter partial_alpha_enabled. If the overlay has ZORDER cap, the DSS2 user can assume that alpha blending is already enabled. Don't support OMAP3 compatibility mode for now. Trying to read/write to alpha_blending_enabled sysfs attribute issues a warning for OMAP4 and does not set the LCDALPHABLENDERENABLE/TVALPHABLENDERENABLE bits. Change alpha_enabled to partial_alpha_enabled in the omap_vout driver. Use overlay cap "OMAP_DSS_OVL_CAP_GLOBAL_ALPHA" to check if overlay supports alpha blending or not. Replace this with checks for VIDEO1 pipeline. Cc: linux-media@vger.kernel.org Cc: Lajos Molnar <molnar@ti.com> Signed-off-by: Archit Taneja <archit@ti.com> Acked-by: Vaibhav Hiremath <hvaibhav@ti.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
-rw-r--r--drivers/media/video/omap/omap_vout.c17
-rw-r--r--drivers/video/omap2/dss/dispc.c24
-rw-r--r--drivers/video/omap2/dss/dss.h4
-rw-r--r--drivers/video/omap2/dss/dss_features.c22
-rw-r--r--drivers/video/omap2/dss/dss_features.h3
-rw-r--r--drivers/video/omap2/dss/manager.c28
-rw-r--r--include/video/omapdss.h3
7 files changed, 60 insertions, 41 deletions
diff --git a/drivers/media/video/omap/omap_vout.c b/drivers/media/video/omap/omap_vout.c
index e2f4780c00a..ec4a31f577a 100644
--- a/drivers/media/video/omap/omap_vout.c
+++ b/drivers/media/video/omap/omap_vout.c
@@ -1164,12 +1164,17 @@ static int vidioc_try_fmt_vid_overlay(struct file *file, void *fh,
1164{ 1164{
1165 int ret = 0; 1165 int ret = 0;
1166 struct omap_vout_device *vout = fh; 1166 struct omap_vout_device *vout = fh;
1167 struct omap_overlay *ovl;
1168 struct omapvideo_info *ovid;
1167 struct v4l2_window *win = &f->fmt.win; 1169 struct v4l2_window *win = &f->fmt.win;
1168 1170
1171 ovid = &vout->vid_info;
1172 ovl = ovid->overlays[0];
1173
1169 ret = omap_vout_try_window(&vout->fbuf, win); 1174 ret = omap_vout_try_window(&vout->fbuf, win);
1170 1175
1171 if (!ret) { 1176 if (!ret) {
1172 if (vout->vid == OMAP_VIDEO1) 1177 if ((ovl->caps & OMAP_DSS_OVL_CAP_GLOBAL_ALPHA) == 0)
1173 win->global_alpha = 255; 1178 win->global_alpha = 255;
1174 else 1179 else
1175 win->global_alpha = f->fmt.win.global_alpha; 1180 win->global_alpha = f->fmt.win.global_alpha;
@@ -1193,8 +1198,8 @@ static int vidioc_s_fmt_vid_overlay(struct file *file, void *fh,
1193 1198
1194 ret = omap_vout_new_window(&vout->crop, &vout->win, &vout->fbuf, win); 1199 ret = omap_vout_new_window(&vout->crop, &vout->win, &vout->fbuf, win);
1195 if (!ret) { 1200 if (!ret) {
1196 /* Video1 plane does not support global alpha */ 1201 /* Video1 plane does not support global alpha on OMAP3 */
1197 if (ovl->id == OMAP_DSS_VIDEO1) 1202 if ((ovl->caps & OMAP_DSS_OVL_CAP_GLOBAL_ALPHA) == 0)
1198 vout->win.global_alpha = 255; 1203 vout->win.global_alpha = 255;
1199 else 1204 else
1200 vout->win.global_alpha = f->fmt.win.global_alpha; 1205 vout->win.global_alpha = f->fmt.win.global_alpha;
@@ -1787,7 +1792,9 @@ static int vidioc_s_fbuf(struct file *file, void *fh,
1787 if (ovl->manager && ovl->manager->get_manager_info && 1792 if (ovl->manager && ovl->manager->get_manager_info &&
1788 ovl->manager->set_manager_info) { 1793 ovl->manager->set_manager_info) {
1789 ovl->manager->get_manager_info(ovl->manager, &info); 1794 ovl->manager->get_manager_info(ovl->manager, &info);
1790 info.alpha_enabled = enable; 1795 /* enable this only if there is no zorder cap */
1796 if ((ovl->caps & OMAP_DSS_OVL_CAP_ZORDER) == 0)
1797 info.partial_alpha_enabled = enable;
1791 if (ovl->manager->set_manager_info(ovl->manager, &info)) 1798 if (ovl->manager->set_manager_info(ovl->manager, &info))
1792 return -EINVAL; 1799 return -EINVAL;
1793 } 1800 }
@@ -1819,7 +1826,7 @@ static int vidioc_g_fbuf(struct file *file, void *fh,
1819 } 1826 }
1820 if (ovl->manager && ovl->manager->get_manager_info) { 1827 if (ovl->manager && ovl->manager->get_manager_info) {
1821 ovl->manager->get_manager_info(ovl->manager, &info); 1828 ovl->manager->get_manager_info(ovl->manager, &info);
1822 if (info.alpha_enabled) 1829 if (info.partial_alpha_enabled)
1823 a->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA; 1830 a->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
1824 } 1831 }
1825 1832
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
index 5e6849e224c..e0639d328c5 100644
--- a/drivers/video/omap2/dss/dispc.c
+++ b/drivers/video/omap2/dss/dispc.c
@@ -179,7 +179,8 @@ static void dispc_save_context(void)
179 SR(CONTROL); 179 SR(CONTROL);
180 SR(CONFIG); 180 SR(CONFIG);
181 SR(LINE_NUMBER); 181 SR(LINE_NUMBER);
182 if (dss_has_feature(FEAT_GLOBAL_ALPHA)) 182 if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER) ||
183 dss_has_feature(FEAT_ALPHA_FREE_ZORDER))
183 SR(GLOBAL_ALPHA); 184 SR(GLOBAL_ALPHA);
184 if (dss_has_feature(FEAT_MGR_LCD2)) { 185 if (dss_has_feature(FEAT_MGR_LCD2)) {
185 SR(CONTROL2); 186 SR(CONTROL2);
@@ -293,7 +294,8 @@ static void dispc_restore_context(void)
293 /*RR(CONTROL);*/ 294 /*RR(CONTROL);*/
294 RR(CONFIG); 295 RR(CONFIG);
295 RR(LINE_NUMBER); 296 RR(LINE_NUMBER);
296 if (dss_has_feature(FEAT_GLOBAL_ALPHA)) 297 if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER) ||
298 dss_has_feature(FEAT_ALPHA_FREE_ZORDER))
297 RR(GLOBAL_ALPHA); 299 RR(GLOBAL_ALPHA);
298 if (dss_has_feature(FEAT_MGR_LCD2)) 300 if (dss_has_feature(FEAT_MGR_LCD2))
299 RR(CONFIG2); 301 RR(CONFIG2);
@@ -2159,38 +2161,35 @@ void dispc_mgr_enable_trans_key(enum omap_channel ch, bool enable)
2159 else /* OMAP_DSS_CHANNEL_LCD2 */ 2161 else /* OMAP_DSS_CHANNEL_LCD2 */
2160 REG_FLD_MOD(DISPC_CONFIG2, enable, 10, 10); 2162 REG_FLD_MOD(DISPC_CONFIG2, enable, 10, 10);
2161} 2163}
2162void dispc_mgr_enable_alpha_blending(enum omap_channel ch, bool enable) 2164
2165void dispc_mgr_enable_alpha_fixed_zorder(enum omap_channel ch, bool enable)
2163{ 2166{
2164 if (!dss_has_feature(FEAT_GLOBAL_ALPHA)) 2167 if (!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER))
2165 return; 2168 return;
2166 2169
2167 if (ch == OMAP_DSS_CHANNEL_LCD) 2170 if (ch == OMAP_DSS_CHANNEL_LCD)
2168 REG_FLD_MOD(DISPC_CONFIG, enable, 18, 18); 2171 REG_FLD_MOD(DISPC_CONFIG, enable, 18, 18);
2169 else if (ch == OMAP_DSS_CHANNEL_DIGIT) 2172 else if (ch == OMAP_DSS_CHANNEL_DIGIT)
2170 REG_FLD_MOD(DISPC_CONFIG, enable, 19, 19); 2173 REG_FLD_MOD(DISPC_CONFIG, enable, 19, 19);
2171 else /* OMAP_DSS_CHANNEL_LCD2 */
2172 REG_FLD_MOD(DISPC_CONFIG2, enable, 18, 18);
2173} 2174}
2174bool dispc_mgr_alpha_blending_enabled(enum omap_channel ch) 2175
2176bool dispc_mgr_alpha_fixed_zorder_enabled(enum omap_channel ch)
2175{ 2177{
2176 bool enabled; 2178 bool enabled;
2177 2179
2178 if (!dss_has_feature(FEAT_GLOBAL_ALPHA)) 2180 if (!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER))
2179 return false; 2181 return false;
2180 2182
2181 if (ch == OMAP_DSS_CHANNEL_LCD) 2183 if (ch == OMAP_DSS_CHANNEL_LCD)
2182 enabled = REG_GET(DISPC_CONFIG, 18, 18); 2184 enabled = REG_GET(DISPC_CONFIG, 18, 18);
2183 else if (ch == OMAP_DSS_CHANNEL_DIGIT) 2185 else if (ch == OMAP_DSS_CHANNEL_DIGIT)
2184 enabled = REG_GET(DISPC_CONFIG, 19, 19); 2186 enabled = REG_GET(DISPC_CONFIG, 19, 19);
2185 else if (ch == OMAP_DSS_CHANNEL_LCD2)
2186 enabled = REG_GET(DISPC_CONFIG2, 18, 18);
2187 else 2187 else
2188 BUG(); 2188 BUG();
2189 2189
2190 return enabled; 2190 return enabled;
2191} 2191}
2192 2192
2193
2194bool dispc_mgr_trans_key_enabled(enum omap_channel ch) 2193bool dispc_mgr_trans_key_enabled(enum omap_channel ch)
2195{ 2194{
2196 bool enabled; 2195 bool enabled;
@@ -2603,7 +2602,8 @@ void dispc_dump_regs(struct seq_file *s)
2603 DUMPREG(DISPC_CAPABLE); 2602 DUMPREG(DISPC_CAPABLE);
2604 DUMPREG(DISPC_LINE_STATUS); 2603 DUMPREG(DISPC_LINE_STATUS);
2605 DUMPREG(DISPC_LINE_NUMBER); 2604 DUMPREG(DISPC_LINE_NUMBER);
2606 if (dss_has_feature(FEAT_GLOBAL_ALPHA)) 2605 if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER) ||
2606 dss_has_feature(FEAT_ALPHA_FREE_ZORDER))
2607 DUMPREG(DISPC_GLOBAL_ALPHA); 2607 DUMPREG(DISPC_GLOBAL_ALPHA);
2608 if (dss_has_feature(FEAT_MGR_LCD2)) { 2608 if (dss_has_feature(FEAT_MGR_LCD2)) {
2609 DUMPREG(DISPC_CONTROL2); 2609 DUMPREG(DISPC_CONTROL2);
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
index 86520072477..6308fc59fc9 100644
--- a/drivers/video/omap2/dss/dss.h
+++ b/drivers/video/omap2/dss/dss.h
@@ -430,9 +430,9 @@ void dispc_mgr_get_trans_key(enum omap_channel ch,
430 enum omap_dss_trans_key_type *type, 430 enum omap_dss_trans_key_type *type,
431 u32 *trans_key); 431 u32 *trans_key);
432void dispc_mgr_enable_trans_key(enum omap_channel ch, bool enable); 432void dispc_mgr_enable_trans_key(enum omap_channel ch, bool enable);
433void dispc_mgr_enable_alpha_blending(enum omap_channel ch, bool enable); 433void dispc_mgr_enable_alpha_fixed_zorder(enum omap_channel ch, bool enable);
434bool dispc_mgr_trans_key_enabled(enum omap_channel ch); 434bool dispc_mgr_trans_key_enabled(enum omap_channel ch);
435bool dispc_mgr_alpha_blending_enabled(enum omap_channel ch); 435bool dispc_mgr_alpha_fixed_zorder_enabled(enum omap_channel ch);
436void dispc_mgr_set_lcd_timings(enum omap_channel channel, 436void dispc_mgr_set_lcd_timings(enum omap_channel channel,
437 struct omap_video_timings *timings); 437 struct omap_video_timings *timings);
438void dispc_mgr_set_pol_freq(enum omap_channel channel, 438void dispc_mgr_set_pol_freq(enum omap_channel channel,
diff --git a/drivers/video/omap2/dss/dss_features.c b/drivers/video/omap2/dss/dss_features.c
index a2fc8e05868..eb08b003ba4 100644
--- a/drivers/video/omap2/dss/dss_features.c
+++ b/drivers/video/omap2/dss/dss_features.c
@@ -248,15 +248,16 @@ static const enum omap_overlay_caps omap3630_dss_overlay_caps[] = {
248 248
249static const enum omap_overlay_caps omap4_dss_overlay_caps[] = { 249static const enum omap_overlay_caps omap4_dss_overlay_caps[] = {
250 /* OMAP_DSS_GFX */ 250 /* OMAP_DSS_GFX */
251 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA, 251 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA |
252 OMAP_DSS_OVL_CAP_ZORDER,
252 253
253 /* OMAP_DSS_VIDEO1 */ 254 /* OMAP_DSS_VIDEO1 */
254 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | 255 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
255 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA, 256 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER,
256 257
257 /* OMAP_DSS_VIDEO2 */ 258 /* OMAP_DSS_VIDEO2 */
258 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | 259 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
259 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA, 260 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER,
260}; 261};
261 262
262static const char * const omap2_dss_clk_source_names[] = { 263static const char * const omap2_dss_clk_source_names[] = {
@@ -342,13 +343,13 @@ static const struct omap_dss_features omap3430_dss_features = {
342 .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields), 343 .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
343 344
344 .has_feature = 345 .has_feature =
345 FEAT_GLOBAL_ALPHA | FEAT_LCDENABLEPOL | 346 FEAT_LCDENABLEPOL |
346 FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE | 347 FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE |
347 FEAT_FUNCGATED | FEAT_ROWREPEATENABLE | 348 FEAT_FUNCGATED | FEAT_ROWREPEATENABLE |
348 FEAT_LINEBUFFERSPLIT | FEAT_RESIZECONF | 349 FEAT_LINEBUFFERSPLIT | FEAT_RESIZECONF |
349 FEAT_DSI_PLL_FREQSEL | FEAT_DSI_REVERSE_TXCLKESC | 350 FEAT_DSI_PLL_FREQSEL | FEAT_DSI_REVERSE_TXCLKESC |
350 FEAT_VENC_REQUIRES_TV_DAC_CLK | FEAT_CPR | FEAT_PRELOAD | 351 FEAT_VENC_REQUIRES_TV_DAC_CLK | FEAT_CPR | FEAT_PRELOAD |
351 FEAT_FIR_COEF_V, 352 FEAT_FIR_COEF_V | FEAT_ALPHA_FIXED_ZORDER,
352 353
353 .num_mgrs = 2, 354 .num_mgrs = 2,
354 .num_ovls = 3, 355 .num_ovls = 3,
@@ -366,13 +367,13 @@ static const struct omap_dss_features omap3630_dss_features = {
366 .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields), 367 .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
367 368
368 .has_feature = 369 .has_feature =
369 FEAT_GLOBAL_ALPHA | FEAT_LCDENABLEPOL | 370 FEAT_LCDENABLEPOL |
370 FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE | 371 FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE |
371 FEAT_FUNCGATED | 372 FEAT_FUNCGATED |
372 FEAT_ROWREPEATENABLE | FEAT_LINEBUFFERSPLIT | 373 FEAT_ROWREPEATENABLE | FEAT_LINEBUFFERSPLIT |
373 FEAT_RESIZECONF | FEAT_DSI_PLL_PWR_BUG | 374 FEAT_RESIZECONF | FEAT_DSI_PLL_PWR_BUG |
374 FEAT_DSI_PLL_FREQSEL | FEAT_CPR | FEAT_PRELOAD | 375 FEAT_DSI_PLL_FREQSEL | FEAT_CPR | FEAT_PRELOAD |
375 FEAT_FIR_COEF_V, 376 FEAT_FIR_COEF_V | FEAT_ALPHA_FIXED_ZORDER,
376 377
377 .num_mgrs = 2, 378 .num_mgrs = 2,
378 .num_ovls = 3, 379 .num_ovls = 3,
@@ -392,12 +393,12 @@ static const struct omap_dss_features omap4430_es1_0_dss_features = {
392 .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields), 393 .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),
393 394
394 .has_feature = 395 .has_feature =
395 FEAT_GLOBAL_ALPHA |
396 FEAT_MGR_LCD2 | 396 FEAT_MGR_LCD2 |
397 FEAT_CORE_CLK_DIV | FEAT_LCD_CLK_SRC | 397 FEAT_CORE_CLK_DIV | FEAT_LCD_CLK_SRC |
398 FEAT_DSI_DCS_CMD_CONFIG_VC | FEAT_DSI_VC_OCP_WIDTH | 398 FEAT_DSI_DCS_CMD_CONFIG_VC | FEAT_DSI_VC_OCP_WIDTH |
399 FEAT_DSI_GNQ | FEAT_HANDLE_UV_SEPARATE | FEAT_ATTR2 | 399 FEAT_DSI_GNQ | FEAT_HANDLE_UV_SEPARATE | FEAT_ATTR2 |
400 FEAT_CPR | FEAT_PRELOAD | FEAT_FIR_COEF_V, 400 FEAT_CPR | FEAT_PRELOAD | FEAT_FIR_COEF_V |
401 FEAT_ALPHA_FREE_ZORDER,
401 402
402 .num_mgrs = 3, 403 .num_mgrs = 3,
403 .num_ovls = 3, 404 .num_ovls = 3,
@@ -416,13 +417,12 @@ static const struct omap_dss_features omap4_dss_features = {
416 .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields), 417 .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),
417 418
418 .has_feature = 419 .has_feature =
419 FEAT_GLOBAL_ALPHA |
420 FEAT_MGR_LCD2 | 420 FEAT_MGR_LCD2 |
421 FEAT_CORE_CLK_DIV | FEAT_LCD_CLK_SRC | 421 FEAT_CORE_CLK_DIV | FEAT_LCD_CLK_SRC |
422 FEAT_DSI_DCS_CMD_CONFIG_VC | FEAT_DSI_VC_OCP_WIDTH | 422 FEAT_DSI_DCS_CMD_CONFIG_VC | FEAT_DSI_VC_OCP_WIDTH |
423 FEAT_DSI_GNQ | FEAT_HDMI_CTS_SWMODE | 423 FEAT_DSI_GNQ | FEAT_HDMI_CTS_SWMODE |
424 FEAT_HANDLE_UV_SEPARATE | FEAT_ATTR2 | FEAT_CPR | 424 FEAT_HANDLE_UV_SEPARATE | FEAT_ATTR2 | FEAT_CPR |
425 FEAT_PRELOAD | FEAT_FIR_COEF_V, 425 FEAT_PRELOAD | FEAT_FIR_COEF_V | FEAT_ALPHA_FREE_ZORDER,
426 426
427 .num_mgrs = 3, 427 .num_mgrs = 3,
428 .num_ovls = 3, 428 .num_ovls = 3,
diff --git a/drivers/video/omap2/dss/dss_features.h b/drivers/video/omap2/dss/dss_features.h
index cd606447fcf..e81271a0e00 100644
--- a/drivers/video/omap2/dss/dss_features.h
+++ b/drivers/video/omap2/dss/dss_features.h
@@ -31,7 +31,6 @@
31 31
32/* DSS has feature id */ 32/* DSS has feature id */
33enum dss_feat_id { 33enum dss_feat_id {
34 FEAT_GLOBAL_ALPHA = 1 << 0,
35 FEAT_LCDENABLEPOL = 1 << 3, 34 FEAT_LCDENABLEPOL = 1 << 3,
36 FEAT_LCDENABLESIGNAL = 1 << 4, 35 FEAT_LCDENABLESIGNAL = 1 << 4,
37 FEAT_PCKFREEENABLE = 1 << 5, 36 FEAT_PCKFREEENABLE = 1 << 5,
@@ -57,6 +56,8 @@ enum dss_feat_id {
57 FEAT_CPR = 1 << 23, 56 FEAT_CPR = 1 << 23,
58 FEAT_PRELOAD = 1 << 24, 57 FEAT_PRELOAD = 1 << 24,
59 FEAT_FIR_COEF_V = 1 << 25, 58 FEAT_FIR_COEF_V = 1 << 25,
59 FEAT_ALPHA_FIXED_ZORDER = 1 << 26,
60 FEAT_ALPHA_FREE_ZORDER = 1 << 27,
60}; 61};
61 62
62/* DSS register field id */ 63/* DSS register field id */
diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
index fdbbeebcd75..6e63845cc7d 100644
--- a/drivers/video/omap2/dss/manager.c
+++ b/drivers/video/omap2/dss/manager.c
@@ -249,7 +249,10 @@ static ssize_t manager_trans_key_enabled_store(struct omap_overlay_manager *mgr,
249static ssize_t manager_alpha_blending_enabled_show( 249static ssize_t manager_alpha_blending_enabled_show(
250 struct omap_overlay_manager *mgr, char *buf) 250 struct omap_overlay_manager *mgr, char *buf)
251{ 251{
252 return snprintf(buf, PAGE_SIZE, "%d\n", mgr->info.alpha_enabled); 252 WARN_ON(!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER));
253
254 return snprintf(buf, PAGE_SIZE, "%d\n",
255 mgr->info.partial_alpha_enabled);
253} 256}
254 257
255static ssize_t manager_alpha_blending_enabled_store( 258static ssize_t manager_alpha_blending_enabled_store(
@@ -260,13 +263,15 @@ static ssize_t manager_alpha_blending_enabled_store(
260 bool enable; 263 bool enable;
261 int r; 264 int r;
262 265
266 WARN_ON(!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER));
267
263 r = strtobool(buf, &enable); 268 r = strtobool(buf, &enable);
264 if (r) 269 if (r)
265 return r; 270 return r;
266 271
267 mgr->get_manager_info(mgr, &info); 272 mgr->get_manager_info(mgr, &info);
268 273
269 info.alpha_enabled = enable; 274 info.partial_alpha_enabled = enable;
270 275
271 r = mgr->set_manager_info(mgr, &info); 276 r = mgr->set_manager_info(mgr, &info);
272 if (r) 277 if (r)
@@ -966,7 +971,7 @@ static void configure_manager(enum omap_channel channel)
966 dispc_mgr_set_default_color(channel, mi->default_color); 971 dispc_mgr_set_default_color(channel, mi->default_color);
967 dispc_mgr_set_trans_key(channel, mi->trans_key_type, mi->trans_key); 972 dispc_mgr_set_trans_key(channel, mi->trans_key_type, mi->trans_key);
968 dispc_mgr_enable_trans_key(channel, mi->trans_enabled); 973 dispc_mgr_enable_trans_key(channel, mi->trans_enabled);
969 dispc_mgr_enable_alpha_blending(channel, mi->alpha_enabled); 974 dispc_mgr_enable_alpha_fixed_zorder(channel, mi->partial_alpha_enabled);
970 if (dss_has_feature(FEAT_CPR)) { 975 if (dss_has_feature(FEAT_CPR)) {
971 dispc_mgr_enable_cpr(channel, mi->cpr_enable); 976 dispc_mgr_enable_cpr(channel, mi->cpr_enable);
972 dispc_mgr_set_cpr_coef(channel, &mi->cpr_coefs); 977 dispc_mgr_set_cpr_coef(channel, &mi->cpr_coefs);
@@ -1481,12 +1486,17 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
1481 1486
1482static int dss_check_manager(struct omap_overlay_manager *mgr) 1487static int dss_check_manager(struct omap_overlay_manager *mgr)
1483{ 1488{
1484 /* OMAP supports only graphics source transparency color key and alpha 1489 if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER)) {
1485 * blending simultaneously. See TRM 15.4.2.4.2.2 Alpha Mode */ 1490 /*
1486 1491 * OMAP3 supports only graphics source transparency color key
1487 if (mgr->info.alpha_enabled && mgr->info.trans_enabled && 1492 * and alpha blending simultaneously. See TRM 15.4.2.4.2.2
1488 mgr->info.trans_key_type != OMAP_DSS_COLOR_KEY_GFX_DST) 1493 * Alpha Mode
1489 return -EINVAL; 1494 */
1495 if (mgr->info.partial_alpha_enabled && mgr->info.trans_enabled
1496 && mgr->info.trans_key_type !=
1497 OMAP_DSS_COLOR_KEY_GFX_DST)
1498 return -EINVAL;
1499 }
1490 1500
1491 return 0; 1501 return 0;
1492} 1502}
diff --git a/include/video/omapdss.h b/include/video/omapdss.h
index 2123fb2d51c..3db8b4c4d6e 100644
--- a/include/video/omapdss.h
+++ b/include/video/omapdss.h
@@ -179,6 +179,7 @@ enum omap_overlay_caps {
179 OMAP_DSS_OVL_CAP_SCALE = 1 << 0, 179 OMAP_DSS_OVL_CAP_SCALE = 1 << 0,
180 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA = 1 << 1, 180 OMAP_DSS_OVL_CAP_GLOBAL_ALPHA = 1 << 1,
181 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA = 1 << 2, 181 OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA = 1 << 2,
182 OMAP_DSS_OVL_CAP_ZORDER = 1 << 3,
182}; 183};
183 184
184enum omap_overlay_manager_caps { 185enum omap_overlay_manager_caps {
@@ -412,7 +413,7 @@ struct omap_overlay_manager_info {
412 u32 trans_key; 413 u32 trans_key;
413 bool trans_enabled; 414 bool trans_enabled;
414 415
415 bool alpha_enabled; 416 bool partial_alpha_enabled;
416 417
417 bool cpr_enable; 418 bool cpr_enable;
418 struct omap_dss_cpr_coefs cpr_coefs; 419 struct omap_dss_cpr_coefs cpr_coefs;