All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Niehusmann <jan@gondor.com>
To: linux-sound@vger.kernel.org
Subject: cmpci spdif in/out
Date: Mon, 29 May 2000 23:44:20 +0000	[thread overview]
Message-ID: <marc-linux-sound-95964476831040@msgid-missing> (raw)

I didn't read this list until yesterday, so I don't know if something 
similar has been discussed here.

The patch below enables S/PDIF input and output on cmi8338 soundcards. 
It's against the current 3.21 cmpci driver from www.cmedia.com.tw.

(lupo@aitek.it provides patches to make it work with 2.3.99-kernels
on http://web.tiscalinet.it/luvassu)

Unfortunately it doesn't give perfect results - a file piped through 
an spdif channel shows lost bytes, duplicated bytes and random corruption.
This corruption can hardly be heard, but I think spidif should allow 
perfect transfers.

Any ideas?

Jan


--- linux/drivers/sound/cmpci.c.orig	Mon May 29 15:29:40 2000
+++ linux/drivers/sound/cmpci.c	Mon May 29 18:03:47 2000
@@ -62,6 +62,7 @@
  *                     Add support for modem, S/PDIF loop and 4 channels.
  *                     (8738 only)
  *                     Fix bug cause x11amp cannot play.
+ *    29.05.00	       Added support for S/PDIF in/out (jan@gondor.com)
  *
  *    28.05.00         Patches for kernel 2.4 compliance (lupo@aitek.it)
  */
@@ -2984,11 +2403,17 @@
 
 #ifdef MODULE
 int	spdif_loop = 0;
+int	spdif_in = 1;
+int	spdif_out = 1;
+int	spdif_32 = 0;
 int	four_ch = 0;
 int	rear_out = 0;
 int	modem = 0;
 int	joystick = 0;
 MODULE_PARM(spdif_loop, "i");
+MODULE_PARM(spdif_in, "i");
+MODULE_PARM(spdif_out, "i");
+MODULE_PARM(spdif_32, "i");
 MODULE_PARM(four_ch, "i");
 MODULE_PARM(rear_out, "i");
 MODULE_PARM(modem, "i");
@@ -2999,6 +2424,15 @@
 #ifdef CONFIG_SOUND_CMPCI_SPDIFLOOP
 int	spdif_loop = 1;
 #endif
+#ifdef CONFIG_SOUND_CMPCI_SPDIFIN
+int	spdif_in = 1;
+#endif
+#ifdef CONFIG_SOUND_CMPCI_SPDIFOUT
+int	spdif_out = 1;
+#endif
+#ifdef CONFIG_SOUND_CMPCI_SPDIF32
+int	spdif_32 = 1;
+#endif
 #ifdef CONFIG_SOUND_CMPCI_4CH
 int	four_ch = 1;
 #endif
@@ -3158,15 +2584,6 @@
 				outb(inb((s->iobase + CODEC_CMI_MISC_CTRL) | 0x80) & ~0x40, s->iobase + CODEC_CMI_MISC_CTRL);
 				printk(KERN_INFO "cm: modem function supported\n");
 			}
-			/* enable SPDIF loop */
-			if (spdif_loop)
-			{
-				/* turn on spdif-in to spdif-out */
-				outb(inb(s->iobase + CODEC_CMI_FUNCTRL1) | 0x80, s->iobase + CODEC_CMI_FUNCTRL1);
-				printk(KERN_INFO "cm: Enable SPDIF loop\n");
-			}
-			else
-				outb(inb(s->iobase + CODEC_CMI_FUNCTRL1) & ~0x80, s->iobase + CODEC_CMI_FUNCTRL1);
 			/* enable 4 channels mode */
 			if (four_ch)
 			{
@@ -3188,6 +2605,41 @@
 			else
 				outb(inb(s->iobase + CODEC_CMI_MISC_CTRL + 3) & ~0x04, s->iobase + CODEC_CMI_MISC_CTRL + 3);
 		}
+		/* enable SPDIF loop */
+		if (spdif_loop)
+		{
+			/* turn on spdif-in to spdif-out */
+			outb(inb(s->iobase + CODEC_CMI_FUNCTRL1) | 0x80, s->iobase + CODEC_CMI_FUNCTRL1);
+			printk(KERN_INFO "cm: Enable SPDIF loop\n");
+		}
+		else
+			outb(inb(s->iobase + CODEC_CMI_FUNCTRL1) & ~0x80, s->iobase + CODEC_CMI_FUNCTRL1);
+		/* enable SPDIF 32-bit-mode (untested) */
+		if (spdif_32)
+		{
+			/* turn on 32 bit (SPD32SEL) */
+			outb(inb(s->iobase + CODEC_CMI_MISC_CTRL + 2) | 0x20, s->iobase + CODEC_CMI_MISC_CTRL + 2);
+			printk(KERN_INFO "cm: Enable SPDIF32 \n");
+		}
+		else
+			outb(inb(s->iobase + CODEC_CMI_MISC_CTRL + 2) & ~0x20, s->iobase + CODEC_CMI_MISC_CTRL + 2);
+		/* enable SPDIF in */
+		if (spdif_in)
+		{
+			/* turn on spdif in */
+			outb(inb(s->iobase + CODEC_CMI_FUNCTRL1 + 1) | 0x02, s->iobase + CODEC_CMI_FUNCTRL1 + 1);
+			printk(KERN_INFO "cm: Enable SPDIF in \n");
+		}
+		else
+			outb(inb(s->iobase + CODEC_CMI_FUNCTRL1 + 1) & ~0x02, s->iobase + CODEC_CMI_FUNCTRL1 + 1);
+		if (spdif_out)
+		{
+			/* turn on spdif out */
+			outb(inb(s->iobase + CODEC_CMI_FUNCTRL1 + 1) | 0x01, s->iobase + CODEC_CMI_FUNCTRL1 + 1);
+			printk(KERN_INFO "cm: Enable SPDIF out \n");
+		}
+		else
+			outb(inb(s->iobase + CODEC_CMI_FUNCTRL1 + 1) & ~0x01, s->iobase + CODEC_CMI_FUNCTRL1 + 1);
 		/* enable joystick */
 		if (joystick)
 			outb(inb(s->iobase + CODEC_CMI_FUNCTRL1) | 0x02, s->iobase + CODEC_CMI_FUNCTRL1);
--- linux/drivers/sound/Config.in.orig	Fri May 12 03:30:14 2000
+++ linux/drivers/sound/Config.in	Mon May 29 15:32:11 2000
@@ -12,6 +12,11 @@
 dep_tristate '  C-Media PCI (CMI8338/8378)' CONFIG_SOUND_CMPCI $CONFIG_SOUND
 if [ "$CONFIG_SOUND_CMPCI" = "y" -o "$CONFIG_SOUND_CMPCI" = "m" ]; then
     bool '    Enable S/PDIF loop for CMI8738' CONFIG_SOUND_CMPCI_SPDIFLOOP
+    bool '    Enable S/PDIF in for CMI8738' CONFIG_SOUND_CMPCI_SPDIFIN
+    bool '    Enable S/PDIF out for CMI8738' CONFIG_SOUND_CMPCI_SPDIFOUT
+    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+	    bool '    Enable S/PDIF 32bit-mode for CMI8738' CONFIG_SOUND_CMPCI_SPDIF32
+    fi
     bool '    Enable 4 channel mode for CMI8738' CONFIG_SOUND_CMPCI_4CH
     if [ "$CONFIG_SOUND_CMPCI_4CH" = "y" ]; then
         bool '    Separate rear out jack' CONFIG_SOUND_CMPCI_REAR

                 reply	other threads:[~2000-05-29 23:44 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=marc-linux-sound-95964476831040@msgid-missing \
    --to=jan@gondor.com \
    --cc=linux-sound@vger.kernel.org \
    /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 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.