[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-omap
Subject:    [PATCH] Experimental DMA support for 24xx MMC
From:       tony () atomide ! com (Tony Lindgren)
Date:       2005-10-31 18:38:56
Message-ID: 20051101003842.GH16511 () atomide ! com
[Download RAW message or body]

Hi all,

Here's an ugly test patch for 24xx DMA using MMC. 

I'm getting occasional cache failures with this patch, so corruption
might happen :)

I'll look into the cache failures more during this week.

Regards,

Tony
-------------- next part --------------
diff --git a/drivers/mmc/omap.c b/drivers/mmc/omap.c
index 7b39a45..03c376d 100644
Index: linux-omap-dev/drivers/mmc/omap.c
===================================================================
--- linux-omap-dev.orig/drivers/mmc/omap.c	2005-10-28 10:14:03.000000000 -0700
+++ linux-omap-dev/drivers/mmc/omap.c	2005-10-31 16:08:13.000000000 -0800
@@ -677,9 +677,9 @@
 	u16 buf, frame;
 	u32 count;
 	struct scatterlist *sg = &data->sg[host->sg_idx];
+	int sync_dev = 0;
 
-	data_addr = virt_to_phys((void __force *) host->base)
-				+ OMAP_MMC_REG_DATA;
+	data_addr = io_v2p((void __force *) host->base) + OMAP_MMC_REG_DATA;
 	frame = 1 << data->blksz_bits;
 	count = sg_dma_len(sg);
 
@@ -702,28 +702,68 @@
 
 	if (!(data->flags & MMC_DATA_WRITE)) {
 		buf = 0x800f | ((frame - 1) << 8);
-		omap_set_dma_src_params(dma_ch, OMAP_DMA_PORT_TIPB,
-					OMAP_DMA_AMODE_CONSTANT,
-					data_addr,
-					0, 0);
-		omap_set_dma_dest_params(dma_ch, OMAP_DMA_PORT_EMIFF,
-					OMAP_DMA_AMODE_POST_INC,
-					sg_dma_address(sg),
-					0, 0);
-		omap_set_dma_dest_data_pack(dma_ch, 1);
-		omap_set_dma_dest_burst_mode(dma_ch, OMAP_DMA_DATA_BURST_4);
+
+		if (cpu_class_is_omap1()) {
+			omap_set_dma_src_params(dma_ch, OMAP_DMA_PORT_TIPB,
+						OMAP_DMA_AMODE_CONSTANT,
+						data_addr,
+						0, 0);
+			omap_set_dma_dest_params(dma_ch, OMAP_DMA_PORT_EMIFF,
+						 OMAP_DMA_AMODE_POST_INC,
+						 sg_dma_address(sg),
+						 0, 0);
+			omap_set_dma_dest_data_pack(dma_ch, 1);
+			omap_set_dma_dest_burst_mode(dma_ch,
+						     OMAP_DMA_DATA_BURST_4);
+		}
+
+		if (cpu_is_omap24xx()) {
+			sync_dev = OMAP24XX_DMA_MMC1_RX;
+			omap_set_dma_src_params(dma_ch, 0,
+						OMAP_DMA_AMODE_CONSTANT,
+						data_addr,
+						0, 0);
+			omap_set_dma_dest_params(dma_ch, 0,
+						 OMAP_DMA_AMODE_POST_INC,
+						 sg_dma_address(sg),
+						 0, 0);
+			omap_set_dma_dest_data_pack(dma_ch, 1);
+			omap_set_dma_dest_burst_mode(dma_ch,
+						     OMAP_DMA_DATA_BURST_4);
+		}
+
 	} else {
 		buf = 0x0f80 | ((frame - 1) << 0);
-		omap_set_dma_dest_params(dma_ch, OMAP_DMA_PORT_TIPB,
-					OMAP_DMA_AMODE_CONSTANT,
-					data_addr,
-					0, 0);
-		omap_set_dma_src_params(dma_ch, OMAP_DMA_PORT_EMIFF,
-					OMAP_DMA_AMODE_POST_INC,
-					sg_dma_address(sg),
-					0, 0);
-		omap_set_dma_src_data_pack(dma_ch, 1);
-		omap_set_dma_src_burst_mode(dma_ch, OMAP_DMA_DATA_BURST_4);
+
+		if (cpu_class_is_omap1()) {
+			omap_set_dma_dest_params(dma_ch, OMAP_DMA_PORT_TIPB,
+						 OMAP_DMA_AMODE_CONSTANT,
+						 data_addr,
+						 0, 0);
+			omap_set_dma_src_params(dma_ch, OMAP_DMA_PORT_EMIFF,
+						OMAP_DMA_AMODE_POST_INC,
+						sg_dma_address(sg),
+						0, 0);
+			omap_set_dma_src_data_pack(dma_ch, 1);
+			omap_set_dma_src_burst_mode(dma_ch,
+						    OMAP_DMA_DATA_BURST_4);
+		}
+
+		if (cpu_is_omap24xx()) {
+			sync_dev = OMAP24XX_DMA_MMC1_TX;
+			omap_set_dma_dest_params(dma_ch, 0,
+						 OMAP_DMA_AMODE_CONSTANT,
+						 data_addr,
+						 0, 0);
+			omap_set_dma_src_params(dma_ch, 0,
+						OMAP_DMA_AMODE_POST_INC,
+						sg_dma_address(sg),
+						0, 0);
+			omap_set_dma_src_data_pack(dma_ch, 1);
+			omap_set_dma_src_burst_mode(dma_ch,
+						    OMAP_DMA_DATA_BURST_4);
+
+		}
 	}
 
 	/* Max limit for DMA frame count is 0xffff */
@@ -731,9 +771,10 @@
 		BUG();
 
 	OMAP_MMC_WRITE(host->base, BUF, buf);
+
 	omap_set_dma_transfer_params(dma_ch, OMAP_DMA_DATA_TYPE_S16,
-			frame, count, OMAP_DMA_SYNC_FRAME,
-			0, 0);
+				     frame, count, OMAP_DMA_SYNC_FRAME,
+				     sync_dev, 0);
 }
 
 /* a scatterlist segment completed */
@@ -763,7 +804,15 @@
 		if ((ch_status & ~OMAP_DMA_SYNC_IRQ))
 			pr_debug("MMC%d: DMA channel status: %04x\n",
 			       host->id, ch_status);
-		return;
+
+		/*
+		 * REVISIT: On omap1 the status should be 0x20, on 2420
+		 * it can be 0x00
+		 */
+#if 0
+		if (cpu_class_is_omap1())
+			return;
+#endif
 	}
 	mmcdat->bytes_xfered += host->dma_len;
 
@@ -1211,12 +1260,7 @@
 	host->power_pin = minfo->power_pin;
 	host->switch_pin = minfo->switch_pin;
 	host->wp_pin = minfo->wp_pin;
-
-	/* FIXME: Remove once DMA works on 24xx */
-	if (cpu_is_omap24xx())
-		host->use_dma = 0;
-	else
-		host->use_dma = 1;
+	host->use_dma = 1;
 	host->dma_ch = -1;
 
 	host->irq = pdev->resource[1].start;

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic