/** ============================================================================ * @func SWIRGB2YCBCR_DSP_delete * * @desc Delete phase of SWIRGB2YCBCR_DSP application. Deallocates all the * resources that were allocated during create phase. * * @modif None. * ============================================================================ */ Int SWIRGB2YCBCR_DSP_delete (SWIRGB2YCBCR_DSP_TransferInfo * info) { Int status = SYS_OK ; Int iomStatus ; if (info != NULL) { /* Delete SWI */ if (info->swi != NULL) { SWI_delete (info->swi) ; } /* Delete GIO input channel */ if (info->gioInputChan != NULL) { iomStatus = GIO_delete (info->gioInputChan) ; if (iomStatus != IOM_COMPLETED) { status = SYS_EBADIO ; SET_FAILURE_REASON (status) ; } } /* Delete GIO output channel */ if (info->gioOutputChan != NULL) { iomStatus = GIO_delete (info->gioOutputChan) ; if (iomStatus != IOM_COMPLETED) { status = SYS_EBADIO ; SET_FAILURE_REASON (status) ; } } /* Deallocate inputBuffer */ if (info->inputBuffer != NULL) { POOL_free (SAMPLE_POOL_ID, info->inputBuffer, info->bufferSize) ; } /* Deallocate outputBuffer */ if (info->outputBuffer != NULL) { POOL_free (SAMPLE_POOL_ID, info->outputBuffer, info->bufferSize) ; } /* Deallocate info structure */ if (!MEM_free (DSPLINK_SEGID, info, sizeof (SWIRGB2YCBCR_DSP_TransferInfo))) { status = SYS_EALLOC ; SET_FAILURE_REASON (status) ; } } else { status = SYS_EALLOC ; } return status ; }
/* * ======== GIO_create ======== */ GIO_Handle GIO_create(String name, Int mode, Int *status, Ptr optArgs, \ GIO_Attrs *attrs) { GIO_Handle gioChan; IOM_Packet *packet; DEV_Device *entry; Int i; Int tmpStat; if (attrs == NULL) { attrs = &GIO_ATTRS; } /* * status param is used to pass additional device status back to caller. */ if (status == NULL) { status = &tmpStat; /* no longer need to check if status valid ptr */ } *status = IOM_COMPLETED; /* * Find device structure in device table for device with name 'name'. * DEV_match() returns the remaining name string for use by the * mini-driver's create() function. */ name = DEV_match(name, &entry); if (entry == NULL) { SYS_error(name, SYS_ENODEV); /* sys error - no device found */ return (NULL); } if (entry->type != DEV_IOMTYPE) { SYS_error("IOM", SYS_EINVAL); /* sys error - invalid device parameter */ return (NULL); } /* allocate and 0-fill IOM object */ gioChan = MEM_calloc(0, sizeof(GIO_Obj), 0); if (gioChan == NULL) { *status = IOM_EALLOC; return (NULL); } /* initialize queue structures */ QUE_new(&gioChan->freeList); /* * Allocate packets for asynch I/O. */ for (i=0; i < attrs->nPackets; i++) { packet = _GIO_mkPacket(); if (packet == NULL) { *status = IOM_EALLOC; GIO_delete(gioChan); return (NULL); } QUE_put(&gioChan->freeList, packet); } /* * Create semaphore or other synchronization object. 'gioChan->syncObj' is * used to wait for I/O to complete when GIO_submit() is called with * NULL *appCallback parameter. */ gioChan->syncObj = GIO->SEMCREATE(0, NULL); if (gioChan->syncObj == NULL) { *status = IOM_EALLOC; GIO_delete(gioChan); return (NULL); } gioChan->fxns = (IOM_Fxns *)entry->fxns; gioChan->mode = mode; gioChan->timeout = attrs->timeout; *status = gioChan->fxns->mdCreateChan(&gioChan->mdChan, entry->devp, name, mode, optArgs, _GIO_iomCallback, gioChan); if (gioChan->mdChan == NULL) { GIO_delete(gioChan); return (NULL); } return (gioChan); }