summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/isa/cs4232.c179
-rw-r--r--sys/dev/isa/cs4232.h5
-rw-r--r--sys/dev/isa/files.isapnp3
-rw-r--r--sys/dev/isa/isapnp.c41
4 files changed, 226 insertions, 2 deletions
diff --git a/sys/dev/isa/cs4232.c b/sys/dev/isa/cs4232.c
new file mode 100644
index 00000000000..b1419747888
--- /dev/null
+++ b/sys/dev/isa/cs4232.c
@@ -0,0 +1,179 @@
+/*
+ * ISA PnP bus autoconfiguration.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/malloc.h>
+
+#include <machine/bus.h>
+
+
+#include <dev/isa/isavar.h>
+#include <dev/isa/isadmavar.h>
+
+#include "cs4232.h"
+
+#ifdef CONFIG_CS4232
+int probe_cs4232 __P((void));
+
+/* a note about the CS4232 stuff. its really pretty bad. if you dont have a
+ * CS4232 or compatible then you should really (really) turn off CONFIG_CS4232.
+ * i dont THINK that this will do any damage, but who knows? its really a
+ * bad fix. (also note, in order for it to work it assumes that you have a
+ * io port 534-537 clear as well as irq 5 and dma 0,1 all free.
+ * this is all really lousy also. if it crashes your machine, sorry.
+ */
+
+/*
+ * sound/cs4232.c
+ *
+ * The low level driver for Crystal CS4232 based cards. The CS4232 is a PnP
+ * compatible chip which contains a CS4231A codec, SB emulation, a MPU401
+ * compatible MIDI port, joystick and synthesizer and IDE CD-ROM interfaces.
+ * This is just a temporary driver until full PnP support gets inplemented.
+ * Just the WSS codec, FM synth and the MIDI ports are supported. Other
+ * interfaces are left uninitialized.
+ *
+ * Copyright by Hannu Savolainen 1995
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer. 2.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+
+
+#define KEY_PORT 0x279 /* Same as LPT1 status port */
+#define CSN_NUM 0x01 /* Just a random number */
+
+#define CS_OUT(a) outb( KEY_PORT, a)
+#define CS_OUT2(a, b) {CS_OUT(a);CS_OUT(b);}
+#define CS_OUT3(a, b, c) {CS_OUT(a);CS_OUT(b);CS_OUT(c);}
+
+
+
+static unsigned char crystal_key[] = /* A 32 byte magic key sequence */
+{
+ 0x96, 0x35, 0x9a, 0xcd, 0xe6, 0xf3, 0x79, 0xbc,
+ 0x5e, 0xaf, 0x57, 0x2b, 0x15, 0x8a, 0xc5, 0xe2,
+ 0xf1, 0xf8, 0x7c, 0x3e, 0x9f, 0x4f, 0x27, 0x13,
+ 0x09, 0x84, 0x42, 0xa1, 0xd0, 0x68, 0x34, 0x1a
+};
+
+int
+probe_cs4232(void)
+{
+ int i;
+
+ /*
+ * Verify that the I/O port range is free.
+ */
+
+ if (0) {
+ printf("cs4232.c: I/O port 0x534 not free\n");
+ return 0;
+ }
+ /*
+ * This version of the driver doesn't use the PnP method when
+ * configuring the card but a simplified method defined by Crystal.
+ * This means that just one CS4232 compatible device can exist on the
+ * system. Also this method conflicts with possible PnP support in
+ * the OS. For this reason driver is just a temporary kludge.
+ */
+
+ /*
+ * Wake up the card by sending a 32 byte Crystal key to the key port.
+ */
+ for (i = 0; i < 32; i++)
+ CS_OUT(crystal_key[i]);
+
+ /*
+ * Now set the CSN (Card Select Number).
+ */
+
+/* CS_OUT2(0x06, 0x01); */
+
+ /*
+ * Ensure that there is no other codec using the same address.
+ */
+
+ CS_OUT2(0x15, 0x00); /* Select logical device 0 (WSS/SB/FM) */
+
+ /*
+ * Then set some config bytes. First logical device 0
+ */
+
+ CS_OUT3(0x47, 0x05, 0x34); /* WSSbase */
+
+ if (0) /* Not free */
+ CS_OUT3(0x48, 0x03, 0x88) /* FMbase off */
+ else
+ CS_OUT3(0x48, 0x03, 0x88); /* FMbase 0x388 */
+
+ CS_OUT3(0x42, 0x02, 0x20); /* SBbase off */
+ CS_OUT2(0x22, 0x05); /* SB+WSS IRQ */
+ CS_OUT2(0x2a, 0x01); /* SB+WSS DMA */
+
+ if (0)
+ CS_OUT2(0x25, 0x00) /* WSS DMA2 */
+ else
+ CS_OUT2(0x25, 0x00); /* No WSS DMA2 */
+
+ CS_OUT2(0x33, 0x01); /* Activate logical dev 0 */
+
+/*
+ * init logical device 2...
+ *
+ */
+ CS_OUT2(0x15,0x02);
+ CS_OUT3(0x47,0x01,0x20);
+ CS_OUT2(0x33,0x01);
+
+
+/*
+* Initialize logical device 3 (MPU)
+*/
+
+#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI)
+ if (mpu_base != 0 && mpu_irq != 0) {
+ CS_OUT2(0x15, 0x03); /* Select logical device 3 (MPU) */
+ CS_OUT3(0x47, (mpu_base >> 8) & 0xff, mpu_base & 0xff); /* MPUbase */
+ CS_OUT2(0x22, mpu_irq); /* MPU IRQ */
+ CS_OUT2(0x33, 0x01); /* Activate logical dev 3 */
+}
+#endif
+
+/*
+* Finally activate the chip
+*/
+ CS_OUT(0x79);
+
+/*
+* Then try to detect the codec part of the chip
+*/
+ delay(15000);
+
+ outb(0x534,0x40); /* this seems to be needed... */
+ return 1;
+}
+
+#endif
diff --git a/sys/dev/isa/cs4232.h b/sys/dev/isa/cs4232.h
new file mode 100644
index 00000000000..8180eef23c9
--- /dev/null
+++ b/sys/dev/isa/cs4232.h
@@ -0,0 +1,5 @@
+/* $OpenBSD: cs4232.h,v 1.1 1999/03/04 08:57:34 deraadt Exp $ */
+
+#ifdef CONFIG_CS4232
+int probe_cs4232 __P((void));
+#endif
diff --git a/sys/dev/isa/files.isapnp b/sys/dev/isa/files.isapnp
index 0387427240a..5da8da7a42e 100644
--- a/sys/dev/isa/files.isapnp
+++ b/sys/dev/isa/files.isapnp
@@ -1,4 +1,4 @@
-# $OpenBSD: files.isapnp,v 1.12 1999/03/02 08:12:45 deraadt Exp $
+# $OpenBSD: files.isapnp,v 1.13 1999/03/04 08:57:34 deraadt Exp $
# $NetBSD: files.isapnp,v 1.7 1997/10/16 17:16:36 matt Exp $
#
# Config file and device description for machine-independent ISAPnP code.
@@ -28,6 +28,7 @@ file dev/isa/sb_isapnp.c sb & (sb_isa | sb_isapnp) needs-flag
attach wss at isapnp with wss_isapnp
file dev/isa/wss_isapnp.c wss & (wss_isa | wss_isapnp) needs-flag
+file dev/isa/cs4232.c wss_isapnp
attach le at isapnp with le_isapnp
file dev/isa/if_le_isapnp.c le_isapnp
diff --git a/sys/dev/isa/isapnp.c b/sys/dev/isa/isapnp.c
index e9b8dabaee9..79bc15688a7 100644
--- a/sys/dev/isa/isapnp.c
+++ b/sys/dev/isa/isapnp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: isapnp.c,v 1.23 1999/01/11 01:57:53 millert Exp $ */
+/* $OpenBSD: isapnp.c,v 1.24 1999/03/04 08:57:34 deraadt Exp $ */
/* $NetBSD: isapnp.c,v 1.9.4.3 1997/10/29 00:40:43 thorpej Exp $ */
/*
@@ -48,6 +48,10 @@
#include <dev/isa/pnpdevs.h>
+#ifdef CONFIG_CS4232
+#include <dev/isa/cs4232.h>
+#endif
+
void isapnp_init __P((struct isapnp_softc *));
static __inline u_char isapnp_shift_bit __P((struct isapnp_softc *));
int isapnp_findcard __P((struct isapnp_softc *));
@@ -813,6 +817,38 @@ isapnp_isa_attach_hook(isa_sc)
if (isapnp_map(&sc))
return;
+#ifdef CONFIG_CS4232
+ /*
+ * XXX XXX
+ * This a totally disgusting hack, but I can't figure out another way.
+ * It seems that many CS audio chips have a bug (as far as I can
+ * understand). The reset below does not really reset the chip, it
+ * remains in a catatonic state and will not respond when probed.
+ * The chip can be used both as a WSS and as a SB device, and a
+ * single read at the WSS address (0x534) takes it out of this
+ * non-responsive state.
+ * The read has to happen at this point in time (or earlier) so
+ * it cannot be moved to the wss_isapnp.c driver.
+ * (BTW, We're not alone in having problems with these chips:
+ * Windoze 98 couldn't detect the sound chip on a Dell when I tried.)
+ *
+ * Lennart Augustsson <augustss@netbsd.org>
+ *
+ * (Implementation from John Kohl <jtk@kolvir.arlington.ma.us>)
+ */
+ {
+ bus_space_handle_t ioh;
+ int rv;
+
+ if ((rv = bus_space_map(sc.sc_iot, 0x534, 1, 0, &ioh)) == 0) {
+ DPRINTF(("wss probe kludge\n"));
+ (void)bus_space_read_1(sc.sc_iot, ioh, 0);
+ bus_space_unmap(sc.sc_iot, ioh, 1);
+ } else {
+ DPRINTF(("wss probe kludge failed to map: %d\n", rv));
+ }
+ }
+#endif
isapnp_init(&sc);
isapnp_write_reg(&sc, ISAPNP_CONFIG_CONTROL, ISAPNP_CC_RESET_DRV);
@@ -838,6 +874,9 @@ isapnp_match(parent, match, aux)
sc.sc_ncards = 0;
(void) strcpy(sc.sc_dev.dv_xname, "(isapnp probe)");
+#ifdef CONFIG_CS4232
+ probe_cs4232();
+#endif
if (isapnp_map(&sc))
return 0;