/*!
 ******************************************************************************

 @Function				DMANKM_CloseDevice

 ******************************************************************************/
IMG_RESULT DMANKM_CloseDevice(IMG_HANDLE hDevHandle, IMG_HANDLE hConnHandle,
		DMANKM_eDisconnType eDisconnType) 
{
	DMANKM_sDevContext * psDevContext = (DMANKM_sDevContext *) hDevHandle;
	DMANKM_sConnContext * psConnContext = (DMANKM_sConnContext *) hConnHandle;
	IMG_UINT32 ui32Result;

	IMG_ASSERT(gDmanKmInitialised);
	IMG_ASSERT(!psConnContext->bInitConn);
	IMG_ASSERT(psConnContext->ui32OpenCnt != 0);

	/* Update the open count...*/
	psConnContext->ui32OpenCnt--;

	/* If abort...*/
	if (eDisconnType == DMAN_DCONN_ABORT) {
		/* Set open count to 0...*/
		psConnContext->ui32OpenCnt = 0;
	}

	/* If this is not the last close...*/
	if (psConnContext->ui32OpenCnt != 0) {
		/* Unlock the device...*/
		DMANKM_UnlockDeviceContext(hDevHandle);

		/* Return success...*/
		return IMG_SUCCESS;
	}

	/* Removed the process lost callback...*/
	PMAN_RemoveProcessLostCb(psConnContext->hProcLostCbHandle);

	/* If disconnect/close function...*/
	if (psDevContext->sDevRegister.pfnDevDisconnect != IMG_NULL ) {
		ui32Result = psDevContext->sDevRegister.pfnDevDisconnect(psConnContext,
				psDevContext->pvDevInstanceData,
				psConnContext->pvDevConnectionData, eDisconnType);
		IMG_ASSERT(ui32Result == IMG_SUCCESS);
		if (ui32Result != IMG_SUCCESS) {
			return ui32Result;
		}
	} else {
		/* Call complete function synchronously...*/
		DMANKM_DevDisconnectComplete(psConnContext);
	}

	/* Return success...*/
	return IMG_SUCCESS;
}
/*!
******************************************************************************

 @Function              nullkm_fnDevDisconnect

 See definition of #DMANKM_pfnDevDisconnect.

******************************************************************************/
static IMG_RESULT nullkm_fnDevDisconnect (
	IMG_HANDLE					hConnHandle,
    IMG_VOID *					pvDevInstanceData,
    IMG_VOID *					pvDevConnectionData,
	DMANKM_eDisconnType			eDisconnType
)
{
    IMG_UINT32                        ui32Result;

	/* Signal the disconnect has completed. */
    ui32Result = DMANKM_DevDisconnectComplete(hConnHandle);
    IMG_ASSERT(ui32Result == IMG_SUCCESS);
    if (ui32Result != IMG_SUCCESS)
    {
        return ui32Result;
    }

	return IMG_SUCCESS;
}