static IMG_VOID SetDCState(IMG_HANDLE hDevice, IMG_UINT32 ui32State) { OMAPLFB_DEVINFO *psDevInfo = (OMAPLFB_DEVINFO *)hDevice; switch (ui32State) { case DC_STATE_FLUSH_COMMANDS: OMAPLFBAtomicBoolSet(&psDevInfo->sFlushCommands, OMAPLFB_TRUE); break; case DC_STATE_NO_FLUSH_COMMANDS: OMAPLFBAtomicBoolSet(&psDevInfo->sFlushCommands, OMAPLFB_FALSE); break; default: break; } }
static PVRSRV_ERROR CloseDCDevice(IMG_HANDLE hDevice) { #if defined(SUPPORT_DRI_DRM) OMAPLFB_DEVINFO *psDevInfo = (OMAPLFB_DEVINFO *)hDevice; OMAPLFBAtomicBoolSet(&psDevInfo->sLeaveVT, OMAPLFB_FALSE); (void) OMAPLFBUnblankDisplay(psDevInfo); #else UNREFERENCED_PARAMETER(hDevice); #endif return PVRSRV_OK; }
static void OMAPLFBEarlyResumeHandler(struct early_suspend *h) { unsigned uiMaxFBDevIDPlusOne = OMAPLFBMaxFBDevIDPlusOne(); unsigned i; for (i=0; i < uiMaxFBDevIDPlusOne; i++) { OMAPLFB_DEVINFO *psDevInfo = OMAPLFBGetDevInfoPtr(i); if (psDevInfo != NULL) { OMAPLFBUnblankDisplay(psDevInfo); OMAPLFBAtomicBoolSet(&psDevInfo->sEarlySuspendFlag, OMAPLFB_FALSE); } } }
/* Linux Framebuffer event notification handler */ static int OMAPLFBFrameBufferEvents(struct notifier_block *psNotif, unsigned long event, void *data) { OMAPLFB_DEVINFO *psDevInfo; struct fb_event *psFBEvent = (struct fb_event *)data; struct fb_info *psFBInfo = psFBEvent->info; OMAPLFB_BOOL bBlanked; /* Only interested in blanking events */ if (event != FB_EVENT_BLANK) { return 0; } bBlanked = (*(IMG_INT *)psFBEvent->data != 0) ? OMAPLFB_TRUE: OMAPLFB_FALSE; psDevInfo = OMAPLFBGetDevInfoPtr(psFBInfo->node); #if 0 if (psDevInfo != NULL) { if (bBlanked) { DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": %s: Device %u: Blank event received\n", __FUNCTION__, psDevInfo->uiFBDevID)); } else { DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": %s: Device %u: Unblank event received\n", __FUNCTION__, psDevInfo->uiFBDevID)); } } else { DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": %s: Device %u: Blank/Unblank event for unknown framebuffer\n", __FUNCTION__, psFBInfo->node)); } #endif if (psDevInfo != NULL) { OMAPLFBAtomicBoolSet(&psDevInfo->sBlanked, bBlanked); OMAPLFBAtomicIntInc(&psDevInfo->sBlankEvents); } return 0; }
/* Disable Linux Framebuffer event notification */ OMAPLFB_ERROR OMAPLFBDisableLFBEventNotification(OMAPLFB_DEVINFO *psDevInfo) { int res; #ifdef CONFIG_HAS_EARLYSUSPEND unregister_early_suspend(&psDevInfo->sEarlySuspend); #endif /* Unregister for Framebuffer events */ res = fb_unregister_client(&psDevInfo->sLINNotifBlock); if (res != 0) { printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: fb_unregister_client failed (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, res); return (OMAPLFB_ERROR_GENERIC); } OMAPLFBAtomicBoolSet(&psDevInfo->sBlanked, OMAPLFB_FALSE); return (OMAPLFB_OK); }
/* Set up Linux Framebuffer event notification */ OMAPLFB_ERROR OMAPLFBEnableLFBEventNotification(OMAPLFB_DEVINFO *psDevInfo) { int res; OMAPLFB_ERROR eError; /* Set up Linux Framebuffer event notification */ memset(&psDevInfo->sLINNotifBlock, 0, sizeof(psDevInfo->sLINNotifBlock)); psDevInfo->sLINNotifBlock.notifier_call = OMAPLFBFrameBufferEvents; OMAPLFBAtomicBoolSet(&psDevInfo->sBlanked, OMAPLFB_FALSE); OMAPLFBAtomicIntSet(&psDevInfo->sBlankEvents, 0); res = fb_register_client(&psDevInfo->sLINNotifBlock); if (res != 0) { printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: fb_register_client failed (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, res); return (OMAPLFB_ERROR_GENERIC); } eError = OMAPLFBUnblankDisplay(psDevInfo); if (eError != OMAPLFB_OK) { printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: UnblankDisplay failed (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, eError); return eError; } #ifdef CONFIG_HAS_EARLYSUSPEND psDevInfo->sEarlySuspend.suspend = OMAPLFBEarlySuspendHandler; psDevInfo->sEarlySuspend.resume = OMAPLFBEarlyResumeHandler; psDevInfo->sEarlySuspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1; register_early_suspend(&psDevInfo->sEarlySuspend); #endif return (OMAPLFB_OK); }
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; }