static PVRSRV_ERROR SwapToDCSystem(IMG_HANDLE hDevice, IMG_HANDLE hSwapChain) { OMAPLFB_DEVINFO *psDevInfo; OMAPLFB_SWAPCHAIN *psSwapChain; unsigned long ulLockFlags; if(!hDevice || !hSwapChain) { return (PVRSRV_ERROR_INVALID_PARAMS); } psDevInfo = (OMAPLFB_DEVINFO*)hDevice; psSwapChain = (OMAPLFB_SWAPCHAIN*)hSwapChain; if (psSwapChain != psDevInfo->psSwapChain) { return (PVRSRV_ERROR_INVALID_PARAMS); } spin_lock_irqsave(&psDevInfo->sSwapChainLock, ulLockFlags); FlushInternalVSyncQueue(psSwapChain); OMAPLFBFlip(psSwapChain, (unsigned long)psDevInfo->sFBInfo.sSysAddr.uiAddr); spin_unlock_irqrestore(&psDevInfo->sSwapChainLock, ulLockFlags); return (PVRSRV_OK); }
static void SetFlushStateInternalNoLock(OMAPLFB_DEVINFO* psDevInfo, OMAP_BOOL bFlushState) { OMAPLFB_SWAPCHAIN *psSwapChain = psDevInfo->psSwapChain; if (psSwapChain == NULL) { return; } if (bFlushState) { if (psSwapChain->ulSetFlushStateRefCount == 0) { psSwapChain->bFlushCommands = OMAP_TRUE; FlushInternalVSyncQueue(psSwapChain); } psSwapChain->ulSetFlushStateRefCount++; } else { if (psSwapChain->ulSetFlushStateRefCount != 0) { psSwapChain->ulSetFlushStateRefCount--; if (psSwapChain->ulSetFlushStateRefCount == 0) { psSwapChain->bFlushCommands = OMAP_FALSE; } } } }
static PVRSRV_ERROR DestroyDCSwapChain(IMG_HANDLE hDevice, IMG_HANDLE hSwapChain) { S3C_SWAPCHAIN *sc = (S3C_SWAPCHAIN *)hSwapChain; S3C_LCD_DEVINFO *psLCDInfo = (S3C_LCD_DEVINFO*)hDevice; if(!hDevice || !hSwapChain) { return PVRSRV_ERROR_INVALID_PARAMS; } FlushInternalVSyncQueue(psLCDInfo); S3C_Flip(psLCDInfo, &psLCDInfo->sSysBuffer); kfree(sc->psBuffer); kfree(sc); if (psLCDInfo->psSwapChain == sc) psLCDInfo->psSwapChain = NULL; ResetVSyncFlipItems(psLCDInfo); S3C_UninstallVsyncISR(); return PVRSRV_OK; }
static PVRSRV_ERROR DestroyDCSwapChain(IMG_HANDLE hDevice, IMG_HANDLE hSwapChain) { OMAPLFB_DEVINFO *psDevInfo; OMAPLFB_SWAPCHAIN *psSwapChain; unsigned long ulLockFlags; OMAP_ERROR eError; if(!hDevice || !hSwapChain) { return (PVRSRV_ERROR_INVALID_PARAMS); } psDevInfo = (OMAPLFB_DEVINFO*)hDevice; psSwapChain = (OMAPLFB_SWAPCHAIN*)hSwapChain; if (psSwapChain != psDevInfo->psSwapChain) { return (PVRSRV_ERROR_INVALID_PARAMS); } eError = DisableLFBEventNotification(psDevInfo); if (eError != OMAP_OK) { printk(KERN_WARNING DRIVER_PREFIX ": Couldn't disable framebuffer event notification\n"); } OMAPLFBFlip(psSwapChain, (unsigned long)psDevInfo->sFBInfo.sSysAddr.uiAddr); cancel_work_sync(&psDevInfo->active_work); INIT_LIST_HEAD(&psDevInfo->active_list); spin_lock_irqsave(&psDevInfo->sSwapChainLock, ulLockFlags); FlushInternalVSyncQueue(psSwapChain); psDevInfo->psSwapChain = NULL; spin_unlock_irqrestore(&psDevInfo->sSwapChainLock, ulLockFlags); OMAPLFBFreeKernelMem(psSwapChain->psVSyncFlips); OMAPLFBFreeKernelMem(psSwapChain->psBuffer); OMAPLFBFreeKernelMem(psSwapChain); return (PVRSRV_OK); }
static IMG_VOID S3CSetState(IMG_HANDLE hDevice, IMG_UINT32 ui32State) { S3C_LCD_DEVINFO *psDevInfo; psDevInfo = (S3C_LCD_DEVINFO*)hDevice; if (ui32State == DC_STATE_FLUSH_COMMANDS) { if (psDevInfo->psSwapChain != 0) { FlushInternalVSyncQueue(psDevInfo); } psDevInfo->bFlushCommands =S3C_TRUE; } else if (ui32State == DC_STATE_NO_FLUSH_COMMANDS) { psDevInfo->bFlushCommands = S3C_FALSE; } }