Title: [7856] trunk/arch/blackfin/kernel/dma-mapping.c: task [#4617], fulfill streaming DMA mapping in blackfin
Revision
7856
Author
bhsong
Date
2009-11-22 22:47:24 -0500 (Sun, 22 Nov 2009)

Log Message

task [#4617], fulfill streaming DMA mapping in blackfin

Modified Paths

Diff

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);
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to