public inbox for linux-omap@vger.kernel.org
 help / color / mirror / Atom feed
From: Dirk Behme <dirk.behme@de.bosch.com>
To: linux-omap-open-source@linux.omap.com
Subject: Re: Problem with ALSA in 2.6.14-omap2 on OSK
Date: Mon, 28 Nov 2005 10:55:40 +0100	[thread overview]
Message-ID: <438AD41C.4090006@de.bosch.com> (raw)
In-Reply-To: <4389F0EB.6000404@de.bosch.com>

[-- Attachment #1: Type: text/plain, Size: 878 bytes --]

Dirk Behme wrote:
> Yves Godin wrote:
>  > The files from the alsa driver have not changed between 2.6.14-rc1 and
>  > 2.6.14-omap2. So I supposed the changes have been made to the OMAP dma
>  > drivers.
> 
> Looks to me that it is something in DMA as well.

Next step ;) Looking into sound/oss/omap-audio-dma-intfc.c I found that
there is done much more stuff than in sound/arm/omap-alsa-dma.c. So, I
put the ping pong work item logic from OSS DMA to ALSA DMA as well. And
looks like this fixes the issue of repeated audio samples :)

Please test. I use 'madplay foo.mp3' for tests.

But unfortunately, now there seems to be some noise over the (now
unrepeated) audio output.

Any ideas about that?

Note: For tests, first apply alsa_dma.patch, which includes Ajaya Babu
L/R fix (reposted here, same as in the last mail), then apply
alsa_fix_repeat.patch.

Many thanks

Dirk



[-- Attachment #2: alsa_dma.patch --]
[-- Type: text/plain, Size: 3412 bytes --]

--- ./sound/arm/omap-aic23.c_orig	2005-11-25 20:24:14.782887816 +0100
+++ ./sound/arm/omap-aic23.c	2005-11-25 20:42:10.552346000 +0100
@@ -34,6 +34,8 @@
  *
  * 2005-07-29   INdT Kernel Team - Alsa driver for omap osk. Creation of new 
  *                                 file omap-aic23.c
+ *
+ * 2005-11-25   Dirk Behme      - Added L/R Channel Interchange fix as proposed by Ajaya Babu
  */
 
 #include <linux/config.h>
@@ -156,6 +158,20 @@ static snd_pcm_hw_constraint_list_t hw_c
 	.mask = 0,
 };
 
+/*
+ * HW interface start and stop helper functions
+ */
+static int audio_ifc_start(void)
+{
+	omap_mcbsp_start(AUDIO_MCBSP); 
+	return 0;
+}
+
+static int audio_ifc_stop(void)
+{
+	omap_mcbsp_stop(AUDIO_MCBSP);
+	return 0;
+}
 
 /*
  * Codec/mcbsp init and configuration section
@@ -243,12 +259,20 @@ static void omap_aic23_audio_init(struct
 	    SNDRV_PCM_STREAM_PLAYBACK;
 	omap_aic23->s[SNDRV_PCM_STREAM_PLAYBACK].dma_dev =
 	    OMAP_DMA_MCBSP1_TX;
+	omap_aic23->s[SNDRV_PCM_STREAM_PLAYBACK].hw_start =
+	    audio_ifc_start;
+	omap_aic23->s[SNDRV_PCM_STREAM_PLAYBACK].hw_stop =
+	    audio_ifc_stop;
 
 	omap_aic23->s[SNDRV_PCM_STREAM_CAPTURE].id = "Alsa AIC23 in";
 	omap_aic23->s[SNDRV_PCM_STREAM_CAPTURE].stream_id =
 	    SNDRV_PCM_STREAM_CAPTURE;
 	omap_aic23->s[SNDRV_PCM_STREAM_CAPTURE].dma_dev =
 	    OMAP_DMA_MCBSP1_RX;
+	omap_aic23->s[SNDRV_PCM_STREAM_CAPTURE].hw_start =
+	    audio_ifc_start;
+	omap_aic23->s[SNDRV_PCM_STREAM_CAPTURE].hw_stop =
+	    audio_ifc_stop;
 
 	/* configuring the McBSP */
 	omap_mcbsp_request(AUDIO_MCBSP);
--- ./sound/arm/omap-aic23.h_orig	2005-11-25 20:28:02.368289576 +0100
+++ ./sound/arm/omap-aic23.h	2005-11-25 20:38:02.210099760 +0100
@@ -33,7 +33,8 @@
  *  2005/07/25 INdT-10LE Kernel Team - 	Alsa driver for omap osk,
  *  					original version based in sa1100 driver
  *  					and omap oss driver.
- *  
+ *
+ *  2005-11-25   Dirk Behme      - Added L/R Channel Interchange fix as proposed by Ajaya Babu
  */
 
 #ifndef __OMAP_AIC23_H
@@ -85,6 +86,8 @@ struct audio_stream {
 	snd_pcm_substream_t *stream;	/* the pcm stream */
 	unsigned linked:1;	/* dma channels linked */
 	int offset;		/* store start position of the last period in the alsa buffer */
+        int (*hw_start)(void);  /* interface to start HW interface, e.g. McBSP */
+        int (*hw_stop)(void);   /* interface to stop HW interface, e.g. McBSP */
 };
 
 /*
--- ./sound/arm/omap-alsa-dma.c_orig	2005-11-24 17:13:48.000000000 +0100
+++ ./sound/arm/omap-alsa-dma.c	2005-11-25 20:46:58.328597360 +0100
@@ -34,7 +34,9 @@
  * 2005-07-19	INdT Kernel Team - Alsa port. Creation of new file omap-alsa-dma.c based in
  * 				   omap-audio-dma-intfc.c oss file. Support for aic23 codec.
  * 				   Removal of buffer handling (Alsa does that), modifications
- * 				   in dma handling and port to alsa structures. 
+ * 				   in dma handling and port to alsa structures.
+ *
+ * 2005-11-25   Dirk Behme      - Added L/R Channel Interchange fix as proposed by Ajaya Babu
  */
 
 #include <linux/config.h>
@@ -356,8 +358,10 @@ static int audio_start_dma_chain(struct 
 	int channel = s->lch[s->dma_q_head];
 	FN_IN;
 	if (!s->started) {
+	        s->hw_stop();            /* stops McBSP Interface */ 
 		omap_start_dma(channel);
 		s->started = 1;
+		s->hw_start();           /* start McBSP interface */ 
 	}
 	/* else the dma itself will progress forward with out our help */
 	FN_OUT(0);


[-- Attachment #3: alsa_fix_repeat.patch --]
[-- Type: text/plain, Size: 2893 bytes --]

--- ./sound/arm/omap-alsa-dma.c_orig	2005-11-28 09:58:01.601413144 +0100
+++ ./sound/arm/omap-alsa-dma.c	2005-11-28 10:41:38.272618656 +0100
@@ -37,6 +37,8 @@
  * 				   in dma handling and port to alsa structures.
  *
  * 2005-11-25   Dirk Behme      - Added L/R Channel Interchange fix as proposed by Ajaya Babu
+ *
+ * 2005-11-28   Dirk Behme      - Fix DMA issues that all 5-10s a short audio part is repeated
  */
 
 #include <linux/config.h>
@@ -55,6 +57,7 @@
 #include <linux/sysrq.h>
 #include <linux/interrupt.h>
 #include <linux/dma-mapping.h>
+#include <linux/completion.h>
 
 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -126,7 +129,23 @@
 
 static spinlock_t dma_list_lock = SPIN_LOCK_UNLOCKED;
 
+struct audio_isr_work_item {
+	int current_lch;
+	u16 ch_status;
+	struct audio_stream *s;
+};
+
+static char work_item_running = 0;
 static char nr_linked_channels = 1;
+static struct audio_isr_work_item work1, work2;
+
+/*********************************** MODULE SPECIFIC FUNCTIONS PROTOTYPES *************/
+
+static void audio_dsr_handler(unsigned long);
+static DECLARE_TASKLET(audio_isr_work1, audio_dsr_handler,
+		(unsigned long)&work1);
+static DECLARE_TASKLET(audio_isr_work2, audio_dsr_handler,
+		(unsigned long)&work2);
 
 /*********************************** MODULE SPECIFIC FUNCTIONS ***********************/
 
@@ -414,6 +433,33 @@ int omap_start_sound_dma(struct audio_st
 
 }
 
+/***************************************************************************************
+ *
+ * ISR related functions
+ *
+ **************************************************************************************/
+/* The work item handler */
+static void audio_dsr_handler(unsigned long inData)
+{
+	void *data = (void *)inData;
+	struct audio_isr_work_item *work = data;
+	struct audio_stream *s = (work->s);
+
+	FN_IN;
+	DPRINTK("lch=%d,status=0x%x, data=%p as=%p\n", sound_curr_lch,
+		ch_status, data, s);
+	if (AUDIO_QUEUE_EMPTY(s)) {
+		FN_OUT(-1);
+		return;
+	}
+
+	AUDIO_INCREMENT_HEAD(s);	/* Empty the queue */
+
+	/* Try to fill again */
+	audio_dma_callback(s);
+	FN_OUT(0);
+}
+
 /* 
  * ISRs have to be short and smart.. 
  * Here we call alsa handling, after some error checking
@@ -438,8 +484,26 @@ static void sound_dma_irq_handler(int so
 		return;
 	}
 
-	if (ch_status & DCSR_END_BLOCK) 
-		audio_dma_callback(s);
+	if (AUDIO_QUEUE_LAST(s))
+		omap_audio_stop_dma(s);
+
+	/* Start the work item  - we ping pong the work items */
+	if (!work_item_running) {
+		work1.current_lch = sound_curr_lch;
+		work1.ch_status = ch_status;
+		work1.s = s;
+		/* schedule tasklet 1 */
+		tasklet_schedule(&audio_isr_work1);
+		work_item_running = 1;
+	} else {
+		work2.current_lch = sound_curr_lch;
+		work2.ch_status = ch_status;
+		work2.s = s;
+		/* schedule tasklet 2 */
+		tasklet_schedule(&audio_isr_work2);
+		work_item_running = 0;
+	}
+
 	FN_OUT(0);
 	return;
 }


[-- Attachment #4: Type: text/plain, Size: 0 bytes --]



  reply	other threads:[~2005-11-28  9:55 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-11-23 16:36 Problem with ALSA in 2.6.14-omap2 on OSK Menon, Nishanth
2005-11-23 16:45 ` Tony Lindgren
2005-11-27 17:46   ` Dirk Behme
2005-11-28  9:55     ` Dirk Behme [this message]
2005-12-12 19:34       ` Daniel Petrini
2005-12-12 19:14     ` Daniel Petrini
2005-12-13 15:47       ` Dirk Behme
  -- strict thread matches above, loose matches on Subject: below --
2005-12-13 16:18 Menon, Nishanth
     [not found] <42848A5C5A0D1E47B026E644DD49B08E683708@mail>
2005-11-23 16:10 ` Dirk Behme

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=438AD41C.4090006@de.bosch.com \
    --to=dirk.behme@de.bosch.com \
    --cc=linux-omap-open-source@linux.omap.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox