/* * Deinitialization routine for the 3rd party display driver */ static enum OMAP_ERROR destroy_display_devices(void) { struct OMAP_DISP_DEVINFO *psDevInfo; PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable; int i; DEBUG_PRINTK("Deinitializing 3rd party display driver"); if(!pDisplayDevices) return OMAP_OK; for(i = 0; i < display_devices_count; i++) { psDevInfo = &pDisplayDevices[i]; if(!psDevInfo->display) continue; /* Remove the ProcessFlip command callback */ psJTable = &psDevInfo->sPVRJTable; if(!psJTable) continue; if (psDevInfo->sPVRJTable.pfnPVRSRVRemoveCmdProcList( psDevInfo->ulDeviceID, OMAP_DC_CMD_COUNT) != PVRSRV_OK) { ERROR_PRINTK("Unable to remove callback for " "ProcessFlip command for display %lu", psDevInfo->ulDeviceID); return OMAP_ERROR_GENERIC; } /* Remove the display device from services */ if (psJTable->pfnPVRSRVRemoveDCDevice( psDevInfo->ulDeviceID) != PVRSRV_OK) { ERROR_PRINTK("Unable to remove the display %lu " "from services", psDevInfo->ulDeviceID); return OMAP_ERROR_GENERIC; } deinit_display_device(psDevInfo); } kfree(pDisplayDevices); return OMAP_OK; }
OMAP_ERROR OMAPLFBDeinit(void) { OMAPLFB_DEVINFO *psDevInfo, *psDevFirst; psDevFirst = GetAnchorPtr(); psDevInfo = psDevFirst; if (psDevInfo == NULL) { return (OMAP_ERROR_GENERIC); } psDevInfo->ulRefCount--; if (psDevInfo->ulRefCount == 0) { PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable = &psDevInfo->sPVRJTable; if (psDevInfo->sPVRJTable.pfnPVRSRVRemoveCmdProcList (psDevInfo->ulDeviceID, OMAPLFB_COMMAND_COUNT) != PVRSRV_OK) { return (OMAP_ERROR_GENERIC); } if (psJTable->pfnPVRSRVRemoveDCDevice(psDevInfo->ulDeviceID) != PVRSRV_OK) { return (OMAP_ERROR_GENERIC); } DeInitDev(psDevInfo); OMAPLFBFreeKernelMem(psDevInfo); } SetAnchorPtr(NULL); return (OMAP_OK); }
static OMAPLFB_BOOL OMAPLFBDeInitDev(OMAPLFB_DEVINFO *psDevInfo) { PVRSRV_DC_DISP2SRV_KMJTABLE *psPVRJTable = &psDevInfo->sPVRJTable; OMAPLFBCreateSwapChainLockDeInit(psDevInfo); OMAPLFBAtomicBoolDeInit(&psDevInfo->sBlanked); OMAPLFBAtomicIntDeInit(&psDevInfo->sBlankEvents); OMAPLFBAtomicBoolDeInit(&psDevInfo->sFlushCommands); #if defined(CONFIG_HAS_EARLYSUSPEND) OMAPLFBAtomicBoolDeInit(&psDevInfo->sEarlySuspendFlag); #endif #if defined(SUPPORT_DRI_DRM) OMAPLFBAtomicBoolDeInit(&psDevInfo->sLeaveVT); #endif psPVRJTable = &psDevInfo->sPVRJTable; if (psPVRJTable->pfnPVRSRVRemoveCmdProcList (psDevInfo->uiPVRDevID, OMAPLFB_COMMAND_COUNT) != PVRSRV_OK) { printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: PVR Device %u: Couldn't unregister command processing functions\n", __FUNCTION__, psDevInfo->uiFBDevID, psDevInfo->uiPVRDevID); return OMAPLFB_FALSE; } if (psPVRJTable->pfnPVRSRVRemoveDCDevice(psDevInfo->uiPVRDevID) != PVRSRV_OK) { printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: PVR Device %u: Couldn't remove device from PVR Services\n", __FUNCTION__, psDevInfo->uiFBDevID, psDevInfo->uiPVRDevID); return OMAPLFB_FALSE; } #ifdef FBDEV_PRESENT OMAPLFBDeInitFBDev(psDevInfo); #endif OMAPLFBSetDevInfoPtr(psDevInfo->uiFBDevID, NULL); OMAPLFBFreeKernelMem(psDevInfo); return OMAPLFB_TRUE; }
DC_ERROR Deinit(void) { DC_NOHW_DEVINFO *psDevInfo, *psDevFirst; #if !defined(USE_BASE_VIDEO_FRAMEBUFFER) unsigned long i; #endif psDevFirst = GetAnchorPtr(); psDevInfo = psDevFirst; if (psDevInfo == 0) { return (DC_ERROR_GENERIC); } psDevInfo->ulRefCount--; if (psDevInfo->ulRefCount == 0UL) { PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable = &psDevInfo->sPVRJTable; if (psJTable->pfnPVRSRVRemoveDCDevice((IMG_UINT32)psDevInfo->uiDeviceID) != PVRSRV_OK) { return (DC_ERROR_GENERIC); } if (psDevInfo->sPVRJTable.pfnPVRSRVRemoveCmdProcList(psDevInfo->uiDeviceID, DC_NOHW_COMMAND_COUNT) != PVRSRV_OK) { return (DC_ERROR_GENERIC); } if (ClosePVRServices(psDevInfo->hPVRServices) != DC_OK) { psDevInfo->hPVRServices = 0; return (DC_ERROR_GENERIC); } #if !defined(USE_BASE_VIDEO_FRAMEBUFFER) for(i=0; i<DC_NOHW_MAX_BACKBUFFERS; i++) { if (psDevInfo->asBackBuffers[i].sCPUVAddr) { #if defined(DC_NOHW_DISCONTIG_BUFFERS) FreeDiscontigMemory(psDevInfo->ui32BufferSize, psDevInfo->asBackBuffers[i].hMemChunk, psDevInfo->asBackBuffers[i].sCPUVAddr, psDevInfo->asBackBuffers[i].psSysAddr); #else FreeContigMemory(psDevInfo->ui32BufferSize, psDevInfo->asBackBuffers[i].hMemChunk, psDevInfo->asBackBuffers[i].sCPUVAddr, SysPAddrToCpuPAddr(psDevInfo->asBackBuffers[i].sSysAddr)); #endif } } #endif FreeKernelMem(psDevInfo); } #if defined (ENABLE_DISPLAY_MODE_TRACKING) CloseMiniport(); #endif SetAnchorPtr(0); return (DC_OK); }
/* * Deinit */ DC_ERROR Deinit(void) { DC_NOHW_DEVINFO *psDevInfo, *psDevFirst; #if !defined(USE_BASE_VIDEO_FRAMEBUFFER) unsigned long i; #endif psDevFirst = GetAnchorPtr(); psDevInfo = psDevFirst; /* check DevInfo has been setup */ if (psDevInfo == 0) { return (DC_ERROR_GENERIC);/* failure */ } /* decrement ref count */ psDevInfo->ulRefCount--; if (psDevInfo->ulRefCount == 0UL) { /* all references gone - de-init device information */ PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable = &psDevInfo->sPVRJTable; /* Remove display class device from kernel services device register */ if (psJTable->pfnPVRSRVRemoveDCDevice((IMG_UINT32)psDevInfo->uiDeviceID) != PVRSRV_OK) { return (DC_ERROR_GENERIC);/* failure */ } if (psDevInfo->sPVRJTable.pfnPVRSRVRemoveCmdProcList(psDevInfo->uiDeviceID, DC_NOHW_COMMAND_COUNT) != PVRSRV_OK) { return (DC_ERROR_GENERIC);/* failure */ } if (ClosePVRServices(psDevInfo->hPVRServices) != DC_OK) { psDevInfo->hPVRServices = 0; return (DC_ERROR_GENERIC);/* failure */ } #if !defined(USE_BASE_VIDEO_FRAMEBUFFER) for(i=0; i<DC_NOHW_MAX_BACKBUFFERS; i++) { if (psDevInfo->asBackBuffers[i].sCPUVAddr) { #if defined(DC_NOHW_DISCONTIG_BUFFERS) FreeDiscontigMemory(psDevInfo->ui32BufferSize, psDevInfo->asBackBuffers[i].hMemChunk, psDevInfo->asBackBuffers[i].sCPUVAddr, psDevInfo->asBackBuffers[i].psSysAddr); #else FreeContigMemory(psDevInfo->ui32BufferSize, psDevInfo->asBackBuffers[i].hMemChunk, psDevInfo->asBackBuffers[i].sCPUVAddr, SysPAddrToCpuPAddr(psDevInfo->asBackBuffers[i].sSysAddr)); #endif } } #endif /* #if !defined(USE_BASE_VIDEO_FRAMEBUFFER) */ /* de-allocate data structure */ FreeKernelMem(psDevInfo); } #if defined (ENABLE_DISPLAY_MODE_TRACKING) CloseMiniport(); #endif /* clear the top-level anchor */ SetAnchorPtr(0); /* return success */ return (DC_OK); }