/* * Presents the flip in the display with the DSS2 overlay API * in: psSwapChain, aPhyAddr */ static void OMAPLFBFlipNoLock(OMAPLFB_SWAPCHAIN *psSwapChain, unsigned long aPhyAddr) { OMAPLFB_DEVINFO *psDevInfo = (OMAPLFB_DEVINFO *)psSwapChain->pvDevInfo; struct fb_info * framebuffer = psDevInfo->psLINFBInfo; struct omapfb_info *ofbi = FB2OFB(framebuffer); unsigned long fb_offset; int i; fb_offset = aPhyAddr - psDevInfo->sSystemBuffer.sSysAddr.uiAddr; for(i = 0; i < ofbi->num_overlays ; i++) { struct omap_dss_device *display = NULL; struct omap_dss_driver *driver = NULL; struct omap_overlay_manager *manager; struct omap_overlay *overlay; struct omap_overlay_info overlay_info; overlay = ofbi->overlays[i]; manager = overlay->manager; overlay->get_overlay_info( overlay, &overlay_info ); overlay_info.paddr = framebuffer->fix.smem_start + fb_offset; overlay_info.vaddr = framebuffer->screen_base + fb_offset; overlay->set_overlay_info(overlay, &overlay_info); if (manager) { display = manager->device; /* No display attached to this overlay, don't update */ if (!display) continue; driver = display->driver; manager->set_manager_info(manager, &manager->info); manager->apply(manager); } if (dss_ovl_manually_updated(overlay)) { if (driver->sched_update) driver->sched_update(display, 0, 0, overlay_info.width, overlay_info.height); else if (driver->update) driver->update(display, 0, 0, overlay_info.width, overlay_info.height); } } }
static int present_buffer(struct omap_display_buffer *buffer) { struct omap_display_device *display = buffer->display; struct fb_info *framebuffer; struct omapfb_info *ofbi; struct omapfb2_device *fbdev; int i; int fb_idx; switch (display->id) { case OMAP_DISPID_PRIMARY: fb_idx = 0; break; case OMAP_DISPID_SECONDARY: fb_idx = 1; break; case OMAP_DISPID_TERTIARY: fb_idx = 2; break; case OMAP_DISPID_VIRTUAL: case OMAP_DISPID_BADSTATE: default: ERR_PRINT("Unable to handle display %i", display->id); BUG(); } if (fb_idx < 0 || fb_idx >= num_registered_fb) { ERR_PRINT("Framebuffer %i doesn't exist for display '%s'", fb_idx, display->name); return 1; } framebuffer = registered_fb[fb_idx]; ofbi = FB2OFB(framebuffer); fbdev = ofbi->fbdev; omapfb_lock(fbdev); /* Get the overlays attached to the framebuffer */ for (i = 0; i < ofbi->num_overlays ; i++) { struct omap_dss_device *display = NULL; struct omap_dss_driver *driver = NULL; struct omap_overlay_manager *manager; struct omap_overlay *overlay; struct omap_overlay_info overlay_info; overlay = ofbi->overlays[i]; manager = overlay->manager; overlay->get_overlay_info(overlay, &overlay_info); overlay_info.paddr = buffer->physical_addr; overlay_info.vaddr = (void *) buffer->virtual_addr; overlay->set_overlay_info(overlay, &overlay_info); if (manager) { manager->apply(manager); display = manager->device; driver = display ? display->driver : NULL; } if (dss_ovl_manually_updated(overlay)) { if (driver->sched_update) driver->sched_update(display, 0, 0, overlay_info.width, overlay_info.height); else if (driver->update) driver->update(display, 0, 0, overlay_info.width, overlay_info.height); } } omapfb_unlock(fbdev); return 0; }