diff options
Diffstat (limited to 'drivers/video/omap2/dss/overlay.c')
-rw-r--r-- | drivers/video/omap2/dss/overlay.c | 55 |
1 files changed, 53 insertions, 2 deletions
diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c index 75642c22cac..456efef03c2 100644 --- a/drivers/video/omap2/dss/overlay.c +++ b/drivers/video/omap2/dss/overlay.c | |||
@@ -257,6 +257,43 @@ static ssize_t overlay_global_alpha_store(struct omap_overlay *ovl, | |||
257 | return size; | 257 | return size; |
258 | } | 258 | } |
259 | 259 | ||
260 | static ssize_t overlay_pre_mult_alpha_show(struct omap_overlay *ovl, | ||
261 | char *buf) | ||
262 | { | ||
263 | return snprintf(buf, PAGE_SIZE, "%d\n", | ||
264 | ovl->info.pre_mult_alpha); | ||
265 | } | ||
266 | |||
267 | static ssize_t overlay_pre_mult_alpha_store(struct omap_overlay *ovl, | ||
268 | const char *buf, size_t size) | ||
269 | { | ||
270 | int r; | ||
271 | struct omap_overlay_info info; | ||
272 | |||
273 | ovl->get_overlay_info(ovl, &info); | ||
274 | |||
275 | /* only GFX and Video2 plane support pre alpha multiplied | ||
276 | * set zero for Video1 plane | ||
277 | */ | ||
278 | if (!dss_has_feature(FEAT_GLOBAL_ALPHA_VID1) && | ||
279 | ovl->id == OMAP_DSS_VIDEO1) | ||
280 | info.pre_mult_alpha = 0; | ||
281 | else | ||
282 | info.pre_mult_alpha = simple_strtoul(buf, NULL, 10); | ||
283 | |||
284 | r = ovl->set_overlay_info(ovl, &info); | ||
285 | if (r) | ||
286 | return r; | ||
287 | |||
288 | if (ovl->manager) { | ||
289 | r = ovl->manager->apply(ovl->manager); | ||
290 | if (r) | ||
291 | return r; | ||
292 | } | ||
293 | |||
294 | return size; | ||
295 | } | ||
296 | |||
260 | struct overlay_attribute { | 297 | struct overlay_attribute { |
261 | struct attribute attr; | 298 | struct attribute attr; |
262 | ssize_t (*show)(struct omap_overlay *, char *); | 299 | ssize_t (*show)(struct omap_overlay *, char *); |
@@ -280,6 +317,9 @@ static OVERLAY_ATTR(enabled, S_IRUGO|S_IWUSR, | |||
280 | overlay_enabled_show, overlay_enabled_store); | 317 | overlay_enabled_show, overlay_enabled_store); |
281 | static OVERLAY_ATTR(global_alpha, S_IRUGO|S_IWUSR, | 318 | static OVERLAY_ATTR(global_alpha, S_IRUGO|S_IWUSR, |
282 | overlay_global_alpha_show, overlay_global_alpha_store); | 319 | overlay_global_alpha_show, overlay_global_alpha_store); |
320 | static OVERLAY_ATTR(pre_mult_alpha, S_IRUGO|S_IWUSR, | ||
321 | overlay_pre_mult_alpha_show, | ||
322 | overlay_pre_mult_alpha_store); | ||
283 | 323 | ||
284 | static struct attribute *overlay_sysfs_attrs[] = { | 324 | static struct attribute *overlay_sysfs_attrs[] = { |
285 | &overlay_attr_name.attr, | 325 | &overlay_attr_name.attr, |
@@ -290,6 +330,7 @@ static struct attribute *overlay_sysfs_attrs[] = { | |||
290 | &overlay_attr_output_size.attr, | 330 | &overlay_attr_output_size.attr, |
291 | &overlay_attr_enabled.attr, | 331 | &overlay_attr_enabled.attr, |
292 | &overlay_attr_global_alpha.attr, | 332 | &overlay_attr_global_alpha.attr, |
333 | &overlay_attr_pre_mult_alpha.attr, | ||
293 | NULL | 334 | NULL |
294 | }; | 335 | }; |
295 | 336 | ||
@@ -623,12 +664,22 @@ void dss_recheck_connections(struct omap_dss_device *dssdev, bool force) | |||
623 | int i; | 664 | int i; |
624 | struct omap_overlay_manager *lcd_mgr; | 665 | struct omap_overlay_manager *lcd_mgr; |
625 | struct omap_overlay_manager *tv_mgr; | 666 | struct omap_overlay_manager *tv_mgr; |
667 | struct omap_overlay_manager *lcd2_mgr = NULL; | ||
626 | struct omap_overlay_manager *mgr = NULL; | 668 | struct omap_overlay_manager *mgr = NULL; |
627 | 669 | ||
628 | lcd_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_LCD); | 670 | lcd_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_LCD); |
629 | tv_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_TV); | 671 | tv_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_TV); |
630 | 672 | if (dss_has_feature(FEAT_MGR_LCD2)) | |
631 | if (dssdev->type != OMAP_DISPLAY_TYPE_VENC) { | 673 | lcd2_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_LCD2); |
674 | |||
675 | if (dssdev->channel == OMAP_DSS_CHANNEL_LCD2) { | ||
676 | if (!lcd2_mgr->device || force) { | ||
677 | if (lcd2_mgr->device) | ||
678 | lcd2_mgr->unset_device(lcd2_mgr); | ||
679 | lcd2_mgr->set_device(lcd2_mgr, dssdev); | ||
680 | mgr = lcd2_mgr; | ||
681 | } | ||
682 | } else if (dssdev->type != OMAP_DISPLAY_TYPE_VENC) { | ||
632 | if (!lcd_mgr->device || force) { | 683 | if (!lcd_mgr->device || force) { |
633 | if (lcd_mgr->device) | 684 | if (lcd_mgr->device) |
634 | lcd_mgr->unset_device(lcd_mgr); | 685 | lcd_mgr->unset_device(lcd_mgr); |