int dma_add_descriptors(DMA_DescriptorRing_t *ring, /* */ DMA_Device_t device, /* */ dma_addr_t srcData, /* */ dma_addr_t dstData, /* */ size_t numBytes /* */ ) { int rc; DMA_DeviceAttribute_t *devAttr; if (!IsDeviceValid(device)) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[device]; rc = dmacHw_setDataDescriptor(&devAttr->config, ring->virtAddr, (void *)srcData, (void *)dstData, numBytes); if (rc < 0) { printk(KERN_ERR "dma_add_descriptors: dmacHw_setDataDescriptor failed with code: %d\n", rc); return -ENOMEM; } return 0; }
int dma_set_device_descriptor_ring(DMA_Device_t device, /* */ DMA_DescriptorRing_t *ring /* */ ) { DMA_DeviceAttribute_t *devAttr; if (!IsDeviceValid(device)) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[device]; /* */ dma_free_descriptor_ring(&devAttr->ring); if (ring != NULL) { /* */ devAttr->ring = *ring; } /* */ /* */ devAttr->prevSrcData = 0; devAttr->prevDstData = 0; devAttr->prevNumBytes = 0; return 0; }
int dma_set_device_descriptor_ring(DMA_Device_t device, /* Device to update the descriptor ring for. */ DMA_DescriptorRing_t *ring /* Descriptor ring to add descriptors to */ ) { DMA_DeviceAttribute_t *devAttr; if (!IsDeviceValid(device)) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[device]; /* Free the previously allocated descriptor ring */ dma_free_descriptor_ring(&devAttr->ring); if (ring != NULL) { /* Copy in the new one */ devAttr->ring = *ring; } /* Set things up so that if dma_transfer is called then this descriptor */ /* ring will get freed. */ devAttr->prevSrcData = 0; devAttr->prevDstData = 0; devAttr->prevNumBytes = 0; return 0; }
int dma_calculate_descriptor_count(DMA_Device_t device, /* */ dma_addr_t srcData, /* */ dma_addr_t dstData, /* */ size_t numBytes /* */ ) { int numDescriptors; DMA_DeviceAttribute_t *devAttr; if (!IsDeviceValid(device)) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[device]; numDescriptors = dmacHw_calculateDescriptorCount(&devAttr->config, (void *)srcData, (void *)dstData, numBytes); if (numDescriptors < 0) { printk(KERN_ERR "dma_calculate_descriptor_count: dmacHw_calculateDescriptorCount failed\n"); return -EINVAL; } return numDescriptors; }
int dma_add_descriptors(DMA_DescriptorRing_t *ring, /* Descriptor ring to add descriptors to */ DMA_Device_t device, /* DMA Device that descriptors are for */ dma_addr_t srcData, /* Place to get data (memory or device) */ dma_addr_t dstData, /* Place to put data (memory or device) */ size_t numBytes /* Number of bytes to transfer to the device */ ) { int rc; DMA_DeviceAttribute_t *devAttr; if (!IsDeviceValid(device)) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[device]; rc = dmacHw_setDataDescriptor(&devAttr->config, ring->virtAddr, (void *)srcData, (void *)dstData, numBytes); if (rc < 0) { printk(KERN_ERR "dma_add_descriptors: dmacHw_setDataDescriptor failed with code: %d\n", rc); return -ENOMEM; } return 0; }
int dma_calculate_descriptor_count(DMA_Device_t device, /* DMA Device that this will be associated with */ dma_addr_t srcData, /* Place to get data to write to device */ dma_addr_t dstData, /* Pointer to device data address */ size_t numBytes /* Number of bytes to transfer to the device */ ) { int numDescriptors; DMA_DeviceAttribute_t *devAttr; if (!IsDeviceValid(device)) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[device]; numDescriptors = dmacHw_calculateDescriptorCount(&devAttr->config, (void *)srcData, (void *)dstData, numBytes); if (numDescriptors < 0) { printk(KERN_ERR "dma_calculate_descriptor_count: dmacHw_calculateDescriptorCount failed\n"); return -EINVAL; } return numDescriptors; }
int dma_device_is_channel_shared(DMA_Device_t device /* */ ) { DMA_DeviceAttribute_t *devAttr; if (!IsDeviceValid(device)) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[device]; return ((devAttr->flags & DMA_DEVICE_FLAG_IS_DEDICATED) == 0); }
int dma_get_device_descriptor_ring(DMA_Device_t device, /* */ DMA_DescriptorRing_t *ring /* */ ) { DMA_DeviceAttribute_t *devAttr; memset(ring, 0, sizeof(*ring)); if (!IsDeviceValid(device)) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[device]; *ring = devAttr->ring; return 0; }
int dma_set_device_handler(DMA_Device_t dev, /* */ DMA_DeviceHandler_t devHandler, /* */ void *userData /* */ ) { DMA_DeviceAttribute_t *devAttr; unsigned long flags; if (!IsDeviceValid(dev)) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[dev]; local_irq_save(flags); devAttr->userData = userData; devAttr->devHandler = devHandler; local_irq_restore(flags); return 0; }
int dma_set_device_handler(DMA_Device_t dev, /* Device to set the callback for. */ DMA_DeviceHandler_t devHandler, /* Function to call when the DMA completes */ void *userData /* Pointer which will be passed to devHandler. */ ) { DMA_DeviceAttribute_t *devAttr; unsigned long flags; if (!IsDeviceValid(dev)) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[dev]; local_irq_save(flags); devAttr->userData = userData; devAttr->devHandler = devHandler; local_irq_restore(flags); return 0; }