All of lore.kernel.org
 help / color / mirror / Atom feed
* emu10k1x patch
@ 2004-05-25  1:00 fmoraes74
  2004-05-25  9:42 ` Takashi Iwai
  0 siblings, 1 reply; 4+ messages in thread
From: fmoraes74 @ 2004-05-25  1:00 UTC (permalink / raw)
  To: alsa-devel

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

A few minor fixes to the emu10k1x driver. Also, it would be nice to update the soundcards page to list it as supported (mention that only PCM playback is currently supported).

I will try to test a few more things before 1.0.5 gets final, I hope.

Francisco

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: emu101x.patch --]
[-- Type: text/x-patch, Size: 779 bytes --]

Index: pci/emu10k1/emu10k1x.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/pci/emu10k1/emu10k1x.c,v
retrieving revision 1.2
diff -r1.2 emu10k1x.c
185c185
<       .channels_min =         1,
---
>       .channels_min =         2,
188,189c188,189
<       .period_bytes_min =     64,
<       .period_bytes_max =     (32*1024),
---
>       .period_bytes_min =     (16*1024),
>       .period_bytes_max =     (16*1024),
732,733c732,733
<       //  snd_emu10k1x_intr_enable(chip, (INTE_CH_0_LOOP<<1);
<       //  snd_emu10k1x_intr_enable(chip, INTE_CH_0_LOOP<<2);
---
>       snd_emu10k1x_intr_enable(chip, (INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP)<<1);>       snd_emu10k1x_intr_enable(chip, (INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP)<<2);

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: emu10k1x patch
  2004-05-25  1:00 fmoraes74
@ 2004-05-25  9:42 ` Takashi Iwai
  0 siblings, 0 replies; 4+ messages in thread
From: Takashi Iwai @ 2004-05-25  9:42 UTC (permalink / raw)
  To: fmoraes74@netzero.net; +Cc: alsa-devel

At Tue, 25 May 2004 01:00:58 GMT,
fmoraes74@netzero.net wrote:
> 
> 188,189c188,189
> <       .period_bytes_min =     64,
> <       .period_bytes_max =     (32*1024),
> ---
> >       .period_bytes_min =     (16*1024),
> >       .period_bytes_max =     (16*1024),

are you sure this change is correct?
in the current code, the period size is always bound to
(buffer_size / 2)  (because periods_min = periods_max = 2).
so you don't have to limit period_bytes or period_size.

> 732,733c732,733
> <       //  snd_emu10k1x_intr_enable(chip, (INTE_CH_0_LOOP<<1);
> <       //  snd_emu10k1x_intr_enable(chip, INTE_CH_0_LOOP<<2);
> ---
> >       snd_emu10k1x_intr_enable(chip, (INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP)<<1);>       snd_emu10k1x_intr_enable(chip, (INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP)<<2);

hmm, it looks redundant.
the second line will override the setting of the first line.
i guess you wanted like the following?

	snd_emu10k1x_intr_enable(chip,
				(INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP)<<1 |
				(INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP)<<2);

Takashi


-------------------------------------------------------
This SF.Net email is sponsored by: Oracle 10g
Get certified on the hottest thing ever to hit the market... Oracle 10g. 
Take an Oracle 10g class now, and we'll give you the exam FREE.
http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: emu10k1x patch
       [not found] <20040525.045231.11598.19656@webmail16.nyc.untd.com>
@ 2004-05-25 12:10 ` Takashi Iwai
  0 siblings, 0 replies; 4+ messages in thread
From: Takashi Iwai @ 2004-05-25 12:10 UTC (permalink / raw)
  To: fmoraes74@netzero.net; +Cc: alsa-devel

At Tue, 25 May 2004 11:52:19 GMT,
fmoraes74@netzero.net wrote:
> 
> 
> > 
> > 188,189c188,189
> > <       .period_bytes_min =     64,
> > <       .period_bytes_max =     (32*1024),
> > ---
> > >       .period_bytes_min =     (16*1024),
> > >       .period_bytes_max =     (16*1024),
> 
> > are you sure this change is correct?
> > in the current code, the period size is always bound to
> > (buffer_size / 2)  (because periods_min = periods_max = 2).
> > so you don't have to limit period_bytes or period_size.
> 
> To me, the result was the same,

well, it should be same casually in your setting...

>  but I thought it would be cleaner
> this way, but I don't care. It seems to work both ways. 

ok.

> 
> > 732,733c732,733
> > <       //  snd_emu10k1x_intr_enable(chip, (INTE_CH_0_LOOP<<1);
> > <       //  snd_emu10k1x_intr_enable(chip, INTE_CH_0_LOOP<<2);
> > ---
> > >       snd_emu10k1x_intr_enable(chip, (INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP)<<1);
> > >       snd_emu10k1x_intr_enable(chip, (INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP)<<2);
> 
> > hmm, it looks redundant.
> > the second line will override the setting of the first line.
> > i guess you wanted like the following?
> 
> >	snd_emu10k1x_intr_enable(chip,
> >			(INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP)<<1 |
> >			(INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP)<<2);
> 
> Both will actually do the samething, because
> snd_emu10k1x_intr_enable will read the current register value and OR
> the requested interrupts to it (same thing is done in the emu10k1
> code, so I just tried to keep it consistent). 

yes, you're right.  i've overseen it.
still it would be better to call once with all or'ed bits.
i'll change the code on CVS, which will go into 1.0.5-rc2.


BTW, at the next time, please post the patch with unified diff style
(diff -u)?


thanks,

Takashi


-------------------------------------------------------
This SF.Net email is sponsored by: Oracle 10g
Get certified on the hottest thing ever to hit the market... Oracle 10g. 
Take an Oracle 10g class now, and we'll give you the exam FREE.
http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click

^ permalink raw reply	[flat|nested] 4+ messages in thread

* emu10k1x patch
@ 2004-07-06 22:04 fmoraes
  0 siblings, 0 replies; 4+ messages in thread
From: fmoraes @ 2004-07-06 22:04 UTC (permalink / raw)
  To: alsa-devel

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

Please commit to CVS with the following changes:
- added support for more periods (up to 512 for playback)
- formatting clean up

Francisco

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

Index: alsa-driver/pci/emu10k1/emu10k1x.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/pci/emu10k1/emu10k1x.c,v
retrieving revision 1.7
diff -u -r1.7 emu10k1x.c
--- alsa-driver/pci/emu10k1/emu10k1x.c	2 Jul 2004 12:09:47 -0000	1.7
+++ alsa-driver/pci/emu10k1/emu10k1x.c	6 Jul 2004 22:02:53 -0000
@@ -77,14 +77,14 @@
 						/* the relevant bits and zero to the other bits	*/
 #define IPR_CH_0_LOOP           0x00000800      /* Channel 0 loop                               */
 #define IPR_CH_0_HALF_LOOP      0x00000100      /* Channel 0 half loop                          */
-#define IPR_CAP_0_LOOP          0x00080000      /* Channel capture loop                               */
-#define IPR_CAP_0_HALF_LOOP     0x00010000      /* Channel capture half loop                          */
+#define IPR_CAP_0_LOOP          0x00080000      /* Channel capture loop                         */
+#define IPR_CAP_0_HALF_LOOP     0x00010000      /* Channel capture half loop                    */
 
 #define INTE			0x0c		/* Interrupt enable register			*/
 #define INTE_CH_0_LOOP          0x00000800      /* Channel 0 loop                               */
 #define INTE_CH_0_HALF_LOOP     0x00000100      /* Channel 0 half loop                          */
-#define INTE_CAP_0_LOOP         0x00080000      /* Channel capture loop                               */
-#define INTE_CAP_0_HALF_LOOP    0x00010000      /* Channel capture half loop                          */
+#define INTE_CAP_0_LOOP         0x00080000      /* Channel capture loop                         */
+#define INTE_CAP_0_HALF_LOOP    0x00010000      /* Channel capture half loop                    */
 
 #define HCFG			0x14		/* Hardware config register			*/
 
@@ -93,6 +93,7 @@
 #define HCFG_AUDIOENABLE	0x00000001	/* 0 = CODECs transmit zero-valued samples	*/
 						/* Should be set to 1 when the EMU10K1 is	*/
 						/* completely initialized.			*/
+#define GPIO			0x18		/* Defaults: 00001080-Analog, 00001000-SPDIF.   */
 
 
 #define AC97DATA		0x1c		/* AC97 register set data register (16 bit)	*/
@@ -102,6 +103,14 @@
 /********************************************************************************************************/
 /* Emu10k1x pointer-offset register set, accessed through the PTR and DATA registers			*/
 /********************************************************************************************************/
+#define PLAYBACK_LIST_ADDR	0x00		/* Base DMA address of a list of pointers to each period/size */
+						/* One list entry: 4 bytes for DMA address, 
+						 * 4 bytes for period_size << 16.
+						 * One list entry is 8 bytes long.
+						 * One list entry for each period in the buffer.
+						 */
+#define PLAYBACK_LIST_SIZE	0x01		/* Size of list in bytes << 16. E.g. 8 periods -> 0x00380000  */
+#define PLAYBACK_LIST_PTR	0x02		/* Pointer to the current period being played */
 #define PLAYBACK_DMA_ADDR	0x04		/* Playback DMA addresss */
 #define PLAYBACK_BUFFER_SIZE	0x05		/* Playback buffer size */
 #define PLAYBACK_POINTER	0x06		/* Playback buffer pointer. Sample currently in DAC */
@@ -158,6 +167,13 @@
 
 #define SPDIF_SELECT		0x45		/* Enables SPDIF or Analogue outputs 0-Analogue, 0x700-SPDIF */
 
+/* This is the MPU port on the card                      					*/
+#define MUDATA		0x47
+#define MUCMD		0x48
+#define MUSTAT		MUCMD
+
+/* From 0x50 - 0x5f, last samples captured */
+
 /**
  * The hardware has 3 channels for playback and 1 for capture.
  *  - channel 0 is the front channel
@@ -217,12 +233,9 @@
 	u32 spdif_bits[3]; // SPDIF out setup
 
 	struct snd_dma_device dma_dev;
-	struct snd_dma_buffer buffer;
+	struct snd_dma_buffer dma_buffer;
 };
 
-#define emu10k1x_t_magic        0xa15a4501
-#define emu10k1x_pcm_t_magic	0xa15a4502
-
 /* hardware definition */
 static snd_pcm_hardware_t snd_emu10k1x_playback_hw = {
 	.info =			(SNDRV_PCM_INFO_MMAP | 
@@ -239,7 +252,7 @@
 	.period_bytes_min =	64,
 	.period_bytes_max =	(16*1024),
 	.periods_min =		2,
-	.periods_max =		2,
+	.periods_max =		512,
 	.fifo_size =		0,
 };
 
@@ -305,6 +318,15 @@
 	spin_unlock_irqrestore(&emu->emu_lock, flags);
 }
 
+static void snd_emu10k1x_gpio_write(emu10k1x_t *emu, unsigned int value)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&emu->emu_lock, flags);
+	outl(value, emu->port + GPIO);
+	spin_unlock_irqrestore(&emu->emu_lock, flags);
+}
+
 static int voice_alloc(emu10k1x_t *emu, emu10k1x_voice_t **rvoice, int id)
 {
 	emu10k1x_voice_t *voice;
@@ -322,7 +344,7 @@
 
 static int snd_emu10k1x_voice_alloc(emu10k1x_t *emu, emu10k1x_voice_t **rvoice, int id)
 {
-  unsigned long flags;
+	unsigned long flags;
 	int result;
   
 	snd_assert(rvoice != NULL, return -EINVAL);
@@ -368,7 +390,7 @@
 	if (epcm->substream == NULL)
 		return;
 #if 0
-	snd_printk("IRQ: position = 0x%x, period = 0x%x, size = 0x%x\n",
+	snd_printk(KERN_INFO "IRQ: position = 0x%x, period = 0x%x, size = 0x%x\n",
 		   epcm->substream->ops->pointer(epcm->substream),
 		   snd_pcm_lib_period_bytes(epcm->substream),
 		   snd_pcm_lib_buffer_bytes(epcm->substream));
@@ -432,6 +454,7 @@
 
 	if (runtime->private_data == NULL)
 		return 0;
+	
 	epcm = runtime->private_data;
 
 	if (epcm->voice) {
@@ -449,21 +472,23 @@
 	snd_pcm_runtime_t *runtime = substream->runtime;
 	emu10k1x_pcm_t *epcm = runtime->private_data;
 	int voice = epcm->voice->number;
-	unsigned int value;
-
-	snd_emu10k1x_ptr_write(emu, 0x00, voice, 0);
-	snd_emu10k1x_ptr_write(emu, 0x01, voice, 0);
-	snd_emu10k1x_ptr_write(emu, 0x02, voice, 0);
+	u32 *table_base = (u32 *)(emu->dma_buffer.area+4096*voice);
+	u32 period_size_bytes = frames_to_bytes(runtime, runtime->period_size);
+	int i;
+	
+	for(i=0; i < runtime->periods; i++) {
+		*table_base++=runtime->dma_addr+(i*period_size_bytes);
+		*table_base++=period_size_bytes<<16;
+	}
+ 
+	snd_emu10k1x_ptr_write(emu, PLAYBACK_LIST_ADDR, voice, emu->dma_buffer.addr+4096*voice);
+	snd_emu10k1x_ptr_write(emu, PLAYBACK_LIST_SIZE, voice, (runtime->periods - 1) << 19);
+	snd_emu10k1x_ptr_write(emu, PLAYBACK_LIST_PTR, voice, 0);
 	snd_emu10k1x_ptr_write(emu, PLAYBACK_DMA_ADDR, voice, runtime->dma_addr);
 	snd_emu10k1x_ptr_write(emu, PLAYBACK_BUFFER_SIZE, voice, frames_to_bytes(runtime, runtime->buffer_size)<<16); // buffer size in bytes
 	snd_emu10k1x_ptr_write(emu, PLAYBACK_POINTER, voice, 0);
 	snd_emu10k1x_ptr_write(emu, 0x07, voice, 0);
 	snd_emu10k1x_ptr_write(emu, 0x08, voice, 0);
-	value = snd_emu10k1x_ptr_read(emu, ROUTING, 0);
-	value |= 3 << (2*voice);
-	if(voice == 2)
-	  value |= 0x10000; // enable center/lfe channel this way
-	snd_emu10k1x_ptr_write(emu, ROUTING, 0, value);
 
 	return 0;
 }
@@ -478,7 +503,7 @@
 	int channel = epcm->voice->number;
 	int result = 0;
 
-//	snd_printk("trigger - emu10k1x = 0x%x, cmd = %i, pointer = %d\n", (int)emu, cmd, (int)substream->ops->pointer(substream));
+//	snd_printk(KERN_INFO "trigger - emu10k1x = 0x%x, cmd = %i, pointer = %d\n", (int)emu, cmd, (int)substream->ops->pointer(substream));
 
 	switch (cmd) {
 	case SNDRV_PCM_TRIGGER_START:
@@ -503,19 +528,24 @@
 	emu10k1x_t *emu = snd_pcm_substream_chip(substream);
 	snd_pcm_runtime_t *runtime = substream->runtime;
 	emu10k1x_pcm_t *epcm = runtime->private_data;
-	unsigned int ptr = 0;
 	int channel = epcm->voice->number;
+	snd_pcm_uframes_t ptr = 0, ptr1 = 0, ptr2= 0,ptr3 = 0,ptr4 = 0;
 
 	if (!epcm->running)
 		return 0;
 
-//	snd_printk("pointer: %08X\n", 
-//		   snd_emu10k1x_ptr_read(emu, PLAYBACK_POINTER, channel));
-	ptr = bytes_to_frames(runtime, snd_emu10k1x_ptr_read(emu, PLAYBACK_POINTER, channel));
+	ptr3 = snd_emu10k1x_ptr_read(emu, PLAYBACK_LIST_PTR, channel);
+	ptr1 = snd_emu10k1x_ptr_read(emu, PLAYBACK_POINTER, channel);
+	ptr4 = snd_emu10k1x_ptr_read(emu, PLAYBACK_LIST_PTR, channel);
+	
+	if (ptr3 != ptr4) 
+		ptr1 = snd_emu10k1x_ptr_read(emu, PLAYBACK_POINTER, channel);
+	ptr2 = bytes_to_frames(runtime, ptr1);
+	ptr2 += (ptr4 >> 3) * runtime->period_size;
+	ptr = ptr2;
 	if (ptr >= runtime->buffer_size)
 		ptr -= runtime->buffer_size;
 
-//	snd_printk("ptr = 0x%x, buffer_size = 0x%x, period_size = 0x%x, bits=%d, rate=%d\n", ptr, (int)runtime->buffer_size, (int)runtime->period_size, (int)runtime->frame_bits, (int)runtime->rate);
 	return ptr;
 }
 
@@ -541,7 +571,7 @@
 	epcm = kcalloc(1, sizeof(*epcm), GFP_KERNEL);
 	if (epcm == NULL) {
 		return -ENOMEM;
-        }
+	}
 	epcm->emu = chip;
 	epcm->substream = substream;
   
@@ -561,7 +591,7 @@
 
 /* hw_params callback */
 static int snd_emu10k1x_pcm_hw_params_capture(snd_pcm_substream_t *substream,
-				      snd_pcm_hw_params_t * hw_params)
+					      snd_pcm_hw_params_t * hw_params)
 {
 	snd_pcm_runtime_t *runtime = substream->runtime;
 	emu10k1x_pcm_t *epcm = runtime->private_data;
@@ -605,7 +635,7 @@
 {
 	emu10k1x_t *emu = snd_pcm_substream_chip(substream);
 	snd_pcm_runtime_t *runtime = substream->runtime;
-	//	snd_printk("prepare: rate=%d, format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, frames_to_bytes=%d\n",runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size,  frames_to_bytes(runtime, 1));
+
 	snd_emu10k1x_ptr_write(emu, CAPTURE_DMA_ADDR, 0, runtime->dma_addr);
 	snd_emu10k1x_ptr_write(emu, CAPTURE_BUFFER_SIZE, 0, frames_to_bytes(runtime, runtime->buffer_size)<<16); // buffer size in bytes
 	snd_emu10k1x_ptr_write(emu, CAPTURE_POINTER, 0, 0);
@@ -615,7 +645,7 @@
 
 /* trigger_capture callback */
 static int snd_emu10k1x_pcm_trigger_capture(snd_pcm_substream_t *substream,
-				    int cmd)
+					    int cmd)
 {
 	emu10k1x_t *emu = snd_pcm_substream_chip(substream);
 	snd_pcm_runtime_t *runtime = substream->runtime;
@@ -726,6 +756,12 @@
 	// release the irq
 	if (chip->irq >= 0)
 		free_irq(chip->irq, (void *)chip);
+
+	// release the DMA
+	if (chip->dma_buffer.area) {
+		snd_dma_free_pages(&chip->dma_dev, &chip->dma_buffer);
+	}
+
 	// release the data
 	kfree(chip);
 	return 0;
@@ -779,7 +815,7 @@
 
 	spin_unlock(&chip->emu_lock);
 
-//	snd_printk("interrupt %08x\n", status);
+//	snd_printk(KERN_INFO "interrupt %08x\n", status);
 
 	return IRQ_HANDLED;
 }
@@ -801,7 +837,7 @@
 	if (rpcm)
 		*rpcm = NULL;
 	if (device == 0)
-	  capture = 1;
+		capture = 1;
 	
 	if ((err = snd_pcm_new(emu->card, "emu10k1x", device, 1, capture, &pcm)) < 0)
 		return err;
@@ -811,27 +847,27 @@
 	
 	switch(device) {
 	case 0:
-	  snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_emu10k1x_playback_ops);
-	  snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_emu10k1x_capture_ops);
-	  break;
+		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_emu10k1x_playback_ops);
+		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_emu10k1x_capture_ops);
+		break;
 	case 1:
 	case 2:
-	  snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_emu10k1x_playback_ops);
-	  break;
+		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_emu10k1x_playback_ops);
+		break;
 	}
 
 	pcm->info_flags = 0;
 	pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX;
 	switch(device) {
 	case 0:
-	  strcpy(pcm->name, "EMU10K1X Front");
-	  break;
+		strcpy(pcm->name, "EMU10K1X Front");
+		break;
 	case 1:
-	  strcpy(pcm->name, "EMU10K1X Rear");
-	  break;
+		strcpy(pcm->name, "EMU10K1X Rear");
+		break;
 	case 2:
-	  strcpy(pcm->name, "EMU10K1X Center/LFE");
-	  break;
+		strcpy(pcm->name, "EMU10K1X Center/LFE");
+		break;
 	}
 	emu->pcm = pcm;
 
@@ -892,9 +928,9 @@
   
 	chip->port = pci_resource_start(pci, 0);
 	if ((chip->res_port = request_region(chip->port, 8,
-					     "My Chip")) == NULL) { 
+					     "EMU10K1X")) == NULL) { 
 		snd_emu10k1x_free(chip);
-		snd_printk("cannot allocate the port\n");
+		snd_printk(KERN_ERR "cannot allocate the port\n");
 		return -EBUSY;
 	}
 
@@ -902,7 +938,7 @@
 			SA_INTERRUPT|SA_SHIRQ, "EMU10K1X",
 			(void *)chip)) {
 		snd_emu10k1x_free(chip);
-		snd_printk("cannot grab irq\n");
+		snd_printk(KERN_ERR "cannot grab irq\n");
 		return -EBUSY;
 	}
 	chip->irq = pci->irq;
@@ -910,8 +946,8 @@
 	memset(&chip->dma_dev, 0, sizeof(chip->dma_dev));
 	chip->dma_dev.type = SNDRV_DMA_TYPE_DEV;
 	chip->dma_dev.dev = snd_dma_pci_data(pci);
-  
-	if(snd_dma_alloc_pages(&chip->dma_dev, 32 * 1024, &chip->buffer) < 0) {
+
+	if(snd_dma_alloc_pages(&chip->dma_dev, 32 * 1024, &chip->dma_buffer) < 0) {
 		snd_emu10k1x_free(chip);
 		return -ENOMEM;
 	}
@@ -921,7 +957,7 @@
 	pci_read_config_byte(pci, PCI_REVISION_ID, (char *)&chip->revision);
 	pci_read_config_dword(pci, PCI_SUBSYSTEM_VENDOR_ID, &chip->serial);
 	pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &chip->model);
-	snd_printk("Model %04x Rev %08x Serial %08x\n", chip->model,
+	snd_printk(KERN_INFO "Model %04x Rev %08x Serial %08x\n", chip->model,
 		   chip->revision, chip->serial);
 
 	outl(0, chip->port + INTE);	
@@ -965,14 +1001,14 @@
 			       0x00000000 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT);
 
 	snd_emu10k1x_ptr_write(chip, SPDIF_SELECT, 0, 0x700); // disable SPDIF
-	// verify the next line
-	snd_emu10k1x_ptr_write(chip, ROUTING, 0, 0x10000); // routing
+	snd_emu10k1x_ptr_write(chip, ROUTING, 0, 0x1003F); // routing
+	snd_emu10k1x_gpio_write(chip, 0x1080); // analog mode
 
 	outl(HCFG_LOCKSOUNDCACHE|HCFG_AUDIOENABLE, chip->port+HCFG);
 
-	snd_emu10k1x_intr_enable(chip, (INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP) |
-				 ((INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP)<<1) |
-				 ((INTE_CH_0_LOOP|INTE_CH_0_HALF_LOOP)<<2) |
+	snd_emu10k1x_intr_enable(chip, INTE_CH_0_LOOP |
+				 (INTE_CH_0_LOOP<<1) |
+				 (INTE_CH_0_LOOP<<2) |
 				 (INTE_CAP_0_LOOP|INTE_CAP_0_HALF_LOOP));
 
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL,
@@ -1016,16 +1052,17 @@
 					snd_info_buffer_t *buffer)
 {
 	emu10k1x_t *emu = entry->private_data;
-        char line[64];
-        unsigned int reg, channel_id , val;
-        while (!snd_info_get_line(buffer, line, sizeof(line))) {
-                if (sscanf(line, "%x %x %x", &reg, &channel_id, &val) != 3)
-                        continue;
-		
-                if ((reg < 0x49) && (reg >=0) && (val <= 0xffffffff) 
+	char line[64];
+	unsigned int reg, channel_id , val;
+
+	while (!snd_info_get_line(buffer, line, sizeof(line))) {
+		if (sscanf(line, "%x %x %x", &reg, &channel_id, &val) != 3)
+			continue;
+
+		if ((reg < 0x49) && (reg >=0) && (val <= 0xffffffff) 
 		    && (channel_id >=0) && (channel_id <= 2) )
 			snd_emu10k1x_ptr_write(emu, reg, channel_id, val);
-        }
+	}
 }
 
 static int __devinit snd_emu10k1x_proc_init(emu10k1x_t * emu)
@@ -1052,17 +1089,17 @@
 }
 
 static int snd_emu10k1x_shared_spdif_get(snd_kcontrol_t * kcontrol,
-					snd_ctl_elem_value_t * ucontrol)
+					 snd_ctl_elem_value_t * ucontrol)
 {
 	emu10k1x_t *emu = snd_kcontrol_chip(kcontrol);
 
 	ucontrol->value.integer.value[0] = (snd_emu10k1x_ptr_read(emu, SPDIF_SELECT, 0) == 0x700) ? 0 : 1;
 
-        return 0;
+	return 0;
 }
 
 static int snd_emu10k1x_shared_spdif_put(snd_kcontrol_t * kcontrol,
-					snd_ctl_elem_value_t * ucontrol)
+					 snd_ctl_elem_value_t * ucontrol)
 {
 	emu10k1x_t *emu = snd_kcontrol_chip(kcontrol);
 	unsigned int val;
@@ -1073,11 +1110,15 @@
 	if (val) {
 		// enable spdif output
 		snd_emu10k1x_ptr_write(emu, SPDIF_SELECT, 0, 0x000);
+		snd_emu10k1x_ptr_write(emu, ROUTING, 0, 0x700);
+		snd_emu10k1x_gpio_write(emu, 0x1000);
 	} else {
 		// disable spdif output
 		snd_emu10k1x_ptr_write(emu, SPDIF_SELECT, 0, 0x700);
+		snd_emu10k1x_ptr_write(emu, ROUTING, 0, 0x1003F);
+		snd_emu10k1x_gpio_write(emu, 0x1080);
 	}
-        return change;
+	return change;
 }
 
 static snd_kcontrol_new_t snd_emu10k1x_shared_spdif __devinitdata =
@@ -1097,7 +1138,7 @@
 }
 
 static int snd_emu10k1x_spdif_get(snd_kcontrol_t * kcontrol,
-                                 snd_ctl_elem_value_t * ucontrol)
+				  snd_ctl_elem_value_t * ucontrol)
 {
 	emu10k1x_t *emu = snd_kcontrol_chip(kcontrol);
 	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
@@ -1106,21 +1147,21 @@
 	ucontrol->value.iec958.status[1] = (emu->spdif_bits[idx] >> 8) & 0xff;
 	ucontrol->value.iec958.status[2] = (emu->spdif_bits[idx] >> 16) & 0xff;
 	ucontrol->value.iec958.status[3] = (emu->spdif_bits[idx] >> 24) & 0xff;
-        return 0;
+	return 0;
 }
 
 static int snd_emu10k1x_spdif_get_mask(snd_kcontrol_t * kcontrol,
-				      snd_ctl_elem_value_t * ucontrol)
+				       snd_ctl_elem_value_t * ucontrol)
 {
 	ucontrol->value.iec958.status[0] = 0xff;
 	ucontrol->value.iec958.status[1] = 0xff;
 	ucontrol->value.iec958.status[2] = 0xff;
 	ucontrol->value.iec958.status[3] = 0xff;
-        return 0;
+	return 0;
 }
 
 static int snd_emu10k1x_spdif_put(snd_kcontrol_t * kcontrol,
-                                 snd_ctl_elem_value_t * ucontrol)
+				  snd_ctl_elem_value_t * ucontrol)
 {
 	emu10k1x_t *emu = snd_kcontrol_chip(kcontrol);
 	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
@@ -1128,42 +1169,42 @@
 	unsigned int val;
 
 	val = (ucontrol->value.iec958.status[0] << 0) |
-	      (ucontrol->value.iec958.status[1] << 8) |
-	      (ucontrol->value.iec958.status[2] << 16) |
-	      (ucontrol->value.iec958.status[3] << 24);
+		(ucontrol->value.iec958.status[1] << 8) |
+		(ucontrol->value.iec958.status[2] << 16) |
+		(ucontrol->value.iec958.status[3] << 24);
 	change = val != emu->spdif_bits[idx];
 	if (change) {
 		snd_emu10k1x_ptr_write(emu, SPCS0 + idx, 0, val);
 		emu->spdif_bits[idx] = val;
 	}
-        return change;
+	return change;
 }
 
 static snd_kcontrol_new_t snd_emu10k1x_spdif_mask_control =
 {
 	.access =	SNDRV_CTL_ELEM_ACCESS_READ,
-        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
-        .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
+	.iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
+	.name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
 	.count =	3,
-        .info =         snd_emu10k1x_spdif_info,
-        .get =          snd_emu10k1x_spdif_get_mask
+	.info =         snd_emu10k1x_spdif_info,
+	.get =          snd_emu10k1x_spdif_get_mask
 };
 
 static snd_kcontrol_new_t snd_emu10k1x_spdif_control =
 {
-        .iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
-        .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
+	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
+	.name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
 	.count =	3,
-        .info =         snd_emu10k1x_spdif_info,
-        .get =          snd_emu10k1x_spdif_get,
-        .put =          snd_emu10k1x_spdif_put
+	.info =         snd_emu10k1x_spdif_info,
+	.get =          snd_emu10k1x_spdif_get,
+	.put =          snd_emu10k1x_spdif_put
 };
 
 static int __devinit snd_emu10k1x_mixer(emu10k1x_t *emu)
 {
-        int err;
-        snd_kcontrol_t *kctl;
-        snd_card_t *card = emu->card;
+	int err;
+	snd_kcontrol_t *kctl;
+	snd_card_t *card = emu->card;
 
 	if ((kctl = snd_ctl_new1(&snd_emu10k1x_spdif_mask_control, emu)) == NULL)
 		return -ENOMEM;
@@ -1178,7 +1219,7 @@
 	if ((err = snd_ctl_add(card, kctl)))
 		return err;
 
-        return 0;
+	return 0;
 }
 
 static int __devinit snd_emu10k1x_probe(struct pci_dev *pci,
@@ -1227,7 +1268,7 @@
 		snd_card_free(card);
 		return err;
 	}
-
+	
 	snd_emu10k1x_proc_init(chip);
 
 	strcpy(card->driver, "EMU10K1X");
@@ -1285,5 +1326,5 @@
 
 module_init(alsa_card_emu10k1x_init)
 module_exit(alsa_card_emu10k1x_exit)
-     
+
 EXPORT_NO_SYMBOLS; /* for old kernels only */

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2004-07-06 22:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20040525.045231.11598.19656@webmail16.nyc.untd.com>
2004-05-25 12:10 ` emu10k1x patch Takashi Iwai
2004-07-06 22:04 fmoraes
  -- strict thread matches above, loose matches on Subject: below --
2004-05-25  1:00 fmoraes74
2004-05-25  9:42 ` Takashi Iwai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.