Title: [3882] trunk/sound/soc/blackfin: bug[#3597] revert the hooking tx dummy buffer way to former version one
Revision
3882
Author
cliff
Date
2007-11-16 00:55:34 -0600 (Fri, 16 Nov 2007)

Log Message

bug[#3597] revert the hooking tx dummy buffer way to former version one 

Diffstat

 bf5xx-pcm.c   |    4 ----
 bf5xx-sport.c |   42 +++++++++++++++++++-----------------------
 bf5xx-sport.h |    4 ----
 3 files changed, 19 insertions(+), 31 deletions(-)

Modified Paths

Diff

Modified: trunk/sound/soc/blackfin/bf5xx-pcm.c (3881 => 3882)


--- trunk/sound/soc/blackfin/bf5xx-pcm.c	2007-11-16 04:57:56 UTC (rev 3881)
+++ trunk/sound/soc/blackfin/bf5xx-pcm.c	2007-11-16 06:55:34 UTC (rev 3882)
@@ -75,10 +75,6 @@
 	struct sport_device *sport = runtime->private_data;
 
 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-		/*Don't re-config descriptor when it is to be hooked to dummy*/
-		if (sport->wait_dummy_tx == 1) {
-			return 0;
-		}
 		sport_set_tx_callback(sport, bf5xx_dma_irq, substream);
 		sport_config_tx_dma(sport, runtime->dma_area, runtime->periods,
 				runtime->period_size * sizeof(struct ac97_frame));

Modified: trunk/sound/soc/blackfin/bf5xx-sport.c (3881 => 3882)


--- trunk/sound/soc/blackfin/bf5xx-sport.c	2007-11-16 04:57:56 UTC (rev 3881)
+++ trunk/sound/soc/blackfin/bf5xx-sport.c	2007-11-16 06:55:34 UTC (rev 3882)
@@ -165,11 +165,6 @@
 
 	disable_dma(sport->dma_rx_chan);
 	disable_dma(sport->dma_tx_chan);
-	if (sport->bak_tx_desc_p) {
-		*sport->bak_tx_desc_p = sport->bak_tx_desc;
-		sport->bak_tx_desc_p = NULL;
-	}
-	sport->wait_dummy_tx = 0;
 	return 0;
 }
 
@@ -296,24 +291,32 @@
 
 static inline int sport_hook_tx_dummy(struct sport_device *sport)
 {
-	struct dmasg *desc;
+	struct dmasg *desc, temp_desc;
 	unsigned long flags;
 
 	BUG_ON(sport->dummy_tx_desc == NULL);
+	BUG_ON(sport->curr_tx_desc == sport->dummy_tx_desc);
+
 	sport->dummy_tx_desc->next_desc_addr = \
 			(unsigned long)sport->dummy_tx_desc;
+
 	/* Shorten the time on last normal descriptor */
 	local_irq_save(flags);
 	desc = (struct dmasg *)get_dma_next_desc_ptr(sport->dma_tx_chan);
-	sport->bak_tx_desc_p = desc;
-	sport->bak_tx_desc = *desc;
-	desc->x_count = 0xa;
-	desc->start_addr = sport->dummy_tx_desc->start_addr;
 	/* Store the descriptor which will be damaged */
+	temp_desc = *desc;
+	desc->x_count = 0xa;
+	desc->y_count = 0;
 	desc->next_desc_addr = (unsigned long)(sport->dummy_tx_desc);
 	local_irq_restore(flags);
 	/* Waiting for dummy buffer descriptor is already hooked*/
-	sport->wait_dummy_tx = 1;
+	while ((get_dma_curr_desc_ptr(sport->dma_tx_chan) - \
+			sizeof(struct dmasg)) != \
+			(unsigned long)sport->dummy_tx_desc) {}
+	sport->curr_tx_desc = sport->dummy_tx_desc;
+	/* Restore the damaged descriptor */
+	*desc = temp_desc;
+
 	return 0;
 }
 
@@ -326,10 +329,14 @@
 		return -EBUSY;
 
 	if (sport->rx_run) {
+		BUG_ON(sport->dma_tx_desc == NULL);
+		BUG_ON(sport->curr_tx_desc != sport->dummy_tx_desc);
+		/* Hook the normal buffer descriptor */
 		local_irq_save(flags);
 		sport->dummy_tx_desc->next_desc_addr = \
-			(unsigned long)(sport->dma_tx_desc);
+				(unsigned long)(sport->dma_tx_desc);
 		local_irq_restore(flags);
+		sport->curr_tx_desc = sport->dma_tx_desc;
 	} else {
 		sport_tx_dma_start(sport, 0);
 		/* Let rx dma run the dummy buffer */
@@ -699,17 +706,6 @@
 		return IRQ_HANDLED;
 	}
 
-	if (sport->wait_dummy_tx) {
-		ptr = get_dma_next_desc_ptr(sport->dma_tx_chan);
-		if (ptr == (unsigned long)sport->dummy_tx_desc) {
-			if (sport->bak_tx_desc_p) {
-				*sport->bak_tx_desc_p = sport->bak_tx_desc;
-				sport->bak_tx_desc_p = NULL;
-				sport->wait_dummy_tx = 0;
-			}
-		}
-	}
-
 	if (sport->tx_callback) {
 		sport->tx_callback(sport->tx_data);
 		return IRQ_HANDLED;

Modified: trunk/sound/soc/blackfin/bf5xx-sport.h (3881 => 3882)


--- trunk/sound/soc/blackfin/bf5xx-sport.h	2007-11-16 04:57:56 UTC (rev 3881)
+++ trunk/sound/soc/blackfin/bf5xx-sport.h	2007-11-16 06:55:34 UTC (rev 3882)
@@ -115,10 +115,6 @@
 	void (*err_callback)(void *data);
 	void *err_data;
 
-	struct dmasg *bak_tx_desc_p;
-	struct dmasg bak_tx_desc;
-	unsigned int wait_dummy_tx:1;
-
 	void *private_data;
 };
 
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
http://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to