Modified: trunk/arch/blackfin/kernel/dma-mapping.c (7855 => 7856)
--- trunk/arch/blackfin/kernel/dma-mapping.c 2009-11-21 18:42:01 UTC (rev 7855)
+++ trunk/arch/blackfin/kernel/dma-mapping.c 2009-11-23 03:47:24 UTC (rev 7856)
@@ -93,7 +93,7 @@
}
void *dma_alloc_coherent(struct device *dev, size_t size,
- dma_addr_t * dma_handle, gfp_t gfp)
+ dma_addr_t *dma_handle, gfp_t gfp)
{
void *ret;
@@ -117,18 +117,32 @@
EXPORT_SYMBOL(dma_free_coherent);
/*
- * Dummy functions defined for some existing drivers
+ * Streaming DMA mappings
*/
dma_addr_t
dma_map_single(struct device *dev, void *ptr, size_t size,
enum dma_data_direction direction)
{
- BUG_ON(direction == DMA_NONE);
+ switch (direction) {
+ case DMA_NONE:
+ BUG();
+ case DMA_FROM_DEVICE: /* invalidate only */
+ invalidate_dcache_range((dma_addr_t)ptr,
+ (dma_addr_t)ptr + size);
+ break;
+ case DMA_TO_DEVICE: /* writeback only */
+ flush_dcache_range((dma_addr_t)ptr,
+ (dma_addr_t)ptr + size);
+ break;
+ case DMA_BIDIRECTIONAL: /* writeback and invalidate */
+ flush_dcache_range((dma_addr_t)ptr,
+ (dma_addr_t)ptr + size);
+ invalidate_dcache_range((dma_addr_t)ptr,
+ (dma_addr_t)ptr + size);
+ break;
+ }
- invalidate_dcache_range((unsigned long)ptr,
- (unsigned long)ptr + size);
-
return (dma_addr_t) ptr;
}
EXPORT_SYMBOL(dma_map_single);
@@ -139,14 +153,31 @@
{
int i;
- BUG_ON(direction == DMA_NONE);
-
- for (i = 0; i < nents; i++, sg++) {
- sg->dma_address = (dma_addr_t) sg_virt(sg);
-
- invalidate_dcache_range(sg_dma_address(sg),
- sg_dma_address(sg) +
- sg_dma_len(sg));
+ switch (direction) {
+ case DMA_NONE:
+ BUG();
+ case DMA_FROM_DEVICE: /* invalidate only */
+ for (i = 0; i < nents; i++, sg++) {
+ sg->dma_address = (dma_addr_t) sg_virt(sg);
+ invalidate_dcache_range(sg->dma_address,
+ sg->dma_address + sg_dma_len(sg));
+ }
+ break;
+ case DMA_TO_DEVICE: /* writeback only */
+ for (i = 0; i < nents; i++, sg++) {
+ sg->dma_address = (dma_addr_t) sg_virt(sg);
+ flush_dcache_range(sg->dma_address,
+ sg->dma_address + sg_dma_len(sg));
+ }
+ break;
+ case DMA_BIDIRECTIONAL: /* writeback and invalidate */
+ for (i = 0; i < nents; i++, sg++) {
+ flush_dcache_range(sg->dma_address,
+ sg->dma_address + sg_dma_len(sg));
+ invalidate_dcache_range(sg->dma_address,
+ sg->dma_address + sg_dma_len(sg));
+ }
+ break;
}
return nents;
@@ -156,13 +187,13 @@
void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
enum dma_data_direction direction)
{
- BUG_ON(direction == DMA_NONE);
+ BUG_ON(!valid_dma_direction(direction));
}
EXPORT_SYMBOL(dma_unmap_single);
void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
int nhwentries, enum dma_data_direction direction)
{
- BUG_ON(direction == DMA_NONE);
+ BUG_ON(!valid_dma_direction(direction));
}
EXPORT_SYMBOL(dma_unmap_sg);