/* * Android specific, driver is requested to be suspended * in: ea_event */ static void OMAPLFBDriverSuspend_Entry(struct early_suspend *ea_event) { DEBUG_PRINTK("Requested driver suspend"); OMAPLFBCommonSuspend(); }
/* * Android specific, driver is requested to be suspended * in: ea_event */ static void OMAPLFBDriverResume_Entry(struct early_suspend *ea_event) { DEBUG_PRINTK("Requested driver resume"); OMAPLFBDriverResume(); bDeviceSuspended = OMAP_FALSE; }
OMAP_ERROR OMAPLFBInit(void) { OMAPLFB_DEVINFO *psDevInfo; psDevInfo = GetAnchorPtr(); if (psDevInfo == NULL) { PFN_CMD_PROC pfnCmdProcList[OMAPLFB_COMMAND_COUNT]; IMG_UINT32 aui32SyncCountList[OMAPLFB_COMMAND_COUNT][2]; psDevInfo = (OMAPLFB_DEVINFO *)OMAPLFBAllocKernelMem(sizeof(OMAPLFB_DEVINFO)); if(!psDevInfo) { return (OMAP_ERROR_OUT_OF_MEMORY); } memset(psDevInfo, 0, sizeof(OMAPLFB_DEVINFO)); SetAnchorPtr((void*)psDevInfo); psDevInfo->ulRefCount = 0; if(InitDev(psDevInfo) != OMAP_OK) { return (OMAP_ERROR_INIT_FAILURE); } if(OMAPLFBGetLibFuncAddr ("PVRGetDisplayClassJTable", &pfnGetPVRJTable) != OMAP_OK) { return (OMAP_ERROR_INIT_FAILURE); } if(!(*pfnGetPVRJTable)(&psDevInfo->sPVRJTable)) { return (OMAP_ERROR_INIT_FAILURE); } spin_lock_init(&psDevInfo->sSwapChainLock); psDevInfo->psSwapChain = 0; psDevInfo->bFlushCommands = OMAP_FALSE; psDevInfo->bDeviceSuspended = OMAP_FALSE; psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers = (IMG_UINT32)(psDevInfo->sFBInfo.ulFBSize / psDevInfo->sFBInfo.ulRoundedBufferSize); if (psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers == 0) { psDevInfo->sDisplayInfo.ui32MaxSwapChains = 0; psDevInfo->sDisplayInfo.ui32MaxSwapInterval = 0; } else { psDevInfo->sDisplayInfo.ui32MaxSwapChains = 1; psDevInfo->sDisplayInfo.ui32MaxSwapInterval = 3; } psDevInfo->sDisplayInfo.ui32MinSwapInterval = 0; strncpy(psDevInfo->sDisplayInfo.szDisplayName, DISPLAY_DEVICE_NAME, MAX_DISPLAY_NAME_SIZE); psDevInfo->sDisplayFormat.pixelformat = psDevInfo->sFBInfo.ePixelFormat; psDevInfo->sDisplayDim.ui32Width = (IMG_UINT32)psDevInfo->sFBInfo.ulWidth; psDevInfo->sDisplayDim.ui32Height = (IMG_UINT32)psDevInfo->sFBInfo.ulHeight; psDevInfo->sDisplayDim.ui32ByteStride = (IMG_UINT32)psDevInfo->sFBInfo.ulByteStride; DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Maximum number of swap chain buffers: %lu\n", psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers)); psDevInfo->sSystemBuffer.sSysAddr = psDevInfo->sFBInfo.sSysAddr; psDevInfo->sSystemBuffer.sCPUVAddr = psDevInfo->sFBInfo.sCPUVAddr; psDevInfo->sSystemBuffer.ulBufferSize = psDevInfo->sFBInfo.ulRoundedBufferSize; psDevInfo->sDCJTable.ui32TableSize = sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE); psDevInfo->sDCJTable.pfnOpenDCDevice = OpenDCDevice; psDevInfo->sDCJTable.pfnCloseDCDevice = CloseDCDevice; psDevInfo->sDCJTable.pfnEnumDCFormats = EnumDCFormats; psDevInfo->sDCJTable.pfnEnumDCDims = EnumDCDims; psDevInfo->sDCJTable.pfnGetDCSystemBuffer = GetDCSystemBuffer; psDevInfo->sDCJTable.pfnGetDCInfo = GetDCInfo; psDevInfo->sDCJTable.pfnGetBufferAddr = GetDCBufferAddr; psDevInfo->sDCJTable.pfnCreateDCSwapChain = CreateDCSwapChain; psDevInfo->sDCJTable.pfnDestroyDCSwapChain = DestroyDCSwapChain; psDevInfo->sDCJTable.pfnSetDCDstRect = SetDCDstRect; psDevInfo->sDCJTable.pfnSetDCSrcRect = SetDCSrcRect; psDevInfo->sDCJTable.pfnSetDCDstColourKey = SetDCDstColourKey; psDevInfo->sDCJTable.pfnSetDCSrcColourKey = SetDCSrcColourKey; psDevInfo->sDCJTable.pfnGetDCBuffers = GetDCBuffers; psDevInfo->sDCJTable.pfnSwapToDCBuffer = SwapToDCBuffer; psDevInfo->sDCJTable.pfnSwapToDCSystem = SwapToDCSystem; psDevInfo->sDCJTable.pfnSetDCState = SetDCState; if(psDevInfo->sPVRJTable.pfnPVRSRVRegisterDCDevice ( &psDevInfo->sDCJTable, &psDevInfo->ulDeviceID ) != PVRSRV_OK) { return (OMAP_ERROR_DEVICE_REGISTER_FAILED); } pfnCmdProcList[DC_FLIP_COMMAND] = ProcessFlip; aui32SyncCountList[DC_FLIP_COMMAND][0] = 0; aui32SyncCountList[DC_FLIP_COMMAND][1] = 2; if (psDevInfo->sPVRJTable.pfnPVRSRVRegisterCmdProcList (psDevInfo->ulDeviceID, &pfnCmdProcList[0], aui32SyncCountList, OMAPLFB_COMMAND_COUNT) != PVRSRV_OK) { printk(KERN_WARNING DRIVER_PREFIX ": Can't register callback\n"); return (OMAP_ERROR_CANT_REGISTER_CALLBACK); } } psDevInfo->ulRefCount++; return (OMAP_OK); }
/* * Function called when the driver is requested to release * in: pDevice */ static void OMAPLFBDeviceRelease_Entry(struct device unref__ *pDevice) { DEBUG_PRINTK("Requested driver release"); OMAPLFBCommonSuspend(); }
static OMAPLFB_DEVINFO *OMAPLFBInitDev(unsigned uiFBDevID) { PFN_CMD_PROC pfnCmdProcList[OMAPLFB_COMMAND_COUNT]; IMG_UINT32 aui32SyncCountList[OMAPLFB_COMMAND_COUNT][2]; OMAPLFB_DEVINFO *psDevInfo = NULL; psDevInfo = (OMAPLFB_DEVINFO *)OMAPLFBAllocKernelMem(sizeof(OMAPLFB_DEVINFO)); if(psDevInfo == NULL) { printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: Couldn't allocate device information structure\n", __FUNCTION__, uiFBDevID); goto ErrorExit; } memset(psDevInfo, 0, sizeof(OMAPLFB_DEVINFO)); psDevInfo->uiFBDevID = uiFBDevID; if(!(*gpfnGetPVRJTable)(&psDevInfo->sPVRJTable)) { goto ErrorFreeDevInfo; } if(OMAPLFBInitFBDev(psDevInfo) != OMAPLFB_OK) { goto ErrorFreeDevInfo; } psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers = (IMG_UINT32)(psDevInfo->sFBInfo.ulFBSize / psDevInfo->sFBInfo.ulRoundedBufferSize); if (psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers != 0) { psDevInfo->sDisplayInfo.ui32MaxSwapChains = 1; psDevInfo->sDisplayInfo.ui32MaxSwapInterval = 1; } psDevInfo->sDisplayInfo.ui32PhysicalWidthmm = psDevInfo->sFBInfo.ulPhysicalWidthmm; psDevInfo->sDisplayInfo.ui32PhysicalHeightmm = psDevInfo->sFBInfo.ulPhysicalHeightmm; strncpy(psDevInfo->sDisplayInfo.szDisplayName, DISPLAY_DEVICE_NAME, MAX_DISPLAY_NAME_SIZE); psDevInfo->sDisplayFormat.pixelformat = psDevInfo->sFBInfo.ePixelFormat; psDevInfo->sDisplayDim.ui32Width = (IMG_UINT32)psDevInfo->sFBInfo.ulWidth; psDevInfo->sDisplayDim.ui32Height = (IMG_UINT32)psDevInfo->sFBInfo.ulHeight; psDevInfo->sDisplayDim.ui32ByteStride = (IMG_UINT32)psDevInfo->sFBInfo.ulByteStride; DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Maximum number of swap chain buffers: %u\n", psDevInfo->uiFBDevID, psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers)); psDevInfo->sSystemBuffer.sSysAddr = psDevInfo->sFBInfo.sSysAddr; psDevInfo->sSystemBuffer.sCPUVAddr = psDevInfo->sFBInfo.sCPUVAddr; psDevInfo->sSystemBuffer.psDevInfo = psDevInfo; OMAPLFBInitBufferForSwap(&psDevInfo->sSystemBuffer); psDevInfo->sDCJTable.ui32TableSize = sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE); psDevInfo->sDCJTable.pfnOpenDCDevice = OpenDCDevice; psDevInfo->sDCJTable.pfnCloseDCDevice = CloseDCDevice; psDevInfo->sDCJTable.pfnEnumDCFormats = EnumDCFormats; psDevInfo->sDCJTable.pfnEnumDCDims = EnumDCDims; psDevInfo->sDCJTable.pfnGetDCSystemBuffer = GetDCSystemBuffer; psDevInfo->sDCJTable.pfnGetDCInfo = GetDCInfo; psDevInfo->sDCJTable.pfnGetBufferAddr = GetDCBufferAddr; psDevInfo->sDCJTable.pfnCreateDCSwapChain = CreateDCSwapChain; psDevInfo->sDCJTable.pfnDestroyDCSwapChain = DestroyDCSwapChain; psDevInfo->sDCJTable.pfnSetDCDstRect = SetDCDstRect; psDevInfo->sDCJTable.pfnSetDCSrcRect = SetDCSrcRect; psDevInfo->sDCJTable.pfnSetDCDstColourKey = SetDCDstColourKey; psDevInfo->sDCJTable.pfnSetDCSrcColourKey = SetDCSrcColourKey; psDevInfo->sDCJTable.pfnGetDCBuffers = GetDCBuffers; psDevInfo->sDCJTable.pfnSwapToDCBuffer = SwapToDCBuffer; psDevInfo->sDCJTable.pfnSwapToDCSystem = SwapToDCSystem; psDevInfo->sDCJTable.pfnSetDCState = SetDCState; if(psDevInfo->sPVRJTable.pfnPVRSRVRegisterDCDevice( &psDevInfo->sDCJTable, &psDevInfo->uiPVRDevID) != PVRSRV_OK) { printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: PVR Services device registration failed\n", __FUNCTION__, uiFBDevID); goto ErrorDeInitFBDev; } DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: PVR Device ID: %u\n", psDevInfo->uiFBDevID, psDevInfo->uiPVRDevID)); pfnCmdProcList[DC_FLIP_COMMAND] = ProcessFlip; aui32SyncCountList[DC_FLIP_COMMAND][0] = 0; aui32SyncCountList[DC_FLIP_COMMAND][1] = 2; if (psDevInfo->sPVRJTable.pfnPVRSRVRegisterCmdProcList(psDevInfo->uiPVRDevID, &pfnCmdProcList[0], aui32SyncCountList, OMAPLFB_COMMAND_COUNT) != PVRSRV_OK) { printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: Couldn't register command processing functions with PVR Services\n", __FUNCTION__, uiFBDevID); goto ErrorUnregisterDevice; } OMAPLFBCreateSwapChainLockInit(psDevInfo); OMAPLFBAtomicBoolInit(&psDevInfo->sBlanked, OMAPLFB_FALSE); OMAPLFBAtomicIntInit(&psDevInfo->sBlankEvents, 0); OMAPLFBAtomicBoolInit(&psDevInfo->sFlushCommands, OMAPLFB_FALSE); #if defined(CONFIG_HAS_EARLYSUSPEND) OMAPLFBAtomicBoolInit(&psDevInfo->sEarlySuspendFlag, OMAPLFB_FALSE); #endif #if defined(SUPPORT_DRI_DRM) OMAPLFBAtomicBoolInit(&psDevInfo->sLeaveVT, OMAPLFB_FALSE); #endif return psDevInfo; ErrorUnregisterDevice: (void)psDevInfo->sPVRJTable.pfnPVRSRVRemoveDCDevice(psDevInfo->uiPVRDevID); ErrorDeInitFBDev: OMAPLFBDeInitFBDev(psDevInfo); ErrorFreeDevInfo: OMAPLFBFreeKernelMem(psDevInfo); ErrorExit: return NULL; }
static OMAP_ERROR InitDev(OMAPLFB_DEVINFO *psDevInfo) { struct fb_info *psLINFBInfo; struct module *psLINFBOwner; OMAPLFB_FBINFO *psPVRFBInfo = &psDevInfo->sFBInfo; OMAP_ERROR eError = OMAP_ERROR_GENERIC; unsigned long FBSize; acquire_console_sem(); if (fb_idx < 0 || fb_idx >= num_registered_fb) { pr_err("%d %d\n", fb_idx, num_registered_fb); eError = OMAP_ERROR_INVALID_DEVICE; goto errRelSem; } psLINFBInfo = registered_fb[fb_idx]; psLINFBOwner = psLINFBInfo->fbops->owner; if (!try_module_get(psLINFBOwner)) { printk(KERN_INFO DRIVER_PREFIX ": Couldn't get framebuffer module\n"); goto errRelSem; } if (psLINFBInfo->fbops->fb_open != NULL) { int res; res = psLINFBInfo->fbops->fb_open(psLINFBInfo, 0); if (res != 0) { printk(KERN_INFO DRIVER_PREFIX ": Couldn't open framebuffer: %d\n", res); goto errModPut; } } psDevInfo->psLINFBInfo = psLINFBInfo; FBSize = (psLINFBInfo->screen_size) != 0 ? psLINFBInfo->screen_size : psLINFBInfo->fix.smem_len; DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Framebuffer physical address: 0x%lx\n", psLINFBInfo->fix.smem_start)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Framebuffer virtual address: 0x%lx\n", (unsigned long)psLINFBInfo->screen_base)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Framebuffer size: %lu\n", FBSize)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Framebuffer virtual width: %u\n", psLINFBInfo->var.xres_virtual)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Framebuffer virtual height: %u\n", psLINFBInfo->var.yres_virtual)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Framebuffer width: %u\n", psLINFBInfo->var.xres)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Framebuffer height: %u\n", psLINFBInfo->var.yres)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Framebuffer stride: %u\n", psLINFBInfo->fix.line_length)); psPVRFBInfo->sSysAddr.uiAddr = psLINFBInfo->fix.smem_start; psPVRFBInfo->sCPUVAddr = psLINFBInfo->screen_base; 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; psPVRFBInfo->ulRoundedBufferSize = OMAPLFB_PAGE_ROUNDUP(psPVRFBInfo->ulBufferSize); if(psLINFBInfo->var.bits_per_pixel == 16) { if((psLINFBInfo->var.red.length == 5) && (psLINFBInfo->var.green.length == 6) && (psLINFBInfo->var.blue.length == 5) && (psLINFBInfo->var.red.offset == 11) && (psLINFBInfo->var.green.offset == 5) && (psLINFBInfo->var.blue.offset == 0) && (psLINFBInfo->var.red.msb_right == 0)) { psPVRFBInfo->ePixelFormat = PVRSRV_PIXEL_FORMAT_RGB565; } else { printk("Unknown FB format\n"); } } else if(psLINFBInfo->var.bits_per_pixel == 32) { if((psLINFBInfo->var.red.length == 8) && (psLINFBInfo->var.green.length == 8) && (psLINFBInfo->var.blue.length == 8) && (psLINFBInfo->var.red.offset == 16) && (psLINFBInfo->var.green.offset == 8) && (psLINFBInfo->var.blue.offset == 0) && (psLINFBInfo->var.red.msb_right == 0)) { psPVRFBInfo->ePixelFormat = PVRSRV_PIXEL_FORMAT_ARGB8888; } else { printk("Unknown FB format\n"); } } else { printk("Unknown FB format\n"); } psDevInfo->sFBInfo.sSysAddr.uiAddr = psPVRFBInfo->sSysAddr.uiAddr; psDevInfo->sFBInfo.sCPUVAddr = psPVRFBInfo->sCPUVAddr; mutex_init(&psDevInfo->active_list_lock); INIT_LIST_HEAD(&psDevInfo->active_list); INIT_WORK(&psDevInfo->active_work, active_worker); psDevInfo->workq = create_workqueue("pvrflip"); OMAPLFBDisplayInit(); eError = OMAP_OK; goto errRelSem; errModPut: module_put(psLINFBOwner); errRelSem: release_console_sem(); return eError; }
static void OMAPLFBDriverShutdown_Entry(struct platform_device unref__ * pDevice) { DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": OMAPLFBDriverShutdown_Entry\n")); }
/* Set display update mode */ OMAPLFB_BOOL OMAPLFBSetUpdateMode(OMAPLFB_DEVINFO *psDevInfo, OMAPLFB_UPDATE_MODE eMode) { #if 0 #if defined(PVR_OMAPLFB_DRM_FB) struct drm_connector *psConnector; enum omap_dss_update_mode eDSSMode; OMAPLFB_BOOL bSuccess = OMAPLFB_FALSE; OMAPLFB_BOOL bFailure = OMAPLFB_FALSE; if (!OMAPLFBValidateUpdateMode(eMode)) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Unknown update mode (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, (int)eMode)); return OMAPLFB_FALSE; } eDSSMode = OMAPLFBToDSSUpdateMode(eMode); for (psConnector = NULL; (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL;) { int iRes = omap_connector_set_update_mode(psConnector, eDSSMode); OMAPLFB_BOOL bRes = (iRes == 0); bSuccess |= bRes; bFailure |= !bRes; } if (!bFailure) { if (!bSuccess) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: No screens\n", __FUNCTION__, psDevInfo->uiFBDevID)); } return OMAPLFB_TRUE; } if (!bSuccess) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Couldn't set %s for any screen\n", __FUNCTION__, psDevInfo->uiFBDevID, OMAPLFBUpdateModeToString(eMode))); return OMAPLFB_FALSE; } if (eMode == OMAPLFB_UPDATE_MODE_AUTO) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Couldn't set %s for all screens\n", __FUNCTION__, psDevInfo->uiFBDevID, OMAPLFBUpdateModeToString(eMode))); return OMAPLFB_FALSE; } DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": %s: Device %u: %s set for some screens\n", __FUNCTION__, psDevInfo->uiFBDevID, OMAPLFBUpdateModeToString(eMode))); return OMAPLFB_TRUE; #else /* defined(PVR_OMAPLFB_DRM_FB) */ struct omap_dss_device *psDSSDev = fb2display(psDevInfo->psLINFBInfo); OMAP_DSS_DRIVER(psDSSDrv, psDSSDev); enum omap_dss_update_mode eDSSMode; int res; if (psDSSDrv == NULL || psDSSDrv->set_update_mode == NULL) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Can't set update mode\n", __FUNCTION__, psDevInfo->uiFBDevID)); return OMAPLFB_FALSE; } if (!OMAPLFBValidateUpdateMode(eMode)) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Unknown update mode (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, (int)eMode)); return OMAPLFB_FALSE; } eDSSMode = OMAPLFBToDSSUpdateMode(eMode); res = psDSSDrv->set_update_mode(psDSSDev, eDSSMode); if (res != 0) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: set_update_mode (%s) failed (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, OMAPLFBDSSUpdateModeToString(eDSSMode), res)); } return (res == 0); #endif /* defined(PVR_OMAPLFB_DRM_FB) */ #endif return 1; }
static void OMAPLFBDeviceRelease_Entry(struct device unref__ * pDevice) { DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": OMAPLFBDriverRelease_Entry\n")); }
static int OMAPLFBDriverResume_Entry(struct platform_device unref__ * pDevice) { DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": OMAPLFBDriverResume_Entry\n")); return 0; }
OMAPLFB_UPDATE_MODE OMAPLFBGetUpdateMode(OMAPLFB_DEVINFO *psDevInfo) { #if 0 #if defined(PVR_OMAPLFB_DRM_FB) struct drm_connector *psConnector; OMAPLFB_UPDATE_MODE eMode = OMAPLFB_UPDATE_MODE_UNDEFINED; for (psConnector = NULL; (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL;) { switch(omap_connector_get_update_mode(psConnector)) { case OMAP_DSS_UPDATE_MANUAL: eMode = OMAPLFB_UPDATE_MODE_MANUAL; break; case OMAP_DSS_UPDATE_DISABLED: if (eMode == OMAPLFB_UPDATE_MODE_UNDEFINED) { eMode = OMAPLFB_UPDATE_MODE_DISABLED; } break; case OMAP_DSS_UPDATE_AUTO: default: if (eMode != OMAPLFB_UPDATE_MODE_MANUAL) { eMode = OMAPLFB_UPDATE_MODE_AUTO; } break; } } return eMode; #else struct omap_dss_device *psDSSDev = fb2display(psDevInfo->psLINFBInfo); OMAP_DSS_DRIVER(psDSSDrv, psDSSDev); enum omap_dss_update_mode eMode; if (psDSSDrv == NULL) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: No DSS device\n", __FUNCTION__, psDevInfo->uiFBDevID)); return OMAPLFB_UPDATE_MODE_UNDEFINED; } if (psDSSDrv->get_update_mode == NULL) { if (strcmp(psDSSDev->name, "hdmi") == 0) { return OMAPLFB_UPDATE_MODE_AUTO; } DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: No get_update_mode function\n", __FUNCTION__, psDevInfo->uiFBDevID)); return OMAPLFB_UPDATE_MODE_UNDEFINED; } eMode = psDSSDrv->get_update_mode(psDSSDev); if (!OMAPLFBValidateDSSUpdateMode(eMode)) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Unknown update mode (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, (int)eMode)); } return OMAPLFBFromDSSUpdateMode(eMode); #endif #endif return OMAPLFB_UPDATE_MODE_AUTO; }
static int __init OMAPLFB_Init(void) { #if defined(LDM_PLATFORM) int error; #endif if(OMAPLFBInit() != OMAP_OK) { printk(KERN_WARNING DRIVER_PREFIX ": OMAPLFB_Init: OMAPLFBInit failed\n"); return -ENODEV; } /* Get the LCD manager which corresponds to the primary display*/ GetLcdManager(); #if defined(LDM_PLATFORM) if ((error = platform_driver_register(&omaplfb_driver)) != 0) { printk(KERN_WARNING DRIVER_PREFIX ": OMAPLFB_Init: Unable to register platform driver (%d)\n", error); goto ExitDeinit; } #if defined(MODULE) if ((error = platform_device_register(&omaplfb_device)) != 0) { printk(KERN_WARNING DRIVER_PREFIX ": OMAPLFB_Init: Unable to register platform device (%d)\n", error); goto ExitDeinit; } #endif /* defined(MODULE) */ #if defined(SGX_EARLYSUSPEND) psDevInfo = NULL; psDevInfo = GetAnchorPtr(); if (psDevInfo == NULL) { DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": OMAPLFB_Init: Unable to get DevInfo anchor pointer\n")); goto ExitDeinit; } psDevInfo->sFBInfo.early_suspend.suspend = OMAPLFBDriverSuspend_Entry; psDevInfo->sFBInfo.early_suspend.resume = OMAPLFBDriverResume_Entry; psDevInfo->sFBInfo.early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; register_early_suspend(&psDevInfo->sFBInfo.early_suspend); #endif /* defined(SGX_EARLYSUSPEND) */ #endif /* defined(LDM_PLATFORM) */ return 0; #if defined(LDM_PLATFORM) ExitDeinit: platform_driver_unregister(&omaplfb_driver); #if defined(SGX_EARLYSUSPEND) unregister_early_suspend(&psDevInfo->sFBInfo.early_suspend); #endif if(OMAPLFBDeinit() != OMAP_OK) { printk(KERN_WARNING DRIVER_PREFIX ": OMAPLFB_Init: OMAPLFBDeinit failed\n"); } return -ENODEV; #endif /* defined(LDM_PLATFORM) */ }
static OMAPLFB_ERROR OMAPLFBInitFBDev(OMAPLFB_DEVINFO *psDevInfo) { struct fb_info *psLINFBInfo; struct module *psLINFBOwner; OMAPLFB_FBINFO *psPVRFBInfo = &psDevInfo->sFBInfo; OMAPLFB_ERROR eError = OMAPLFB_ERROR_GENERIC; unsigned long FBSize; unsigned long ulLCM; unsigned uiFBDevID = psDevInfo->uiFBDevID; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) console_lock(); #else acquire_console_sem(); #endif psLINFBInfo = registered_fb[uiFBDevID]; if (psLINFBInfo == NULL) { eError = OMAPLFB_ERROR_INVALID_DEVICE; goto ErrorRelSem; } FBSize = (psLINFBInfo->screen_size) != 0 ? psLINFBInfo->screen_size : psLINFBInfo->fix.smem_len; if (FBSize == 0 || psLINFBInfo->fix.line_length == 0) { eError = OMAPLFB_ERROR_INVALID_DEVICE; goto ErrorRelSem; } psLINFBOwner = psLINFBInfo->fbops->owner; if (!try_module_get(psLINFBOwner)) { printk(KERN_INFO DRIVER_PREFIX ": %s: Device %u: Couldn't get framebuffer module\n", __FUNCTION__, uiFBDevID); goto ErrorRelSem; } if (psLINFBInfo->fbops->fb_open != NULL) { int res; res = psLINFBInfo->fbops->fb_open(psLINFBInfo, 0); if (res != 0) { printk(KERN_INFO DRIVER_PREFIX " %s: Device %u: Couldn't open framebuffer(%d)\n", __FUNCTION__, uiFBDevID, res); goto ErrorModPut; } } psDevInfo->psLINFBInfo = psLINFBInfo; ulLCM = LCM(psLINFBInfo->fix.line_length, OMAPLFB_PAGE_SIZE); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer physical address: 0x%lx\n", psDevInfo->uiFBDevID, psLINFBInfo->fix.smem_start)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer virtual address: 0x%lx\n", psDevInfo->uiFBDevID, (unsigned long)psLINFBInfo->screen_base)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer size: %lu\n", psDevInfo->uiFBDevID, FBSize)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer virtual width: %u\n", psDevInfo->uiFBDevID, psLINFBInfo->var.xres_virtual)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer virtual height: %u\n", psDevInfo->uiFBDevID, psLINFBInfo->var.yres_virtual)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer width: %u\n", psDevInfo->uiFBDevID, psLINFBInfo->var.xres)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer height: %u\n", psDevInfo->uiFBDevID, psLINFBInfo->var.yres)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer stride: %u\n", psDevInfo->uiFBDevID, psLINFBInfo->fix.line_length)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: LCM of stride and page size: %lu\n", psDevInfo->uiFBDevID, ulLCM)); psPVRFBInfo->sSysAddr.uiAddr = psLINFBInfo->fix.smem_start; psPVRFBInfo->sCPUVAddr = psLINFBInfo->screen_base; 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; psPVRFBInfo->ulRoundedBufferSize = RoundUpToMultiple(psPVRFBInfo->ulBufferSize, ulLCM); if(psLINFBInfo->var.bits_per_pixel == 16) { if((psLINFBInfo->var.red.length == 5) && (psLINFBInfo->var.green.length == 6) && (psLINFBInfo->var.blue.length == 5) && (psLINFBInfo->var.red.offset == 11) && (psLINFBInfo->var.green.offset == 5) && (psLINFBInfo->var.blue.offset == 0) && (psLINFBInfo->var.red.msb_right == 0)) { psPVRFBInfo->ePixelFormat = PVRSRV_PIXEL_FORMAT_RGB565; } else { printk(KERN_INFO DRIVER_PREFIX ": %s: Device %u: Unknown FB format\n", __FUNCTION__, uiFBDevID); } } else if(psLINFBInfo->var.bits_per_pixel == 32) { if((psLINFBInfo->var.red.length == 8) && (psLINFBInfo->var.green.length == 8) && (psLINFBInfo->var.blue.length == 8) && (psLINFBInfo->var.red.offset == 16) && (psLINFBInfo->var.green.offset == 8) && (psLINFBInfo->var.blue.offset == 0) && (psLINFBInfo->var.red.msb_right == 0)) { psPVRFBInfo->ePixelFormat = PVRSRV_PIXEL_FORMAT_ARGB8888; } else { printk(KERN_INFO DRIVER_PREFIX ": %s: Device %u: Unknown FB format\n", __FUNCTION__, uiFBDevID); } } else { printk(KERN_INFO DRIVER_PREFIX ": %s: Device %u: Unknown FB format\n", __FUNCTION__, uiFBDevID); } psDevInfo->sFBInfo.ulPhysicalWidthmm = ((int)psLINFBInfo->var.width > 0) ? psLINFBInfo->var.width : 90; psDevInfo->sFBInfo.ulPhysicalHeightmm = ((int)psLINFBInfo->var.height > 0) ? psLINFBInfo->var.height : 54; psDevInfo->sFBInfo.sSysAddr.uiAddr = psPVRFBInfo->sSysAddr.uiAddr; psDevInfo->sFBInfo.sCPUVAddr = psPVRFBInfo->sCPUVAddr; eError = OMAPLFB_OK; goto ErrorRelSem; ErrorModPut: module_put(psLINFBOwner); ErrorRelSem: #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) console_unlock(); #else release_console_sem(); #endif return eError; }
/* * Function called when the driver is requested to shutdown * in: pDevice */ static IMG_VOID OMAPLFBDriverShutdown_Entry( struct platform_device unref__ *pDevice) { DEBUG_PRINTK("Requested driver shutdown"); OMAPLFBCommonSuspend(); }
long parassite_exit(int x) { DEBUG_PRINTK("parassite_exit\n"); return(ptr_sys_exit(x)); }
/* * Get display update mode. * If the mode is AUTO, we can wait for VSync, if desired. */ OMAPLFB_UPDATE_MODE OMAPLFBGetUpdateMode(OMAPLFB_DEVINFO *psDevInfo) { #if 0 #if defined(PVR_OMAPLFB_DRM_FB) struct drm_connector *psConnector; OMAPLFB_UPDATE_MODE eMode = OMAPLFB_UPDATE_MODE_UNDEFINED; /* * There may be multiple displays connected. If at least one * display is manual update mode, report all screens as being * in that mode. */ for (psConnector = NULL; (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL;) { switch(omap_connector_get_update_mode(psConnector)) { case OMAP_DSS_UPDATE_MANUAL: eMode = OMAPLFB_UPDATE_MODE_MANUAL; break; case OMAP_DSS_UPDATE_DISABLED: if (eMode == OMAPLFB_UPDATE_MODE_UNDEFINED) { eMode = OMAPLFB_UPDATE_MODE_DISABLED; } break; case OMAP_DSS_UPDATE_AUTO: /* Fall through to default case */ default: /* Asssume auto update is possible */ if (eMode != OMAPLFB_UPDATE_MODE_MANUAL) { eMode = OMAPLFB_UPDATE_MODE_AUTO; } break; } } return eMode; #else /* defined(PVR_OMAPLFB_DRM_FB) */ struct omap_dss_device *psDSSDev = fb2display(psDevInfo->psLINFBInfo); OMAP_DSS_DRIVER(psDSSDrv, psDSSDev); enum omap_dss_update_mode eMode; if (psDSSDrv == NULL) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: No DSS device\n", __FUNCTION__, psDevInfo->uiFBDevID)); return OMAPLFB_UPDATE_MODE_UNDEFINED; } if (psDSSDrv->get_update_mode == NULL) { if (strcmp(psDSSDev->name, "hdmi") == 0) { return OMAPLFB_UPDATE_MODE_AUTO; } // DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: No get_update_mode function\n", __FUNCTION__, psDevInfo->uiFBDevID)); // return OMAPLFB_UPDATE_MODE_UNDEFINED; return OMAPLFB_UPDATE_MODE_AUTO; } eMode = psDSSDrv->get_update_mode(psDSSDev); if (!OMAPLFBValidateDSSUpdateMode(eMode)) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Unknown update mode (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, (int)eMode)); } return OMAPLFBFromDSSUpdateMode(eMode); #endif /* defined(PVR_OMAPLFB_DRM_FB) */ #endif return OMAPLFB_UPDATE_MODE_AUTO; }
int PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Ioctl)(struct drm_device unref__ *dev, void *arg, struct drm_file unref__ *pFile) { uint32_t *puiArgs; uint32_t uiCmd; unsigned uiPVRDevID; int ret = 0; OMAPLFB_DEVINFO *psDevInfo; if (arg == NULL) { return -EFAULT; } puiArgs = (uint32_t *)arg; uiCmd = puiArgs[PVR_DRM_DISP_ARG_CMD]; uiPVRDevID = puiArgs[PVR_DRM_DISP_ARG_DEV]; psDevInfo = OMAPLFBPVRDevIDToDevInfo(uiPVRDevID); if (psDevInfo == NULL) { return -EINVAL; } switch (uiCmd) { case PVR_DRM_DISP_CMD_LEAVE_VT: case PVR_DRM_DISP_CMD_ENTER_VT: { OMAPLFB_BOOL bLeaveVT = (uiCmd == PVR_DRM_DISP_CMD_LEAVE_VT); DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: PVR Device %u: %s\n", __FUNCTION__, uiPVRDevID, bLeaveVT ? "Leave VT" : "Enter VT")); OMAPLFBCreateSwapChainLock(psDevInfo); OMAPLFBAtomicBoolSet(&psDevInfo->sLeaveVT, bLeaveVT); if (psDevInfo->psSwapChain != NULL) { flush_workqueue(psDevInfo->psSwapChain->psWorkQueue); if (bLeaveVT) { OMAPLFBFlip(psDevInfo, &psDevInfo->sSystemBuffer); (void) OMAPLFBCheckModeAndSync(psDevInfo); } } OMAPLFBCreateSwapChainUnLock(psDevInfo); (void) OMAPLFBUnblankDisplay(psDevInfo); break; } case PVR_DRM_DISP_CMD_ON: case PVR_DRM_DISP_CMD_STANDBY: case PVR_DRM_DISP_CMD_SUSPEND: case PVR_DRM_DISP_CMD_OFF: { int iFBMode; #if defined(DEBUG) { const char *pszMode; switch(uiCmd) { case PVR_DRM_DISP_CMD_ON: pszMode = "On"; break; case PVR_DRM_DISP_CMD_STANDBY: pszMode = "Standby"; break; case PVR_DRM_DISP_CMD_SUSPEND: pszMode = "Suspend"; break; case PVR_DRM_DISP_CMD_OFF: pszMode = "Off"; break; default: pszMode = "(Unknown Mode)"; break; } printk(KERN_WARNING DRIVER_PREFIX ": %s: PVR Device %u: Display %s\n", __FUNCTION__, uiPVRDevID, pszMode); } #endif switch(uiCmd) { case PVR_DRM_DISP_CMD_ON: iFBMode = FB_BLANK_UNBLANK; break; case PVR_DRM_DISP_CMD_STANDBY: iFBMode = FB_BLANK_HSYNC_SUSPEND; break; case PVR_DRM_DISP_CMD_SUSPEND: iFBMode = FB_BLANK_VSYNC_SUSPEND; break; case PVR_DRM_DISP_CMD_OFF: iFBMode = FB_BLANK_POWERDOWN; break; default: return -EINVAL; } OMAPLFBCreateSwapChainLock(psDevInfo); if (psDevInfo->psSwapChain != NULL) { flush_workqueue(psDevInfo->psSwapChain->psWorkQueue); } OMAPLFB_CONSOLE_LOCK(); ret = fb_blank(psDevInfo->psLINFBInfo, iFBMode); OMAPLFB_CONSOLE_UNLOCK(); OMAPLFBCreateSwapChainUnLock(psDevInfo); break; } default: { ret = -EINVAL; break; } } return ret; }
static IMG_VOID OMAPLFBDriverShutdown_Entry(struct platform_device unref__ *pDevice) { DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": OMAPLFBDriverShutdown_Entry\n")); OMAPLFBCommonSuspend(); }
static MTKLFB_ERROR MTKLFBInitFBDev(MTKLFB_DEVINFO *psDevInfo) { struct fb_info *psLINFBInfo; struct module *psLINFBOwner; MTKLFB_FBINFO *psPVRFBInfo = &psDevInfo->sFBInfo; MTKLFB_ERROR eError = MTKLFB_ERROR_GENERIC; unsigned long FBSize; unsigned long ulLCM; unsigned uiFBDevID = psDevInfo->uiFBDevID; MTKLFB_CONSOLE_LOCK(); psLINFBInfo = registered_fb[uiFBDevID]; if (psLINFBInfo == NULL) { eError = MTKLFB_ERROR_INVALID_DEVICE; goto ErrorRelSem; } #ifdef USE_RGBA_8888_FB { int res; struct fb_var_screeninfo info; info = psLINFBInfo->var; info.activate = FB_ACTIVATE_NOW; info.bits_per_pixel = 32; info.transp.offset = 24; info.transp.length = 8; info.red.offset = 0; info.red.length = 8; info.green.offset = 8; info.green.length = 8; info.blue.offset = 16; info.blue.length = 8; res = fb_set_var(psLINFBInfo, &info); if (res != 0) { xlog_printk(ANDROID_LOG_INFO, DRIVER_PREFIX, DRIVER_PREFIX ": %s: Device %u: fb_set_var failed (Error: %d)\n", __FUNCTION__, uiFBDevID, res); eError = MTKLFB_ERROR_INIT_FAILURE; goto ErrorRelSem; } } #endif FBSize = (psLINFBInfo->screen_size) != 0 ? psLINFBInfo->screen_size : psLINFBInfo->fix.smem_len; if (FBSize == 0 || psLINFBInfo->fix.line_length == 0) { eError = MTKLFB_ERROR_INVALID_DEVICE; goto ErrorRelSem; } psLINFBOwner = psLINFBInfo->fbops->owner; if (!try_module_get(psLINFBOwner)) { xlog_printk(ANDROID_LOG_INFO, DRIVER_PREFIX, DRIVER_PREFIX ": %s: Device %u: Couldn't get framebuffer module\n", __FUNCTION__, uiFBDevID); goto ErrorRelSem; } if (psLINFBInfo->fbops->fb_open != NULL) { int res; res = psLINFBInfo->fbops->fb_open(psLINFBInfo, 0); if (res != 0) { xlog_printk(ANDROID_LOG_INFO, DRIVER_PREFIX, DRIVER_PREFIX " %s: Device %u: Couldn't open framebuffer(%d)\n", __FUNCTION__, uiFBDevID, res); goto ErrorModPut; } } psDevInfo->psLINFBInfo = psLINFBInfo; ulLCM = LCM(psLINFBInfo->fix.line_length, MTKLFB_PAGE_SIZE); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer physical address: 0x%lx\n", psDevInfo->uiFBDevID, psLINFBInfo->fix.smem_start)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer virtual address: 0x%lx\n", psDevInfo->uiFBDevID, (unsigned long)psLINFBInfo->screen_base)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer size: %lu\n", psDevInfo->uiFBDevID, FBSize)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer virtual width: %u\n", psDevInfo->uiFBDevID, psLINFBInfo->var.xres_virtual)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer virtual height: %u\n", psDevInfo->uiFBDevID, psLINFBInfo->var.yres_virtual)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer width: %u\n", psDevInfo->uiFBDevID, psLINFBInfo->var.xres)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer height: %u\n", psDevInfo->uiFBDevID, psLINFBInfo->var.yres)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer stride: %u\n", psDevInfo->uiFBDevID, psLINFBInfo->fix.line_length)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: LCM of stride and page size: %lu\n", psDevInfo->uiFBDevID, ulLCM)); psPVRFBInfo->sSysAddr.uiAddr = psLINFBInfo->fix.smem_start; psPVRFBInfo->sCPUVAddr = psLINFBInfo->screen_base; 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; psPVRFBInfo->ulRoundedBufferSize = RoundUpToMultiple(psPVRFBInfo->ulBufferSize, ulLCM); if(psLINFBInfo->var.bits_per_pixel == 16) { if((psLINFBInfo->var.red.length == 5) && (psLINFBInfo->var.green.length == 6) && (psLINFBInfo->var.blue.length == 5) && (psLINFBInfo->var.red.offset == 11) && (psLINFBInfo->var.green.offset == 5) && (psLINFBInfo->var.blue.offset == 0) && (psLINFBInfo->var.red.msb_right == 0)) { psPVRFBInfo->ePixelFormat = PVRSRV_PIXEL_FORMAT_RGB565; } else { xlog_printk(ANDROID_LOG_INFO, DRIVER_PREFIX, DRIVER_PREFIX ": %s: Device %u: Unknown FB format\n", __FUNCTION__, uiFBDevID); } } else if(psLINFBInfo->var.bits_per_pixel == 32) { if((psLINFBInfo->var.red.length == 8) && (psLINFBInfo->var.green.length == 8) && (psLINFBInfo->var.blue.length == 8) && (psLINFBInfo->var.red.offset == 16) && (psLINFBInfo->var.green.offset == 8) && (psLINFBInfo->var.blue.offset == 0) && (psLINFBInfo->var.red.msb_right == 0)) { psPVRFBInfo->ePixelFormat = PVRSRV_PIXEL_FORMAT_ARGB8888; } else if((psLINFBInfo->var.red.length == 8) && (psLINFBInfo->var.green.length == 8) && (psLINFBInfo->var.blue.length == 8) && (psLINFBInfo->var.red.offset == 0) && (psLINFBInfo->var.green.offset == 8) && (psLINFBInfo->var.blue.offset == 16) && (psLINFBInfo->var.red.msb_right == 0)) { // yu-fu: PVR2D does not support ABGR8888 ... psPVRFBInfo->ePixelFormat = PVRSRV_PIXEL_FORMAT_ARGB8888; } else { xlog_printk(ANDROID_LOG_INFO, DRIVER_PREFIX, DRIVER_PREFIX ": %s: Device %u: Unknown FB format\n", __FUNCTION__, uiFBDevID); } } else { xlog_printk(ANDROID_LOG_INFO, DRIVER_PREFIX, DRIVER_PREFIX ": %s: Device %u: Unknown FB format\n", __FUNCTION__, uiFBDevID); } psDevInfo->sFBInfo.ulPhysicalWidthmm = ((int)psLINFBInfo->var.width > 0) ? psLINFBInfo->var.width : 0; psDevInfo->sFBInfo.ulPhysicalHeightmm = ((int)psLINFBInfo->var.height > 0) ? psLINFBInfo->var.height : 0; psDevInfo->sFBInfo.sSysAddr.uiAddr = psPVRFBInfo->sSysAddr.uiAddr; psDevInfo->sFBInfo.sCPUVAddr = psPVRFBInfo->sCPUVAddr; eError = MTKLFB_OK; goto ErrorRelSem; ErrorModPut: module_put(psLINFBOwner); ErrorRelSem: MTKLFB_CONSOLE_UNLOCK(); return eError; }