Module Name:    src
Committed By:   khorben
Date:           Mon Aug 29 09:04:27 UTC 2022

Modified Files:
        src/sys/dev/pci: emuxki.c

Log Message:
emuxki(4): add support for the Sound Blaster Audigy Rx

This is as per kern/56980. Confirmed working on one out of two different
computers, albeit with a strong hissing noise (same card, different
mainboard). The mixer settings seem to be irrelevant or not supported
though.

Original support inspired by the Linux driver, and confirmed with the
OpenBSD driver, itself originally from NetBSD.

Tested on NetBSD/amd64.


To generate a diff of this commit:
cvs rdiff -u -r1.71 -r1.72 src/sys/dev/pci/emuxki.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/emuxki.c
diff -u src/sys/dev/pci/emuxki.c:1.71 src/sys/dev/pci/emuxki.c:1.72
--- src/sys/dev/pci/emuxki.c:1.71	Sat Feb  6 05:15:03 2021
+++ src/sys/dev/pci/emuxki.c	Mon Aug 29 09:04:27 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: emuxki.c,v 1.71 2021/02/06 05:15:03 isaki Exp $	*/
+/*	$NetBSD: emuxki.c,v 1.72 2022/08/29 09:04:27 khorben Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2007 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: emuxki.c,v 1.71 2021/02/06 05:15:03 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emuxki.c,v 1.72 2022/08/29 09:04:27 khorben Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -139,8 +139,9 @@ struct emuxki_softc {
 		EMUXKI_SBLIVE = 0x00,
 		EMUXKI_AUDIGY = 0x01,
 		EMUXKI_AUDIGY2 = 0x02,
-		EMUXKI_LIVE_5_1 = 0x04,
-		EMUXKI_APS = 0x08
+		EMUXKI_AUDIGY2_VALUE = 0x04,
+		EMUXKI_LIVE_5_1 = 0x08,
+		EMUXKI_APS = 0x10
 	} sc_type;
 	audio_device_t		sc_audv;	/* for GETDEV */
 
@@ -475,6 +476,7 @@ emuxki_match(device_t parent, cfdata_t m
 	case PCI_PRODUCT_CREATIVELABS_SBLIVE:
 	case PCI_PRODUCT_CREATIVELABS_SBLIVE2:
 	case PCI_PRODUCT_CREATIVELABS_AUDIGY:
+	case PCI_PRODUCT_CREATIVELABS_SBAUDIGY4:
 		return 1;
 	default:
 		return 0;
@@ -534,7 +536,13 @@ emuxki_attach(device_t parent, device_t 
 	aprint_normal_dev(self, "interrupting at %s\n", intrstr);
 
 	/* XXX it's unknown whether APS is made from Audigy as well */
-	if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_CREATIVELABS_AUDIGY) {
+	if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_CREATIVELABS_SBAUDIGY4) {
+		sc->sc_type = EMUXKI_AUDIGY;
+		sc->sc_type |= EMUXKI_AUDIGY2;
+		sc->sc_type |= EMUXKI_AUDIGY2_VALUE;
+		strlcpy(sc->sc_audv.name, "Audigy2 (value)",
+		    sizeof(sc->sc_audv.name));
+	} else if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_CREATIVELABS_AUDIGY) {
 		sc->sc_type = EMUXKI_AUDIGY;
 		if (PCI_REVISION(pa->pa_class) == 0x04) {
 			sc->sc_type |= EMUXKI_AUDIGY2;
@@ -703,7 +711,27 @@ emuxki_init(struct emuxki_softc *sc)
 	emuxki_write(sc, 0, EMU_SPCS1, spcs);
 	emuxki_write(sc, 0, EMU_SPCS2, spcs);
 
-	if (sc->sc_type & EMUXKI_AUDIGY2) {
+	if (sc->sc_type & EMUXKI_AUDIGY2_VALUE) {
+		/* Setup SRCMulti_I2S SamplingRate */
+		emuxki_write(sc, 0, EMU_A2_SPDIF_SAMPLERATE,
+		    emuxki_read(sc, 0, EMU_A2_SPDIF_SAMPLERATE) & 0xfffff1ff);
+
+		/* Setup SRCSel (Enable SPDIF, I2S SRCMulti) */
+		emuxki_writeptr(sc, EMU_A2_PTR, EMU_A2_DATA, EMU_A2_SRCSEL,
+		    EMU_A2_SRCSEL_ENABLE_SPDIF | EMU_A2_SRCSEL_ENABLE_SRCMULTI);
+
+		/* Setup SRCMulti Input Audio Enable */
+		emuxki_writeptr(sc, EMU_A2_PTR, EMU_A2_DATA,
+		    0x7b0000, 0xff000000);
+
+		/* Setup SPDIF Out Audio Enable
+		 * The Audigy 2 Value has a separate SPDIF out,
+		 * so no need for a mixer switch */
+		emuxki_writeptr(sc, EMU_A2_PTR, EMU_A2_DATA,
+		    0x7a0000, 0xff000000);
+		emuxki_writeio_4(sc, EMU_A_IOCFG,
+		    emuxki_readio_4(sc, EMU_A_IOCFG) & ~0x8); /* clear bit 3 */
+	} else if (sc->sc_type & EMUXKI_AUDIGY2) {
 		emuxki_write(sc, 0, EMU_A2_SPDIF_SAMPLERATE,
 		    EMU_A2_SPDIF_UNKNOWN);
 
@@ -735,10 +763,12 @@ emuxki_init(struct emuxki_softc *sc)
 	    EMU_INTE_VOLDECRENABLE |
 	    EMU_INTE_MUTEENABLE);
 
-	if (sc->sc_type & EMUXKI_AUDIGY2) {
+	if (sc->sc_type & EMUXKI_AUDIGY2_VALUE) {
+		emuxki_writeio_4(sc, EMU_A_IOCFG,
+		    0x0060 | emuxki_readio_4(sc, EMU_A_IOCFG));
+	} else if (sc->sc_type & EMUXKI_AUDIGY2) {
 		emuxki_writeio_4(sc, EMU_A_IOCFG,
-		    emuxki_readio_4(sc, EMU_A_IOCFG) |
-		        EMU_A_IOCFG_GPOUT0);
+		    EMU_A_IOCFG_GPOUT0 | emuxki_readio_4(sc, EMU_A_IOCFG));
 	}
 
 	/* enable AUDIO bit */

Reply via email to