From 8aeb85d58004f1dd9acfb66ffbb1ff655124ab79 Mon Sep 17 00:00:00 2001 From: Grazvydas Ignotas Date: Sat, 12 May 2012 20:47:28 +0300 Subject: [PATCH] merge omap3 parts from 1.5.15.2766 --- services4/3rdparty/dc_omap3_linux/omaplfb.h | 84 +--- .../dc_omap3_linux/omaplfb_displayclass.c | 214 +++------ .../3rdparty/dc_omap3_linux/omaplfb_linux.c | 289 +++++------- services4/srvkm/devices/sgx/sgxinfokm.h | 1 + services4/system/omap3/sysconfig.c | 187 +++++++- services4/system/omap3/sysconfig.h | 17 +- services4/system/omap3/sysinfo.h | 63 --- services4/system/omap3/syslocal.h | 4 +- services4/system/omap3/sysutils_linux.c | 420 ++++-------------- 9 files changed, 473 insertions(+), 806 deletions(-) diff --git a/services4/3rdparty/dc_omap3_linux/omaplfb.h b/services4/3rdparty/dc_omap3_linux/omaplfb.h index da63959..a0a8369 100644 --- a/services4/3rdparty/dc_omap3_linux/omaplfb.h +++ b/services4/3rdparty/dc_omap3_linux/omaplfb.h @@ -27,44 +27,11 @@ #ifndef __OMAPLFB_H__ #define __OMAPLFB_H__ -extern IMG_BOOL PVRGetDisplayClassJTable(PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable); +#if defined(SGX_EARLYSUSPEND) +#include +#endif -#define OMAPLCD_IRQ 25 - -#define OMAPLCD_SYSCONFIG 0x0410 -#define OMAPLCD_CONFIG 0x0444 -#define OMAPLCD_DEFAULT_COLOR0 0x044C -#define OMAPLCD_TIMING_H 0x0464 -#define OMAPLCD_TIMING_V 0x0468 -#define OMAPLCD_POL_FREQ 0x046C -#define OMAPLCD_DIVISOR 0x0470 -#define OMAPLCD_SIZE_DIG 0x0478 -#define OMAPLCD_SIZE_LCD 0x047C -#define OMAPLCD_GFX_POSITION 0x0488 -#define OMAPLCD_GFX_SIZE 0x048C -#define OMAPLCD_GFX_ATTRIBUTES 0x04a0 -#define OMAPLCD_GFX_FIFO_THRESHOLD 0x04a4 -#define OMAPLCD_GFX_WINDOW_SKIP 0x04b4 - -#define OMAPLCD_IRQSTATUS 0x0418 -#define OMAPLCD_IRQENABLE 0x041c -#define OMAPLCD_CONTROL 0x0440 -#define OMAPLCD_GFX_BA0 0x0480 -#define OMAPLCD_GFX_BA1 0x0484 -#define OMAPLCD_GFX_ROW_INC 0x04ac -#define OMAPLCD_GFX_PIX_INC 0x04b0 -#define OMAPLCD_VID1_BA0 0x04bc -#define OMAPLCD_VID1_BA1 0x04c0 -#define OMAPLCD_VID1_ROW_INC 0x04d8 -#define OMAPLCD_VID1_PIX_INC 0x04dc - -#define OMAP_CONTROL_GODIGITAL (1 << 6) -#define OMAP_CONTROL_GOLCD (1 << 5) -#define OMAP_CONTROL_DIGITALENABLE (1 << 1) -#define OMAP_CONTROL_LCDENABLE (1 << 0) - -#define OMAPLCD_INTMASK_VSYNC (1 << 1) -#define OMAPLCD_INTMASK_OFF 0 +extern IMG_BOOL PVRGetDisplayClassJTable(PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable); typedef void * OMAP_HANDLE; @@ -126,9 +93,6 @@ typedef struct PVRPDP_SWAPCHAIN_TAG unsigned long ulRemoveIndex; - void *pvRegs; - - PVRSRV_DC_DISP2SRV_KMJTABLE *psPVRJTable; @@ -140,8 +104,8 @@ typedef struct PVRPDP_SWAPCHAIN_TAG OMAP_BOOL bBlanked; - - spinlock_t *psSwapChainLock; + + void* pvDevInfo; } OMAPLFB_SWAPCHAIN; typedef struct OMAPLFB_FBINFO_TAG @@ -152,14 +116,16 @@ typedef struct OMAPLFB_FBINFO_TAG unsigned long ulWidth; unsigned long ulHeight; unsigned long ulByteStride; - - IMG_SYS_PHYADDR sSysAddr; IMG_CPU_VIRTADDR sCPUVAddr; - PVRSRV_PIXEL_FORMAT ePixelFormat; + +#if defined(SGX_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + }OMAPLFB_FBINFO; typedef struct OMAPLFB_DEVINFO_TAG @@ -189,30 +155,25 @@ typedef struct OMAPLFB_DEVINFO_TAG struct fb_info *psLINFBInfo; - struct notifier_block sLINNotifBlock; - OMAP_BOOL bDeviceSuspended; - - - spinlock_t sSwapChainLock; - - - + struct mutex sSwapChainLockMutex; IMG_DEV_VIRTADDR sDisplayDevVAddr; DISPLAY_INFO sDisplayInfo; - DISPLAY_FORMAT sDisplayFormat; - DISPLAY_DIMS sDisplayDim; + struct workqueue_struct *vsync_isr_wq; + + struct work_struct vsync_work; + } OMAPLFB_DEVINFO; #define OMAPLFB_PAGE_SIZE 4096 @@ -221,7 +182,7 @@ typedef struct OMAPLFB_DEVINFO_TAG #define OMAPLFB_PAGE_ROUNDUP(x) (((x) + OMAPLFB_PAGE_MASK) & OMAPLFB_PAGE_TRUNC) -#ifdef DEBUG +#ifdef DEBUG_PVR #define DEBUG_PRINTK(x) printk x #else #define DEBUG_PRINTK(x) @@ -261,20 +222,13 @@ void OMAPLFBDriverResume(void); void *OMAPLFBAllocKernelMem(unsigned long ulSize); void OMAPLFBFreeKernelMem(void *pvMem); OMAP_ERROR OMAPLFBGetLibFuncAddr(char *szFunctionName, PFN_DC_GET_PVRJTABLE *ppfnFuncTable); -OMAP_ERROR OMAPLFBInstallVSyncISR (OMAPLFB_SWAPCHAIN *psSwapChain); -OMAP_ERROR OMAPLFBUninstallVSyncISR(OMAPLFB_SWAPCHAIN *psSwapChain); -OMAP_BOOL OMAPLFBVSyncIHandler(OMAPLFB_SWAPCHAIN *psSwapChain); -void OMAPLFBEnableVSyncInterrupt(OMAPLFB_SWAPCHAIN *psSwapChain); -void OMAPLFBDisableVSyncInterrupt(OMAPLFB_SWAPCHAIN *psSwapChain); -#if defined (SUPPORT_TI_DSS_FW) -void OMAPLFBEnableDisplayRegisterAccess(void); -void OMAPLFBDisableDisplayRegisterAccess(void); -#endif +void OMAPLFBWaitForVSync(void); #if defined (CONFIG_OMAP2_DSS) IMG_VOID OMAPLFBFlipDSS2(OMAPLFB_SWAPCHAIN *psSwapChain, IMG_UINT32 aPhyAddr); #endif void OMAPLFBFlip(OMAPLFB_SWAPCHAIN *psSwapChain, unsigned long aPhyAddr); +OMAPLFB_DEVINFO * GetAnchorPtr(void); #endif diff --git a/services4/3rdparty/dc_omap3_linux/omaplfb_displayclass.c b/services4/3rdparty/dc_omap3_linux/omaplfb_displayclass.c index 0e6802d..521de95 100644 --- a/services4/3rdparty/dc_omap3_linux/omaplfb_displayclass.c +++ b/services4/3rdparty/dc_omap3_linux/omaplfb_displayclass.c @@ -31,7 +31,6 @@ #include #include #include -#include #include "img_defs.h" #include "servicesext.h" @@ -42,6 +41,7 @@ #define acquire_console_sem console_lock #define release_console_sem console_unlock #endif + static void *gpvAnchor; static int fb_idx = 0; @@ -49,8 +49,9 @@ static int fb_idx = 0; #define OMAPLFB_COMMAND_COUNT 1 static PFN_DC_GET_PVRJTABLE pfnGetPVRJTable = 0; +static void OMAPLFBVSyncIHandler(struct work_struct*); -static OMAPLFB_DEVINFO * GetAnchorPtr(void) +OMAPLFB_DEVINFO * GetAnchorPtr(void) { return (OMAPLFB_DEVINFO *)gpvAnchor; } @@ -128,7 +129,6 @@ static void SetFlushStateInternalNoLock(OMAPLFB_DEVINFO* psDevInfo, { if (psSwapChain->ulSetFlushStateRefCount == 0) { - OMAPLFBDisableVSyncInterrupt(psSwapChain); psSwapChain->bFlushCommands = OMAP_TRUE; FlushInternalVSyncQueue(psSwapChain); } @@ -142,7 +142,6 @@ static void SetFlushStateInternalNoLock(OMAPLFB_DEVINFO* psDevInfo, if (psSwapChain->ulSetFlushStateRefCount == 0) { psSwapChain->bFlushCommands = OMAP_FALSE; - OMAPLFBEnableVSyncInterrupt(psSwapChain); } } } @@ -151,21 +150,17 @@ static void SetFlushStateInternalNoLock(OMAPLFB_DEVINFO* psDevInfo, static IMG_VOID SetFlushStateInternal(OMAPLFB_DEVINFO* psDevInfo, OMAP_BOOL bFlushState) { - unsigned long ulLockFlags; - - spin_lock_irqsave(&psDevInfo->sSwapChainLock, ulLockFlags); - + mutex_lock(&psDevInfo->sSwapChainLockMutex); + SetFlushStateInternalNoLock(psDevInfo, bFlushState); - spin_unlock_irqrestore(&psDevInfo->sSwapChainLock, ulLockFlags); + mutex_unlock(&psDevInfo->sSwapChainLockMutex); } static void SetFlushStateExternal(OMAPLFB_DEVINFO* psDevInfo, OMAP_BOOL bFlushState) { - unsigned long ulLockFlags; - - spin_lock_irqsave(&psDevInfo->sSwapChainLock, ulLockFlags); + mutex_lock(&psDevInfo->sSwapChainLockMutex); if (psDevInfo->bFlushCommands != bFlushState) @@ -174,7 +169,7 @@ static void SetFlushStateExternal(OMAPLFB_DEVINFO* psDevInfo, SetFlushStateInternalNoLock(psDevInfo, bFlushState); } - spin_unlock_irqrestore(&psDevInfo->sSwapChainLock, ulLockFlags); + mutex_unlock(&psDevInfo->sSwapChainLockMutex); } static IMG_VOID SetDCState(IMG_HANDLE hDevice, IMG_UINT32 ui32State) @@ -242,15 +237,12 @@ static OMAP_ERROR UnblankDisplay(OMAPLFB_DEVINFO *psDevInfo) acquire_console_sem(); res = fb_blank(psDevInfo->psLINFBInfo, 0); release_console_sem(); -#if !defined (CONFIG_OMAP2_DSS) - /* DSS2 returns error if unblank from a non-suspend state */ - if (res != 0) + if (res != 0 && res != -EINVAL) { printk(KERN_WARNING DRIVER_PREFIX ": fb_blank failed (%d)", res); return (OMAP_ERROR_GENERIC); } -#endif return (OMAP_OK); } @@ -527,9 +519,7 @@ static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice, OMAPLFB_VSYNC_FLIP_ITEM *psVSyncFlips; IMG_UINT32 i; PVRSRV_ERROR eError = PVRSRV_ERROR_GENERIC; - unsigned long ulLockFlags; IMG_UINT32 ui32BuffersToSkip; - UNREFERENCED_PARAMETER(ui32OEMFlags); UNREFERENCED_PARAMETER(pui32SwapChainID); @@ -620,8 +610,11 @@ static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice, psSwapChain->ulInsertIndex = 0; psSwapChain->ulRemoveIndex = 0; psSwapChain->psPVRJTable = &psDevInfo->sPVRJTable; - psSwapChain->psSwapChainLock = &psDevInfo->sSwapChainLock; + psSwapChain->pvDevInfo = (void*)psDevInfo; + /* Init the workqueue and its own work */ + INIT_WORK(&psDevInfo->vsync_work, OMAPLFBVSyncIHandler); + psDevInfo->vsync_isr_wq = create_workqueue("pvr_vsync_wq"); for(i=0; isFBInfo.sSysAddr.uiAddr + ui32BufferOffset; psBuffer[i].sCPUVAddr = psDevInfo->sFBInfo.sCPUVAddr + ui32BufferOffset; } - for(i=0; ipvRegs = ioremap(psDevInfo->psLINFBInfo->fix.mmio_start, psDevInfo->psLINFBInfo->fix.mmio_len); - if (psSwapChain->pvRegs == NULL) - { - printk(KERN_WARNING DRIVER_PREFIX ": Couldn't map registers needed for flipping\n"); - goto ErrorDisableDisplayRegisters; - } -#endif - if (OMAPLFBInstallVSyncISR(psSwapChain) != OMAP_OK) - { - printk(KERN_WARNING DRIVER_PREFIX ": ISR handler failed to register\n"); - goto ErrorUnmapRegisters; - } - - spin_lock_irqsave(&psDevInfo->sSwapChainLock, ulLockFlags); + mutex_lock(&psDevInfo->sSwapChainLockMutex); - psDevInfo->psSwapChain = psSwapChain; - psSwapChain->bFlushCommands = psDevInfo->bFlushCommands; @@ -682,15 +655,14 @@ static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice, else { psSwapChain->ulSetFlushStateRefCount = 0; - OMAPLFBEnableVSyncInterrupt(psSwapChain); } - spin_unlock_irqrestore(&psDevInfo->sSwapChainLock, ulLockFlags); + mutex_unlock(&psDevInfo->sSwapChainLockMutex); if (EnableLFBEventNotification(psDevInfo)!= OMAP_OK) { printk(KERN_WARNING DRIVER_PREFIX ": Couldn't enable framebuffer event notification\n"); - goto ErrorUninstallVSyncInterrupt; + goto ErrorDisableDisplayRegisters; } @@ -698,17 +670,7 @@ static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice, return (PVRSRV_OK); -ErrorUninstallVSyncInterrupt: - if(OMAPLFBUninstallVSyncISR(psSwapChain) != OMAP_OK) - { - printk(KERN_WARNING DRIVER_PREFIX ": Couldn't uninstall VSync ISR\n"); - } -ErrorUnmapRegisters: -#if defined (SUPPORT_TI_DSS_FW) - iounmap(psSwapChain->pvRegs); ErrorDisableDisplayRegisters: - OMAPLFBDisableDisplayRegisterAccess(); -#endif OMAPLFBFreeKernelMem(psVSyncFlips); ErrorFreeBuffers: OMAPLFBFreeKernelMem(psBuffer); @@ -723,7 +685,6 @@ static PVRSRV_ERROR DestroyDCSwapChain(IMG_HANDLE hDevice, { OMAPLFB_DEVINFO *psDevInfo; OMAPLFB_SWAPCHAIN *psSwapChain; - unsigned long ulLockFlags; OMAP_ERROR eError; @@ -745,33 +706,19 @@ static PVRSRV_ERROR DestroyDCSwapChain(IMG_HANDLE hDevice, printk(KERN_WARNING DRIVER_PREFIX ": Couldn't disable framebuffer event notification\n"); } - spin_lock_irqsave(&psDevInfo->sSwapChainLock, ulLockFlags); - - OMAPLFBDisableVSyncInterrupt(psSwapChain); - + mutex_lock(&psDevInfo->sSwapChainLockMutex); FlushInternalVSyncQueue(psSwapChain); - OMAPLFBFlip(psSwapChain, (unsigned long)psDevInfo->sFBInfo.sSysAddr.uiAddr); - psDevInfo->psSwapChain = NULL; + + mutex_unlock(&psDevInfo->sSwapChainLockMutex); - spin_unlock_irqrestore(&psDevInfo->sSwapChainLock, ulLockFlags); - - if(OMAPLFBUninstallVSyncISR(psSwapChain) != OMAP_OK) - { - printk(KERN_WARNING DRIVER_PREFIX ": Couldn't uninstall VSync ISR\n"); - return (PVRSRV_ERROR_GENERIC); - } - -#if defined (SUPPORT_TI_DSS_FW) - - iounmap(psSwapChain->pvRegs); - - OMAPLFBDisableDisplayRegisterAccess(); -#endif + /* Destroy the workqueue */ + flush_workqueue(psDevInfo->vsync_isr_wq); + destroy_workqueue(psDevInfo->vsync_isr_wq); OMAPLFBFreeKernelMem(psSwapChain->psVSyncFlips); OMAPLFBFreeKernelMem(psSwapChain->psBuffer); @@ -900,7 +847,6 @@ static PVRSRV_ERROR SwapToDCSystem(IMG_HANDLE hDevice, { OMAPLFB_DEVINFO *psDevInfo; OMAPLFB_SWAPCHAIN *psSwapChain; - unsigned long ulLockFlags; if(!hDevice || !hSwapChain) { @@ -914,36 +860,35 @@ static PVRSRV_ERROR SwapToDCSystem(IMG_HANDLE hDevice, return (PVRSRV_ERROR_INVALID_PARAMS); } - spin_lock_irqsave(&psDevInfo->sSwapChainLock, ulLockFlags); - + mutex_lock(&psDevInfo->sSwapChainLockMutex); FlushInternalVSyncQueue(psSwapChain); - OMAPLFBFlip(psSwapChain, (unsigned long)psDevInfo->sFBInfo.sSysAddr.uiAddr); - spin_unlock_irqrestore(&psDevInfo->sSwapChainLock, ulLockFlags); + mutex_unlock(&psDevInfo->sSwapChainLockMutex); return (PVRSRV_OK); } -OMAP_BOOL OMAPLFBVSyncIHandler(OMAPLFB_SWAPCHAIN *psSwapChain) +static void OMAPLFBVSyncIHandler(struct work_struct *work) { - OMAP_BOOL bStatus = OMAP_FALSE; + OMAPLFB_DEVINFO *psDevInfo = container_of(work, OMAPLFB_DEVINFO, vsync_work); OMAPLFB_VSYNC_FLIP_ITEM *psFlipItem; + OMAPLFB_SWAPCHAIN *psSwapChain; unsigned long ulMaxIndex; - unsigned long ulLockFlags; - psFlipItem = &psSwapChain->psVSyncFlips[psSwapChain->ulRemoveIndex]; - ulMaxIndex = psSwapChain->ulBufferCount - 1; + mutex_lock(&psDevInfo->sSwapChainLockMutex); - spin_lock_irqsave(psSwapChain->psSwapChainLock, ulLockFlags); + psSwapChain = psDevInfo->psSwapChain; + if (!psSwapChain || psSwapChain->bFlushCommands) + goto ExitUnlock; + psFlipItem = &psSwapChain->psVSyncFlips[psSwapChain->ulRemoveIndex]; + ulMaxIndex = psSwapChain->ulBufferCount - 1; - if (psSwapChain->bFlushCommands) - { - goto ExitUnlock; - } + /* VSync with the display here */ + OMAPLFBWaitForVSync(); while(psFlipItem->bValid) { @@ -983,30 +928,33 @@ OMAP_BOOL OMAPLFBVSyncIHandler(OMAPLFB_SWAPCHAIN *psSwapChain) } else { - - break; + queue_work(psDevInfo->vsync_isr_wq, &psDevInfo->vsync_work); + goto ExitUnlock; } } else { OMAPLFBFlip(psSwapChain, (unsigned long)psFlipItem->sSysAddr); - - + psFlipItem->bFlipped = OMAP_TRUE; - - - break; + + /* + * If the flip has been presented here then we need in the next + * VSYNC execute the command complete, schedule another work + */ + queue_work(psDevInfo->vsync_isr_wq, &psDevInfo->vsync_work); + + goto ExitUnlock; } psFlipItem = &psSwapChain->psVSyncFlips[psSwapChain->ulRemoveIndex]; } - + ExitUnlock: - spin_unlock_irqrestore(psSwapChain->psSwapChainLock, ulLockFlags); + mutex_unlock(&psDevInfo->sSwapChainLockMutex); - return bStatus; } static IMG_BOOL ProcessFlip(IMG_HANDLE hCmdCookie, @@ -1020,8 +968,6 @@ static IMG_BOOL ProcessFlip(IMG_HANDLE hCmdCookie, #if defined(SYS_USING_INTERRUPTS) OMAPLFB_VSYNC_FLIP_ITEM* psFlipItem; #endif - unsigned long ulLockFlags; - if(!hCmdCookie || !pvData) { @@ -1042,8 +988,7 @@ static IMG_BOOL ProcessFlip(IMG_HANDLE hCmdCookie, psBuffer = (OMAPLFB_BUFFER*)psFlipCmd->hExtBuffer; psSwapChain = (OMAPLFB_SWAPCHAIN*) psFlipCmd->hExtSwapChain; - spin_lock_irqsave(&psDevInfo->sSwapChainLock, ulLockFlags); - + mutex_lock(&psDevInfo->sSwapChainLockMutex); if (psDevInfo->bDeviceSuspended) { @@ -1075,7 +1020,7 @@ static IMG_BOOL ProcessFlip(IMG_HANDLE hCmdCookie, if(psSwapChain->ulInsertIndex == psSwapChain->ulRemoveIndex) { - + /* If both indexes are equal the queue is empty, present immediatly */ OMAPLFBFlip(psSwapChain, (unsigned long)psBuffer->sSysAddr.uiAddr); psFlipItem->bFlipped = OMAP_TRUE; @@ -1085,6 +1030,7 @@ static IMG_BOOL ProcessFlip(IMG_HANDLE hCmdCookie, psFlipItem->bFlipped = OMAP_FALSE; } + /* The buffer is queued here, must be consumed by the VSYNC workqueue */ psFlipItem->hCmdComplete = (OMAP_HANDLE)hCmdCookie; psFlipItem->ulSwapInterval = (unsigned long)psFlipCmd->ui32SwapInterval; psFlipItem->sSysAddr = &psBuffer->sSysAddr; @@ -1096,15 +1042,19 @@ static IMG_BOOL ProcessFlip(IMG_HANDLE hCmdCookie, psSwapChain->ulInsertIndex = 0; } + /* Give work to the workqueue to sync with the display */ + queue_work(psDevInfo->vsync_isr_wq, &psDevInfo->vsync_work); + goto ExitTrueUnlock; } - spin_unlock_irqrestore(&psDevInfo->sSwapChainLock, ulLockFlags); + mutex_unlock(&psDevInfo->sSwapChainLockMutex); + return IMG_FALSE; #endif ExitTrueUnlock: - spin_unlock_irqrestore(&psDevInfo->sSwapChainLock, ulLockFlags); + mutex_unlock(&psDevInfo->sSwapChainLockMutex); return IMG_TRUE; } @@ -1183,26 +1133,19 @@ static OMAP_ERROR InitDev(OMAPLFB_DEVINFO *psDevInfo) psPVRFBInfo->sSysAddr.uiAddr = psLINFBInfo->fix.smem_start; psPVRFBInfo->sCPUVAddr = psLINFBInfo->screen_base; - if ((psLINFBInfo->var.rotate == FB_ROTATE_CW) - || (psLINFBInfo->var.rotate == FB_ROTATE_CCW) ) { - psPVRFBInfo->ulWidth = psLINFBInfo->var.yres; - psPVRFBInfo->ulHeight = psLINFBInfo->var.xres; - } else { + psPVRFBInfo->ulWidth = psLINFBInfo->var.xres; psPVRFBInfo->ulHeight = psLINFBInfo->var.yres; - } - psPVRFBInfo->ulByteStride = psLINFBInfo->fix.line_length; psPVRFBInfo->ulFBSize = FBSize; psPVRFBInfo->ulBufferSize = psPVRFBInfo->ulHeight * psPVRFBInfo->ulByteStride; - - -#ifdef CONFIG_OMAP2_DSS +#ifdef CONFIG_OMAP2_DSS psPVRFBInfo->ulRoundedBufferSize = psPVRFBInfo->ulBufferSize; #else psPVRFBInfo->ulRoundedBufferSize = OMAPLFB_PAGE_ROUNDUP(psPVRFBInfo->ulBufferSize); #endif + if(psLINFBInfo->var.bits_per_pixel == 16) { if((psLINFBInfo->var.red.length == 5) && @@ -1230,7 +1173,6 @@ static OMAP_ERROR InitDev(OMAPLFB_DEVINFO *psDevInfo) (psLINFBInfo->var.blue.offset == 0) && (psLINFBInfo->var.red.msb_right == 0)) { - printk ("PVRSRV_PIXEL_FORMAT_ARGB8888\n"); psPVRFBInfo->ePixelFormat = PVRSRV_PIXEL_FORMAT_ARGB8888; } else @@ -1324,8 +1266,7 @@ OMAP_ERROR OMAPLFBInit(void) return (OMAP_ERROR_INIT_FAILURE); } - - spin_lock_init(&psDevInfo->sSwapChainLock); + mutex_init(&psDevInfo->sSwapChainLockMutex); psDevInfo->psSwapChain = 0; psDevInfo->bFlushCommands = OMAP_FALSE; @@ -1333,11 +1274,10 @@ OMAP_ERROR OMAPLFBInit(void) psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers = (IMG_UINT32)(psDevInfo->sFBInfo.ulFBSize / psDevInfo->sFBInfo.ulRoundedBufferSize); #if !defined (SUPPORT_TI_DSS_FW) - /* DSS2 have trouble with ui32MaxSwapChainBuffers > 3 */ + /* Limiting the ui32MaxSwapChainBuffers to 3 */ if (psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers > 3) psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers = 3; #endif - if (psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers == 0) { psDevInfo->sDisplayInfo.ui32MaxSwapChains = 0; @@ -1394,8 +1334,7 @@ OMAP_ERROR OMAPLFBInit(void) { return (OMAP_ERROR_DEVICE_REGISTER_FAILED); } - - + pfnCmdProcList[DC_FLIP_COMMAND] = ProcessFlip; @@ -1456,7 +1395,7 @@ OMAP_ERROR OMAPLFBDeinit(void) { return (OMAP_ERROR_GENERIC); } - + DeInitDev(psDevInfo); @@ -1475,9 +1414,8 @@ OMAP_ERROR OMAPLFBDeinit(void) void OMAPLFBDriverSuspend(void) { OMAPLFB_DEVINFO *psDevInfo = GetAnchorPtr(); - unsigned long ulLockFlags; - spin_lock_irqsave(&psDevInfo->sSwapChainLock, ulLockFlags); + mutex_lock(&psDevInfo->sSwapChainLockMutex); if (psDevInfo->bDeviceSuspended) { @@ -1488,44 +1426,30 @@ void OMAPLFBDriverSuspend(void) SetFlushStateInternalNoLock(psDevInfo, OMAP_TRUE); - spin_unlock_irqrestore(&psDevInfo->sSwapChainLock, ulLockFlags); - + mutex_unlock(&psDevInfo->sSwapChainLockMutex); -#if defined (SUPPORT_TI_DSS_FW) - if (psDevInfo->psSwapChain != NULL) - { - OMAPLFBDisableDisplayRegisterAccess(); - } -#endif return; ExitUnlock: - spin_unlock_irqrestore(&psDevInfo->sSwapChainLock, ulLockFlags); + mutex_unlock(&psDevInfo->sSwapChainLockMutex); } void OMAPLFBDriverResume(void) { OMAPLFB_DEVINFO *psDevInfo = GetAnchorPtr(); - unsigned long ulLockFlags; if (psDevInfo->bDeviceSuspended == OMAP_FALSE) { return; } -#if defined (SUPPORT_TI_DSS_FW) - if (psDevInfo->psSwapChain != NULL) - { - OMAPLFBEnableDisplayRegisterAccess(); - } -#endif - spin_lock_irqsave(&psDevInfo->sSwapChainLock, ulLockFlags); + mutex_lock(&psDevInfo->sSwapChainLockMutex); SetFlushStateInternalNoLock(psDevInfo, OMAP_FALSE); psDevInfo->bDeviceSuspended = OMAP_FALSE; - spin_unlock_irqrestore(&psDevInfo->sSwapChainLock, ulLockFlags); + mutex_unlock(&psDevInfo->sSwapChainLockMutex); } #endif diff --git a/services4/3rdparty/dc_omap3_linux/omaplfb_linux.c b/services4/3rdparty/dc_omap3_linux/omaplfb_linux.c index 61a3686..4a80f1c 100644 --- a/services4/3rdparty/dc_omap3_linux/omaplfb_linux.c +++ b/services4/3rdparty/dc_omap3_linux/omaplfb_linux.c @@ -31,45 +31,31 @@ #include #include -#include -#include -#include -#include -#include +#include +#include + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,29)) +#include +#else +#include +#endif +#include <../drivers/video/omap2/omapfb/omapfb.h> #if defined(LDM_PLATFORM) #include #endif -#if defined (SUPPORT_TI_DSS_FW) #include -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26)) -#include -#else -#include -#endif -#else -#if !defined (CONFIG_OMAP2_DSS) -#define DISPC_IRQ_VSYNC 0x0002 -extern int omap_dispc_request_irq(unsigned long, void (*)(void *), void *); -extern void omap_dispc_free_irq(unsigned long, void (*)(void *), void *); -extern void omap_dispc_set_plane_base(int plane, IMG_UINT32 phys_addr); -#else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)) #include