xref: /netbsd-src/sys/dev/isa/gus.c (revision de1dfb1250df962f1ff3a011772cf58e605aed11)
1 /*	$NetBSD: gus.c,v 1.83 2004/04/22 00:17:12 itojun Exp $	*/
2 
3 /*-
4  * Copyright (c) 1996, 1999 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Ken Hornstein and John Kohl.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *        This product includes software developed by the NetBSD
21  *	  Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 /*
40  *
41  * TODO:
42  *	. figure out why mixer activity while sound is playing causes problems
43  *	  (phantom interrupts?)
44  *  	. figure out a better deinterleave strategy that avoids sucking up
45  *	  CPU, memory and cache bandwidth.  (Maybe a special encoding?
46  *	  Maybe use the double-speed sampling/hardware deinterleave trick
47  *	  from the GUS SDK?)  A 486/33 isn't quite fast enough to keep
48  *	  up with 44.1kHz 16-bit stereo output without some drop-outs.
49  *	. use CS4231 for 16-bit sampling, for A-law and mu-law playback.
50  *	. actually test full-duplex sampling(recording) and playback.
51  */
52 
53 /*
54  * Gravis UltraSound driver
55  *
56  * For more detailed information, see the GUS developers' kit
57  * available on the net at:
58  *
59  * http://www.gravis.com/Public/sdk/GUSDK222.ZIP
60  *
61  *		See ultrawrd.doc inside--it's MS Word (ick), but it's the bible
62  *
63  */
64 
65 /*
66  * The GUS Max has a slightly strange set of connections between the CS4231
67  * and the GF1 and the DMA interconnects.  It's set up so that the CS4231 can
68  * be playing while the GF1 is loading patches from the system.
69  *
70  * Here's a recreation of the DMA interconnect diagram:
71  *
72  *       GF1
73  *   +---------+				 digital
74  *   |         |  record			 ASIC
75  *   |         |--------------+
76  *   |         |              |		       +--------+
77  *   |         | play (dram)  |      +----+    |	|
78  *   |         |--------------(------|-\  |    |   +-+  |
79  *   +---------+              |      |  >-|----|---|C|--|------  DMA chan 1
80  *                            |  +---|-/  |    |   +-+ 	|
81  *                            |  |   +----+    |    |   |
82  *                            |	 |   +----+    |    |   |
83  *   +---------+        +-+   +--(---|-\  |    |    |   |
84  *   |         | play   |8|      |   |  >-|----|----+---|------  DMA chan 2
85  *   | ---C----|--------|/|------(---|-/  |    |        |
86  *   |    ^    |record  |1|      |   +----+    |	|
87  *   |    |    |   /----|6|------+   	       +--------+
88  *   | ---+----|--/     +-+
89  *   +---------+
90  *     CS4231   	8-to-16 bit bus conversion, if needed
91  *
92  *
93  * "C" is an optional combiner.
94  *
95  */
96 
97 #include <sys/cdefs.h>
98 __KERNEL_RCSID(0, "$NetBSD: gus.c,v 1.83 2004/04/22 00:17:12 itojun Exp $");
99 
100 #include "gus.h"
101 #if NGUS > 0
102 
103 #include <sys/param.h>
104 #include <sys/systm.h>
105 #include <sys/callout.h>
106 #include <sys/errno.h>
107 #include <sys/ioctl.h>
108 #include <sys/syslog.h>
109 #include <sys/device.h>
110 #include <sys/proc.h>
111 #include <sys/buf.h>
112 #include <sys/fcntl.h>
113 #include <sys/malloc.h>
114 #include <sys/kernel.h>
115 
116 #include <machine/cpu.h>
117 #include <machine/intr.h>
118 #include <machine/bus.h>
119 #include <machine/cpufunc.h>
120 #include <sys/audioio.h>
121 #include <dev/audio_if.h>
122 #include <dev/mulaw.h>
123 #include <dev/auconv.h>
124 
125 #include <dev/isa/isavar.h>
126 #include <dev/isa/isadmavar.h>
127 
128 #include <dev/ic/ics2101reg.h>
129 #include <dev/ic/cs4231reg.h>
130 #include <dev/ic/ad1848reg.h>
131 #include <dev/isa/ics2101var.h>
132 #include <dev/isa/ad1848var.h>
133 #include <dev/isa/cs4231var.h>
134 #include "gusreg.h"
135 
136 #ifdef AUDIO_DEBUG
137 #define STATIC /* empty; for debugging symbols */
138 #else
139 #define STATIC static
140 #endif
141 
142 /*
143  * Software state of a single "voice" on the GUS
144  */
145 
146 struct gus_voice {
147 
148 	/*
149 	 * Various control bits
150 	 */
151 
152 	unsigned char voccntl;	/* State of voice control register */
153 	unsigned char volcntl;	/* State of volume control register */
154 	unsigned char pan_pos;	/* Position of volume panning (4 bits) */
155 	int rate;		/* Sample rate of voice being played back */
156 
157 	/*
158 	 * Address of the voice data into the GUS's DRAM.  20 bits each
159 	 */
160 
161 	u_long start_addr;	/* Starting address of voice data loop area */
162 	u_long end_addr;	/* Ending address of voice data loop */
163 	u_long current_addr;	/* Beginning address of voice data
164 				   (start playing here) */
165 
166 	/*
167 	 * linear volume values for the GUS's volume ramp.  0-511 (9 bits).
168 	 * These values must be translated into the logarithmic values using
169 	 * gus_log_volumes[]
170 	 */
171 
172 	int start_volume;	/* Starting position of volume ramp */
173 	int current_volume;	/* Current position of volume on volume ramp */
174 	int end_volume;		/* Ending position of volume on volume ramp */
175 };
176 
177 /*
178  * Software state of GUS
179  */
180 
181 struct gus_softc {
182 	struct device sc_dev;		/* base device */
183 	void *sc_ih;			/* interrupt vector */
184 	bus_space_tag_t sc_iot;		/* tag */
185 	isa_chipset_tag_t sc_ic;	/* ISA chipset info */
186 	bus_space_handle_t sc_ioh1;	/* handle */
187 	bus_space_handle_t sc_ioh2;	/* handle */
188 	bus_space_handle_t sc_ioh3;	/* ICS2101 handle */
189 	bus_space_handle_t sc_ioh4;	/* MIDI handle */
190 
191 	struct callout sc_dmaout_ch;
192 
193 	int sc_iobase;			/* I/O base address */
194 	int sc_irq;			/* IRQ used */
195 	int sc_playdrq;			/* DMA channel for play */
196 	bus_size_t sc_play_maxsize;	/* DMA size for play */
197 	int sc_recdrq;			/* DMA channel for recording */
198 	bus_size_t sc_req_maxsize;	/* DMA size for recording */
199 
200 	int sc_flags;			/* Various flags about the GUS */
201 #define GUS_MIXER_INSTALLED	0x01	/* An ICS mixer is installed */
202 #define GUS_LOCKED		0x02	/* GUS is busy doing multi-phase DMA */
203 #define GUS_CODEC_INSTALLED	0x04	/* CS4231 installed/MAX */
204 #define GUS_PLAYING		0x08	/* GUS is playing a voice */
205 #define GUS_DMAOUT_ACTIVE	0x10	/* GUS is busy doing audio DMA */
206 #define GUS_DMAIN_ACTIVE	0x20	/* GUS is busy sampling  */
207 #define GUS_OPEN		0x100	/* GUS is open */
208 	int sc_dsize;			/* Size of GUS DRAM */
209 	int sc_voices;			/* Number of active voices */
210 	u_char sc_revision;		/* Board revision of GUS */
211 	u_char sc_mixcontrol;		/* Value of GUS_MIX_CONTROL register */
212 
213 	u_long sc_orate;		/* Output sampling rate */
214 	u_long sc_irate;		/* Input sampling rate */
215 
216 	int sc_encoding;		/* Current data encoding type */
217 	int sc_precision;		/* # of bits of precision */
218 	int sc_channels;		/* Number of active channels */
219 	int sc_blocksize;		/* Current blocksize */
220 	int sc_chanblocksize;		/* Current blocksize for each in-use
221 					   channel */
222 	short sc_nbufs;			/* how many on-GUS bufs per-channel */
223 	short sc_bufcnt;		/* how many need to be played */
224 	void *sc_deintr_buf;		/* deinterleave buffer for stereo */
225 
226 	int sc_ogain;			/* Output gain control */
227 	u_char sc_out_port;		/* Current out port (generic only) */
228 	u_char sc_in_port;		/* keep track of it when no codec */
229 
230 	void (*sc_dmaoutintr) __P((void*)); /* DMA completion intr handler */
231 	void *sc_outarg;		/* argument for sc_dmaoutintr() */
232 	u_char *sc_dmaoutaddr;		/* for isa_dmadone */
233 	u_long sc_gusaddr;		/* where did we just put it? */
234 	int sc_dmaoutcnt;		/* for isa_dmadone */
235 
236 	void (*sc_dmainintr) __P((void*)); /* DMA completion intr handler */
237 	void *sc_inarg;			/* argument for sc_dmaoutintr() */
238 	u_char *sc_dmainaddr;		/* for isa_dmadone */
239 	int sc_dmaincnt;		/* for isa_dmadone */
240 
241 	struct stereo_dma_intr {
242 		void (*intr)__P((void *));
243 		void *arg;
244 		u_char *buffer;
245 		u_long dmabuf;
246 		int size;
247 		int flags;
248 	} sc_stereo;
249 
250 	/*
251 	 * State information for linear audio layer
252 	 */
253 
254 	int sc_dmabuf;			/* Which ring buffer we're DMA'ing to */
255 	int sc_playbuf;			/* Which ring buffer we're playing */
256 
257 	/*
258 	 * Voice information array.  All voice-specific information is stored
259 	 * here
260 	 */
261 
262 	struct gus_voice sc_voc[32];	/* Voice data for each voice */
263 	union {
264 		struct ics2101_softc sc_mixer_u;
265 		struct ad1848_isa_softc sc_codec_u;
266 	} u;
267 #define sc_mixer u.sc_mixer_u
268 #define sc_codec u.sc_codec_u
269 };
270 
271 struct ics2101_volume {
272 	u_char left;
273 	u_char right;
274 };
275 
276 #define HAS_CODEC(sc) ((sc)->sc_flags & GUS_CODEC_INSTALLED)
277 #define HAS_MIXER(sc) ((sc)->sc_flags & GUS_MIXER_INSTALLED)
278 
279 /*
280  * Mixer devices for ICS2101
281  */
282 /* MIC IN mute, line in mute, line out mute are first since they can be done
283    even if no ICS mixer. */
284 #define GUSICS_MIC_IN_MUTE		0
285 #define GUSICS_LINE_IN_MUTE		1
286 #define GUSICS_MASTER_MUTE		2
287 #define GUSICS_CD_MUTE			3
288 #define GUSICS_DAC_MUTE			4
289 #define GUSICS_MIC_IN_LVL		5
290 #define GUSICS_LINE_IN_LVL		6
291 #define GUSICS_CD_LVL			7
292 #define GUSICS_DAC_LVL			8
293 #define GUSICS_MASTER_LVL		9
294 
295 #define GUSICS_RECORD_SOURCE		10
296 
297 /* Classes */
298 #define GUSICS_INPUT_CLASS		11
299 #define GUSICS_OUTPUT_CLASS		12
300 #define GUSICS_RECORD_CLASS		13
301 
302 /*
303  * Mixer & MUX devices for CS4231
304  */
305 #define GUSMAX_MONO_LVL			0 /* mic input to MUX;
306 					     also mono mixer input */
307 #define GUSMAX_DAC_LVL			1 /* input to MUX; also mixer input */
308 #define GUSMAX_LINE_IN_LVL		2 /* input to MUX; also mixer input */
309 #define GUSMAX_CD_LVL			3 /* mixer input only */
310 #define GUSMAX_MONITOR_LVL		4 /* digital mix (?) */
311 #define GUSMAX_OUT_LVL			5 /* output level. (?) */
312 #define GUSMAX_SPEAKER_LVL		6 /* pseudo-device for mute */
313 #define GUSMAX_LINE_IN_MUTE		7 /* pre-mixer */
314 #define GUSMAX_DAC_MUTE			8 /* pre-mixer */
315 #define GUSMAX_CD_MUTE			9 /* pre-mixer */
316 #define GUSMAX_MONO_MUTE		10 /* pre-mixer--microphone/mono */
317 #define GUSMAX_MONITOR_MUTE		11 /* post-mixer level/mute */
318 #define GUSMAX_SPEAKER_MUTE		12 /* speaker mute */
319 
320 #define GUSMAX_REC_LVL			13 /* post-MUX gain */
321 
322 #define GUSMAX_RECORD_SOURCE		14
323 
324 /* Classes */
325 #define GUSMAX_INPUT_CLASS		15
326 #define GUSMAX_RECORD_CLASS		16
327 #define GUSMAX_MONITOR_CLASS		17
328 #define GUSMAX_OUTPUT_CLASS		18
329 
330 #ifdef AUDIO_DEBUG
331 #define GUSPLAYDEBUG	/*XXX*/
332 #define DPRINTF(x)	if (gusdebug) printf x
333 #define DMAPRINTF(x)	if (gusdmadebug) printf x
334 int	gusdebug = 0;
335 int	gusdmadebug = 0;
336 #else
337 #define DPRINTF(x)
338 #define DMAPRINTF(x)
339 #endif
340 int	gus_dostereo = 1;
341 
342 #define NDMARECS 2048
343 #ifdef GUSPLAYDEBUG
344 int	gusstats = 0;
345 struct dma_record {
346     struct timeval tv;
347     u_long gusaddr;
348     caddr_t bsdaddr;
349     u_short count;
350     u_char channel;
351     u_char direction;
352 } dmarecords[NDMARECS];
353 
354 int dmarecord_index = 0;
355 #endif
356 
357 /*
358  * local routines
359  */
360 
361 int	gusopen __P((void *, int));
362 void	gusclose __P((void *));
363 void	gusmax_close __P((void *));
364 int	gusintr __P((void *));
365 int	gus_set_in_gain __P((caddr_t, u_int, u_char));
366 int	gus_get_in_gain __P((caddr_t));
367 int	gus_set_out_gain __P((caddr_t, u_int, u_char));
368 int	gus_get_out_gain __P((caddr_t));
369 int 	gus_set_params __P((void *, int, int, struct audio_params *, struct audio_params *));
370 int 	gusmax_set_params __P((void *, int, int, struct audio_params *, struct audio_params *));
371 int	gus_round_blocksize __P((void *, int));
372 int	gus_commit_settings __P((void *));
373 int	gus_dma_output __P((void *, void *, int, void (*)(void *), void *));
374 int	gus_dma_input __P((void *, void *, int, void (*)(void *), void *));
375 int	gus_halt_out_dma __P((void *));
376 int	gus_halt_in_dma __P((void *));
377 int	gus_speaker_ctl __P((void *, int));
378 int	gusmaxopen __P((void *, int));
379 int	gusmax_round_blocksize __P((void *, int));
380 int	gusmax_commit_settings __P((void *));
381 int	gusmax_dma_output __P((void *, void *, int, void (*)(void *), void *));
382 int	gusmax_dma_input __P((void *, void *, int, void (*)(void *), void *));
383 int	gusmax_halt_out_dma __P((void *));
384 int	gusmax_halt_in_dma __P((void *));
385 int	gusmax_speaker_ctl __P((void *, int));
386 int	gus_getdev __P((void *, struct audio_device *));
387 
388 STATIC void	gus_deinterleave __P((struct gus_softc *, void *, int));
389 
390 STATIC int	gus_mic_ctl __P((void *, int));
391 STATIC int	gus_linein_ctl __P((void *, int));
392 STATIC int	gus_test_iobase __P((bus_space_tag_t, int));
393 STATIC void	guspoke __P((bus_space_tag_t, bus_space_handle_t, long, u_char));
394 STATIC void	gusdmaout __P((struct gus_softc *, int, u_long, caddr_t, int));
395 STATIC int	gus_init_cs4231 __P((struct gus_softc *));
396 STATIC void	gus_init_ics2101 __P((struct gus_softc *));
397 
398 STATIC void	gus_set_chan_addrs __P((struct gus_softc *));
399 STATIC void	gusreset __P((struct gus_softc *, int));
400 STATIC void	gus_set_voices __P((struct gus_softc *, int));
401 STATIC void	gus_set_volume __P((struct gus_softc *, int, int));
402 STATIC void	gus_set_samprate __P((struct gus_softc *, int, int));
403 STATIC void	gus_set_recrate __P((struct gus_softc *, u_long));
404 STATIC void	gus_start_voice __P((struct gus_softc *, int, int));
405 STATIC void	gus_stop_voice __P((struct gus_softc *, int, int));
406 STATIC void	gus_set_endaddr __P((struct gus_softc *, int, u_long));
407 #ifdef GUSPLAYDEBUG
408 STATIC void	gus_set_curaddr __P((struct gus_softc *, int, u_long));
409 STATIC u_long	gus_get_curaddr __P((struct gus_softc *, int));
410 #endif
411 STATIC int	gus_dmaout_intr __P((struct gus_softc *));
412 STATIC void	gus_dmaout_dointr __P((struct gus_softc *));
413 STATIC void	gus_dmaout_timeout __P((void *));
414 STATIC int	gus_dmain_intr __P((struct gus_softc *));
415 STATIC int	gus_voice_intr __P((struct gus_softc *));
416 STATIC void	gus_start_playing __P((struct gus_softc *, int));
417 STATIC int	gus_continue_playing __P((struct gus_softc *, int));
418 STATIC u_char guspeek __P((bus_space_tag_t, bus_space_handle_t, u_long));
419 STATIC u_long convert_to_16bit __P((u_long));
420 STATIC int	gus_mixer_set_port __P((void *, mixer_ctrl_t *));
421 STATIC int	gus_mixer_get_port __P((void *, mixer_ctrl_t *));
422 STATIC int	gusmax_mixer_set_port __P((void *, mixer_ctrl_t *));
423 STATIC int	gusmax_mixer_get_port __P((void *, mixer_ctrl_t *));
424 STATIC int	gus_mixer_query_devinfo __P((void *, mixer_devinfo_t *));
425 STATIC int	gusmax_mixer_query_devinfo __P((void *, mixer_devinfo_t *));
426 STATIC int	gus_query_encoding __P((void *, struct audio_encoding *));
427 STATIC int	gus_get_props __P((void *));
428 STATIC int	gusmax_get_props __P((void *));
429 
430 STATIC void	gusics_master_mute __P((struct ics2101_softc *, int));
431 STATIC void	gusics_dac_mute __P((struct ics2101_softc *, int));
432 STATIC void	gusics_mic_mute __P((struct ics2101_softc *, int));
433 STATIC void	gusics_linein_mute __P((struct ics2101_softc *, int));
434 STATIC void	gusics_cd_mute __P((struct ics2101_softc *, int));
435 
436 void	stereo_dmaintr __P((void *));
437 
438 /*
439  * ISA bus driver routines
440  */
441 
442 int	gusprobe __P((struct device *, struct cfdata *, void *));
443 void	gusattach __P((struct device *, struct device *, void *));
444 
445 CFATTACH_DECL(gus, sizeof(struct gus_softc),
446     gusprobe, gusattach, NULL, NULL);
447 
448 /*
449  * A mapping from IRQ/DRQ values to the values used in the GUS's internal
450  * registers.  A zero means that the referenced IRQ/DRQ is invalid
451  */
452 
453 static const int gus_irq_map[] = {
454 	ISACF_IRQ_DEFAULT, ISACF_IRQ_DEFAULT, 1, 3, ISACF_IRQ_DEFAULT, 2,
455 	ISACF_IRQ_DEFAULT, 4, ISACF_IRQ_DEFAULT, 1, ISACF_IRQ_DEFAULT, 5,
456 	6, ISACF_IRQ_DEFAULT, ISACF_IRQ_DEFAULT, 7
457 };
458 static const int gus_drq_map[] = {
459 	ISACF_DRQ_DEFAULT, 1, ISACF_DRQ_DEFAULT, 2, ISACF_DRQ_DEFAULT, 3,
460 	4, 5
461 };
462 
463 /*
464  * A list of valid base addresses for the GUS
465  */
466 
467 static const int gus_base_addrs[] = {
468 	0x210, 0x220, 0x230, 0x240, 0x250, 0x260
469 };
470 static const int gus_addrs = sizeof(gus_base_addrs) / sizeof(gus_base_addrs[0]);
471 
472 /*
473  * Maximum frequency values of the GUS based on the number of currently active
474  * voices.  Since the GUS samples a voice every 1.6 us, the maximum frequency
475  * is dependent on the number of active voices.  Yes, it is pretty weird.
476  */
477 
478 static const int gus_max_frequency[] = {
479 		44100,		/* 14 voices */
480 		41160,		/* 15 voices */
481 		38587,		/* 16 voices */
482 		36317,		/* 17 voices */
483 		34300,		/* 18 voices */
484 		32494,		/* 19 voices */
485 		30870,		/* 20 voices */
486 		29400,		/* 21 voices */
487 		28063,		/* 22 voices */
488 		26843,		/* 23 voices */
489 		25725,		/* 24 voices */
490 		24696,		/* 25 voices */
491 		23746,		/* 26 voices */
492 		22866,		/* 27 voices */
493 		22050,		/* 28 voices */
494 		21289,		/* 29 voices */
495 		20580,		/* 30 voices */
496 		19916,		/* 31 voices */
497 		19293		/* 32 voices */
498 };
499 /*
500  * A mapping of linear volume levels to the logarithmic volume values used
501  * by the GF1 chip on the GUS.  From GUS SDK vol1.c.
502  */
503 
504 static const unsigned short gus_log_volumes[512] = {
505  0x0000,
506  0x0700, 0x07ff, 0x0880, 0x08ff, 0x0940, 0x0980, 0x09c0, 0x09ff, 0x0a20,
507  0x0a40, 0x0a60, 0x0a80, 0x0aa0, 0x0ac0, 0x0ae0, 0x0aff, 0x0b10, 0x0b20,
508  0x0b30, 0x0b40, 0x0b50, 0x0b60, 0x0b70, 0x0b80, 0x0b90, 0x0ba0, 0x0bb0,
509  0x0bc0, 0x0bd0, 0x0be0, 0x0bf0, 0x0bff, 0x0c08, 0x0c10, 0x0c18, 0x0c20,
510  0x0c28, 0x0c30, 0x0c38, 0x0c40, 0x0c48, 0x0c50, 0x0c58, 0x0c60, 0x0c68,
511  0x0c70, 0x0c78, 0x0c80, 0x0c88, 0x0c90, 0x0c98, 0x0ca0, 0x0ca8, 0x0cb0,
512  0x0cb8, 0x0cc0, 0x0cc8, 0x0cd0, 0x0cd8, 0x0ce0, 0x0ce8, 0x0cf0, 0x0cf8,
513  0x0cff, 0x0d04, 0x0d08, 0x0d0c, 0x0d10, 0x0d14, 0x0d18, 0x0d1c, 0x0d20,
514  0x0d24, 0x0d28, 0x0d2c, 0x0d30, 0x0d34, 0x0d38, 0x0d3c, 0x0d40, 0x0d44,
515  0x0d48, 0x0d4c, 0x0d50, 0x0d54, 0x0d58, 0x0d5c, 0x0d60, 0x0d64, 0x0d68,
516  0x0d6c, 0x0d70, 0x0d74, 0x0d78, 0x0d7c, 0x0d80, 0x0d84, 0x0d88, 0x0d8c,
517  0x0d90, 0x0d94, 0x0d98, 0x0d9c, 0x0da0, 0x0da4, 0x0da8, 0x0dac, 0x0db0,
518  0x0db4, 0x0db8, 0x0dbc, 0x0dc0, 0x0dc4, 0x0dc8, 0x0dcc, 0x0dd0, 0x0dd4,
519  0x0dd8, 0x0ddc, 0x0de0, 0x0de4, 0x0de8, 0x0dec, 0x0df0, 0x0df4, 0x0df8,
520  0x0dfc, 0x0dff, 0x0e02, 0x0e04, 0x0e06, 0x0e08, 0x0e0a, 0x0e0c, 0x0e0e,
521  0x0e10, 0x0e12, 0x0e14, 0x0e16, 0x0e18, 0x0e1a, 0x0e1c, 0x0e1e, 0x0e20,
522  0x0e22, 0x0e24, 0x0e26, 0x0e28, 0x0e2a, 0x0e2c, 0x0e2e, 0x0e30, 0x0e32,
523  0x0e34, 0x0e36, 0x0e38, 0x0e3a, 0x0e3c, 0x0e3e, 0x0e40, 0x0e42, 0x0e44,
524  0x0e46, 0x0e48, 0x0e4a, 0x0e4c, 0x0e4e, 0x0e50, 0x0e52, 0x0e54, 0x0e56,
525  0x0e58, 0x0e5a, 0x0e5c, 0x0e5e, 0x0e60, 0x0e62, 0x0e64, 0x0e66, 0x0e68,
526  0x0e6a, 0x0e6c, 0x0e6e, 0x0e70, 0x0e72, 0x0e74, 0x0e76, 0x0e78, 0x0e7a,
527  0x0e7c, 0x0e7e, 0x0e80, 0x0e82, 0x0e84, 0x0e86, 0x0e88, 0x0e8a, 0x0e8c,
528  0x0e8e, 0x0e90, 0x0e92, 0x0e94, 0x0e96, 0x0e98, 0x0e9a, 0x0e9c, 0x0e9e,
529  0x0ea0, 0x0ea2, 0x0ea4, 0x0ea6, 0x0ea8, 0x0eaa, 0x0eac, 0x0eae, 0x0eb0,
530  0x0eb2, 0x0eb4, 0x0eb6, 0x0eb8, 0x0eba, 0x0ebc, 0x0ebe, 0x0ec0, 0x0ec2,
531  0x0ec4, 0x0ec6, 0x0ec8, 0x0eca, 0x0ecc, 0x0ece, 0x0ed0, 0x0ed2, 0x0ed4,
532  0x0ed6, 0x0ed8, 0x0eda, 0x0edc, 0x0ede, 0x0ee0, 0x0ee2, 0x0ee4, 0x0ee6,
533  0x0ee8, 0x0eea, 0x0eec, 0x0eee, 0x0ef0, 0x0ef2, 0x0ef4, 0x0ef6, 0x0ef8,
534  0x0efa, 0x0efc, 0x0efe, 0x0eff, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05,
535  0x0f06, 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e,
536  0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16, 0x0f17,
537  0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e, 0x0f1f, 0x0f20,
538  0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26, 0x0f27, 0x0f28, 0x0f29,
539  0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e, 0x0f2f, 0x0f30, 0x0f31, 0x0f32,
540  0x0f33, 0x0f34, 0x0f35, 0x0f36, 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b,
541  0x0f3c, 0x0f3d, 0x0f3e, 0x0f3f, 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44,
542  0x0f45, 0x0f46, 0x0f47, 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d,
543  0x0f4e, 0x0f4f, 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56,
544  0x0f57, 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f,
545  0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67, 0x0f68,
546  0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f, 0x0f70, 0x0f71,
547  0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77, 0x0f78, 0x0f79, 0x0f7a,
548  0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f, 0x0f80, 0x0f81, 0x0f82, 0x0f83,
549  0x0f84, 0x0f85, 0x0f86, 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c,
550  0x0f8d, 0x0f8e, 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95,
551  0x0f96, 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e,
552  0x0f9f, 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7,
553  0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf, 0x0fb0,
554  0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7, 0x0fb8, 0x0fb9,
555  0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf, 0x0fc0, 0x0fc1, 0x0fc2,
556  0x0fc3, 0x0fc4, 0x0fc5, 0x0fc6, 0x0fc7, 0x0fc8, 0x0fc9, 0x0fca, 0x0fcb,
557  0x0fcc, 0x0fcd, 0x0fce, 0x0fcf, 0x0fd0, 0x0fd1, 0x0fd2, 0x0fd3, 0x0fd4,
558  0x0fd5, 0x0fd6, 0x0fd7, 0x0fd8, 0x0fd9, 0x0fda, 0x0fdb, 0x0fdc, 0x0fdd,
559  0x0fde, 0x0fdf, 0x0fe0, 0x0fe1, 0x0fe2, 0x0fe3, 0x0fe4, 0x0fe5, 0x0fe6,
560  0x0fe7, 0x0fe8, 0x0fe9, 0x0fea, 0x0feb, 0x0fec, 0x0fed, 0x0fee, 0x0fef,
561  0x0ff0, 0x0ff1, 0x0ff2, 0x0ff3, 0x0ff4, 0x0ff5, 0x0ff6, 0x0ff7, 0x0ff8,
562  0x0ff9, 0x0ffa, 0x0ffb, 0x0ffc, 0x0ffd, 0x0ffe, 0x0fff};
563 
564 #define SELECT_GUS_REG(iot,ioh1,x) bus_space_write_1(iot,ioh1,GUS_REG_SELECT,x)
565 #define ADDR_HIGH(x) (unsigned int) ((x >> 7L) & 0x1fffL)
566 #define ADDR_LOW(x) (unsigned int) ((x & 0x7fL) << 9L)
567 
568 #define GUS_MIN_VOICES 14	/* Minimum possible number of voices */
569 #define GUS_MAX_VOICES 32	/* Maximum possible number of voices */
570 #define GUS_VOICE_LEFT 0	/* Voice used for left (and mono) playback */
571 #define GUS_VOICE_RIGHT 1	/* Voice used for right playback */
572 #define GUS_MEM_OFFSET 32	/* Offset into GUS memory to begin of buffer */
573 #define GUS_BUFFER_MULTIPLE 1024	/* Audio buffers are multiples of this */
574 #define	GUS_MEM_FOR_BUFFERS	131072	/* use this many bytes on-GUS */
575 #define	GUS_LEFT_RIGHT_OFFSET	(sc->sc_nbufs * sc->sc_chanblocksize + GUS_MEM_OFFSET)
576 
577 #define GUS_PREC_BYTES (sc->sc_precision >> 3) /* precision to bytes */
578 
579 /* splgus() must be splaudio() */
580 
581 #define splgus splaudio
582 
583 /*
584  * Interface to higher level audio driver
585  */
586 
587 struct audio_hw_if gus_hw_if = {
588 	gusopen,
589 	gusclose,
590 	NULL,				/* drain */
591 
592 	gus_query_encoding,
593 
594 	gus_set_params,
595 
596 	gus_round_blocksize,
597 
598 	gus_commit_settings,
599 
600 	NULL,
601 	NULL,
602 
603 	gus_dma_output,
604 	gus_dma_input,
605 	gus_halt_out_dma,
606 	gus_halt_in_dma,
607 	gus_speaker_ctl,
608 
609 	gus_getdev,
610 	NULL,
611 	gus_mixer_set_port,
612 	gus_mixer_get_port,
613 	gus_mixer_query_devinfo,
614 	ad1848_isa_malloc,
615 	ad1848_isa_free,
616 	ad1848_isa_round_buffersize,
617 	ad1848_isa_mappage,
618 	gus_get_props,
619 	NULL,
620 	NULL,
621 	NULL,
622 };
623 
624 static struct audio_hw_if gusmax_hw_if = {
625 	gusmaxopen,
626 	gusmax_close,
627 	NULL,				/* drain */
628 
629 	gus_query_encoding, /* query encoding */
630 
631 	gusmax_set_params,
632 
633 	gusmax_round_blocksize,
634 
635 	gusmax_commit_settings,
636 
637 	NULL,
638 	NULL,
639 
640 	gusmax_dma_output,
641 	gusmax_dma_input,
642 	gusmax_halt_out_dma,
643 	gusmax_halt_in_dma,
644 
645 	gusmax_speaker_ctl,
646 
647 	gus_getdev,
648 	NULL,
649 	gusmax_mixer_set_port,
650 	gusmax_mixer_get_port,
651 	gusmax_mixer_query_devinfo,
652 	ad1848_isa_malloc,
653 	ad1848_isa_free,
654 	ad1848_isa_round_buffersize,
655 	ad1848_isa_mappage,
656 	gusmax_get_props,
657 	NULL,
658 	NULL,
659 	NULL,
660 };
661 
662 /*
663  * Some info about the current audio device
664  */
665 
666 struct audio_device gus_device = {
667 	"UltraSound",
668 	"",
669 	"gus",
670 };
671 
672 #define FLIP_REV	5		/* This rev has flipped mixer chans */
673 
674 
675 int
676 gusprobe(parent, match, aux)
677 	struct device *parent;
678 	struct cfdata *match;
679 	void *aux;
680 {
681 	struct isa_attach_args *ia = aux;
682 	int iobase, recdrq;
683 
684 	if (ia->ia_nio < 1)
685 		return (0);
686 	if (ia->ia_nirq < 1)
687 		return (0);
688 	if (ia->ia_ndrq < 1)
689 		return (0);
690 
691 	if (ISA_DIRECT_CONFIG(ia))
692 		return (0);
693 
694 	iobase = ia->ia_io[0].ir_addr;
695 	if (ia->ia_ndrq > 1)
696 		recdrq = ia->ia_drq[1].ir_drq;
697 	else
698 		recdrq = ISACF_DRQ_DEFAULT;
699 
700 	/*
701 	 * Before we do anything else, make sure requested IRQ and DRQ are
702 	 * valid for this card.
703 	 */
704 
705 	/* XXX range check before indexing!! */
706 	if (ia->ia_irq[0].ir_irq == ISACF_IRQ_DEFAULT ||
707 	    gus_irq_map[ia->ia_irq[0].ir_irq] == ISACF_IRQ_DEFAULT) {
708 		printf("gus: invalid irq %d, card not probed\n",
709 		    ia->ia_irq[0].ir_irq);
710 		return 0;
711 	}
712 
713 	if (ia->ia_drq[0].ir_drq == ISACF_DRQ_DEFAULT ||
714 	    gus_drq_map[ia->ia_drq[0].ir_drq] == ISACF_DRQ_DEFAULT) {
715 		printf("gus: invalid drq %d, card not probed\n",
716 		    ia->ia_drq[0].ir_drq);
717 		return 0;
718 	}
719 
720 	if (recdrq != ISACF_DRQ_DEFAULT) {
721 		if (recdrq > 7 || gus_drq_map[recdrq] == ISACF_DRQ_DEFAULT) {
722 		   printf("gus: invalid second DMA channel (%d), card not "
723 		       "probed\n", recdrq);
724 		   return 0;
725 	        }
726 	} else
727 		recdrq = ia->ia_drq[0].ir_drq;
728 
729 	if (iobase == ISACF_PORT_DEFAULT) {
730 		int i;
731 		for(i = 0; i < gus_addrs; i++)
732 			if (gus_test_iobase(ia->ia_iot, gus_base_addrs[i])) {
733 				iobase = gus_base_addrs[i];
734 				goto done;
735 			}
736 		return 0;
737 	} else if (!gus_test_iobase(ia->ia_iot, iobase))
738 			return 0;
739 
740 done:
741 	if (!isa_drq_isfree(ia->ia_ic, ia->ia_drq[0].ir_drq) ||
742 	    (recdrq != ia->ia_drq[0].ir_drq &&
743 	     !isa_drq_isfree(ia->ia_ic, recdrq)))
744 		return 0;
745 
746 	ia->ia_nio = 1;
747 	ia->ia_io[0].ir_addr = iobase;
748 	ia->ia_io[0].ir_size = GUS_NPORT1;
749 
750 	ia->ia_nirq = 1;
751 	ia->ia_ndrq = (recdrq != ia->ia_drq[0].ir_drq) ? 2 : 1;
752 
753 	ia->ia_niomem = 0;
754 
755 	return 1;
756 }
757 
758 /*
759  * Test to see if a particular I/O base is valid for the GUS.  Return true
760  * if it is.
761  */
762 
763 STATIC int
764 gus_test_iobase (iot, iobase)
765 	bus_space_tag_t iot;
766 	int iobase;
767 {
768 	bus_space_handle_t ioh1, ioh2, ioh3, ioh4;
769 	u_char s1, s2;
770 	int s, rv = 0;
771 
772 	/* Map i/o space */
773 	if (bus_space_map(iot, iobase, GUS_NPORT1, 0, &ioh1))
774 		return 0;
775 	if (bus_space_map(iot, iobase+GUS_IOH2_OFFSET, GUS_NPORT2, 0, &ioh2))
776 		goto bad1;
777 
778 	/* XXX Maybe we shouldn't fail on mapping this, but just assume
779 	 * the card is of revision 0? */
780 	if (bus_space_map(iot, iobase+GUS_IOH3_OFFSET, GUS_NPORT3, 0, &ioh3))
781 		goto bad2;
782 
783 	if (bus_space_map(iot, iobase+GUS_IOH4_OFFSET, GUS_NPORT4, 0, &ioh4))
784 		goto bad3;
785 
786 	/*
787 	 * Reset GUS to an initial state before we do anything.
788 	 */
789 
790 	s = splgus();
791 	delay(500);
792 
793  	SELECT_GUS_REG(iot, ioh2, GUSREG_RESET);
794  	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0x00);
795 
796  	delay(500);
797 
798 	SELECT_GUS_REG(iot, ioh2, GUSREG_RESET);
799  	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, GUSMASK_MASTER_RESET);
800 
801  	delay(500);
802 
803 	splx(s);
804 
805 	/*
806 	 * See if we can write to the board's memory
807 	 */
808 
809  	s1 = guspeek(iot, ioh2, 0L);
810  	s2 = guspeek(iot, ioh2, 1L);
811 
812  	guspoke(iot, ioh2, 0L, 0xaa);
813  	guspoke(iot, ioh2, 1L, 0x55);
814 
815  	if (guspeek(iot, ioh2, 0L) != 0xaa)
816 		goto bad;
817 
818 	guspoke(iot, ioh2, 0L, s1);
819 	guspoke(iot, ioh2, 1L, s2);
820 
821 	rv = 1;
822 
823 bad:
824 	bus_space_unmap(iot, ioh4, GUS_NPORT4);
825 bad3:
826 	bus_space_unmap(iot, ioh3, GUS_NPORT3);
827 bad2:
828 	bus_space_unmap(iot, ioh2, GUS_NPORT2);
829 bad1:
830 	bus_space_unmap(iot, ioh1, GUS_NPORT1);
831 	return rv;
832 }
833 
834 /*
835  * Setup the GUS for use; called shortly after probe
836  */
837 
838 void
839 gusattach(parent, self, aux)
840 	struct device *parent, *self;
841 	void *aux;
842 {
843 	struct gus_softc *sc = (void *) self;
844 	struct isa_attach_args *ia = aux;
845 	bus_space_tag_t iot;
846 	bus_space_handle_t ioh1, ioh2, ioh3, ioh4;
847  	int		iobase, i;
848 	unsigned char	c,d,m;
849 
850 	callout_init(&sc->sc_dmaout_ch);
851 
852 	sc->sc_iot = iot = ia->ia_iot;
853 	sc->sc_ic = ia->ia_ic;
854 	iobase = ia->ia_io[0].ir_addr;
855 
856 	/* Map i/o space */
857 	if (bus_space_map(iot, iobase, GUS_NPORT1, 0, &ioh1))
858 		panic("%s: can't map io port range 1", self->dv_xname);
859 	sc->sc_ioh1 = ioh1;
860 	if (bus_space_map(iot, iobase+GUS_IOH2_OFFSET, GUS_NPORT2, 0, &ioh2))
861 		panic("%s: can't map io port range 2", self->dv_xname);
862 	sc->sc_ioh2 = ioh2;
863 
864 	/* XXX Maybe we shouldn't fail on mapping this, but just assume
865 	 * the card is of revision 0? */
866 	if (bus_space_map(iot, iobase+GUS_IOH3_OFFSET, GUS_NPORT3, 0, &ioh3))
867 		panic("%s: can't map io port range 3", self->dv_xname);
868 	sc->sc_ioh3 = ioh3;
869 
870 	if (bus_space_map(iot, iobase+GUS_IOH4_OFFSET, GUS_NPORT4, 0, &ioh4))
871 		panic("%s: can't map io port range 4", self->dv_xname);
872 	sc->sc_ioh4 = ioh4;
873 
874 	sc->sc_iobase = iobase;
875 	sc->sc_irq = ia->ia_irq[0].ir_irq;
876 	sc->sc_playdrq = ia->ia_drq[0].ir_drq;
877 	sc->sc_recdrq = (ia->ia_ndrq == 2) ?
878 	    ia->ia_drq[1].ir_drq : ia->ia_drq[0].ir_drq;
879 
880 	/*
881 	 * Figure out our board rev, and see if we need to initialize the
882 	 * mixer
883 	 */
884 
885 	sc->sc_ic = ia->ia_ic;
886 
887  	delay(500);
888 
889  	c = bus_space_read_1(iot, ioh3, GUS_BOARD_REV);
890 	if (c != 0xff)
891 		sc->sc_revision = c;
892 	else
893 		sc->sc_revision = 0;
894 
895 
896  	SELECT_GUS_REG(iot, ioh2, GUSREG_RESET);
897  	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0x00);
898 
899 	gusreset(sc, GUS_MAX_VOICES); /* initialize all voices */
900 	gusreset(sc, GUS_MIN_VOICES); /* then set to just the ones we use */
901 
902 	/*
903 	 * Setup the IRQ and DRQ lines in software, using values from
904 	 * config file
905 	 */
906 
907 	m = GUSMASK_LINE_IN|GUSMASK_LINE_OUT;		/* disable all */
908 
909 	c = ((unsigned char) gus_irq_map[ia->ia_irq[0].ir_irq]) |
910 	    GUSMASK_BOTH_RQ;
911 
912 	if (sc->sc_recdrq == sc->sc_playdrq)
913 		d = (unsigned char) (gus_drq_map[sc->sc_playdrq] |
914 				GUSMASK_BOTH_RQ);
915 	else
916 		d = (unsigned char) (gus_drq_map[sc->sc_playdrq] |
917 				gus_drq_map[sc->sc_recdrq] << 3);
918 
919 	/*
920 	 * Program the IRQ and DMA channels on the GUS.  Note that we hardwire
921 	 * the GUS to only use one IRQ channel, but we give the user the
922 	 * option of using two DMA channels (the other one given by the drq2
923 	 * option in the config file).  Two DMA channels are needed for full-
924 	 * duplex operation.
925 	 *
926 	 * The order of these operations is very magical.
927 	 */
928 
929 	disable_intr();		/* XXX needed? */
930 
931 	bus_space_write_1(iot, ioh1, GUS_REG_CONTROL, GUS_REG_IRQCTL);
932 	bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL, m);
933 	bus_space_write_1(iot, ioh1, GUS_IRQCTL_CONTROL, 0x00);
934 	bus_space_write_1(iot, ioh1, 0x0f, 0x00);
935 
936 	bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL, m);
937 	bus_space_write_1(iot, ioh1, GUS_DMA_CONTROL, d | 0x80); /* magic reset? */
938 
939 	bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL, m | GUSMASK_CONTROL_SEL);
940 	bus_space_write_1(iot, ioh1, GUS_IRQ_CONTROL, c);
941 
942 	bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL, m);
943 	bus_space_write_1(iot, ioh1, GUS_DMA_CONTROL, d);
944 
945 	bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL, m | GUSMASK_CONTROL_SEL);
946 	bus_space_write_1(iot, ioh1, GUS_IRQ_CONTROL, c);
947 
948 	bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, 0x00);
949 
950 	/* enable line in, line out.  leave mic disabled. */
951 	bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL,
952 	     (m | GUSMASK_LATCHES) & ~(GUSMASK_LINE_OUT|GUSMASK_LINE_IN));
953 	bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, 0x00);
954 
955 	enable_intr();
956 
957 	sc->sc_mixcontrol =
958 		(m | GUSMASK_LATCHES) & ~(GUSMASK_LINE_OUT|GUSMASK_LINE_IN);
959 
960 	if (sc->sc_playdrq != -1) {
961 		sc->sc_play_maxsize = isa_dmamaxsize(sc->sc_ic,
962 		    sc->sc_playdrq);
963 		if (isa_drq_alloc(sc->sc_ic, sc->sc_playdrq) != 0) {
964 			printf("%s: can't reserve drq %d\n",
965 			    sc->sc_dev.dv_xname, sc->sc_playdrq);
966 			return;
967 		}
968 		if (isa_dmamap_create(sc->sc_ic, sc->sc_playdrq,
969 		    sc->sc_play_maxsize, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) {
970 			printf("%s: can't create map for drq %d\n",
971 			       sc->sc_dev.dv_xname, sc->sc_playdrq);
972 			return;
973 		}
974 	}
975 	if (sc->sc_recdrq != -1 && sc->sc_recdrq != sc->sc_playdrq) {
976 		sc->sc_req_maxsize = isa_dmamaxsize(sc->sc_ic,
977 		    sc->sc_recdrq);
978 		if (isa_drq_alloc(sc->sc_ic, sc->sc_recdrq) != 0) {
979 			printf("%s: can't reserve drq %d\n",
980 			    sc->sc_dev.dv_xname, sc->sc_recdrq);
981 			return;
982 		}
983 		if (isa_dmamap_create(sc->sc_ic, sc->sc_recdrq,
984 		    sc->sc_req_maxsize, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) {
985 			printf("%s: can't create map for drq %d\n",
986 			       sc->sc_dev.dv_xname, sc->sc_recdrq);
987 			return;
988 		}
989 	}
990 
991 	/* XXX WILL THIS ALWAYS WORK THE WAY THEY'RE OVERLAYED?! */
992 	sc->sc_codec.sc_ic = sc->sc_ic;
993 
994  	if (sc->sc_revision >= 5 && sc->sc_revision <= 9) {
995  		sc->sc_flags |= GUS_MIXER_INSTALLED;
996  		gus_init_ics2101(sc);
997 	}
998 	if (sc->sc_revision >= 10)
999 		gus_init_cs4231(sc);
1000 
1001  	SELECT_GUS_REG(iot, ioh2, GUSREG_RESET);
1002  	/*
1003  	 * Check to see how much memory we have on this card; see if any
1004  	 * "mirroring" occurs.  We're assuming at least 256K already exists
1005  	 * on the card; otherwise the initial probe would have failed
1006  	 */
1007 
1008 	guspoke(iot, ioh2, 0L, 0x00);
1009 	for(i = 1; i < 1024; i++) {
1010 		u_long loc;
1011 
1012 		/*
1013 		 * See if we've run into mirroring yet
1014 		 */
1015 
1016 		if (guspeek(iot, ioh2, 0L) != 0)
1017 			break;
1018 
1019 		loc = i << 10;
1020 
1021 		guspoke(iot, ioh2, loc, 0xaa);
1022 		if (guspeek(iot, ioh2, loc) != 0xaa)
1023 			break;
1024 	}
1025 
1026 	sc->sc_dsize = i;
1027 
1028 	/* The "official" (3.x) version number cannot easily be obtained.
1029 	 * The revision register does not correspond to the minor number
1030 	 * of the board version. Simply use the revision register as
1031 	 * identification.
1032 	 */
1033 	snprintf(gus_device.version, sizeof(gus_device.version), "%d",
1034 	    sc->sc_revision);
1035 
1036 	printf("\n%s: Gravis UltraSound", sc->sc_dev.dv_xname);
1037 	if (sc->sc_revision >= 10)
1038 		printf(" MAX");
1039 	else {
1040 		if (HAS_MIXER(sc))
1041 			printf(", mixer");
1042 		if (HAS_CODEC(sc))
1043 			printf(" with CODEC module");
1044 	}
1045 	printf(", %dKB memory\n", sc->sc_dsize);
1046 
1047 	/* A GUS MAX should always have a CODEC installed */
1048 	if ((sc->sc_revision >= 10) & !(HAS_CODEC(sc)))
1049 		printf("%s: WARNING: did not attach CODEC on MAX\n",
1050                        sc->sc_dev.dv_xname);
1051 
1052 	/*
1053 	 * Setup a default interrupt handler
1054 	 */
1055 
1056 	/* XXX we shouldn't have to use splgus == splclock, nor should
1057 	 * we use IPL_CLOCK.
1058 	 */
1059 	sc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq[0].ir_irq,
1060 	    IST_EDGE, IPL_AUDIO, gusintr, sc /* sc->sc_gusdsp */);
1061 
1062 	/*
1063 	 * Set some default values
1064 	 * XXX others start with 8kHz mono mu-law
1065 	 */
1066 
1067 	sc->sc_irate = sc->sc_orate = 44100;
1068 	sc->sc_encoding = AUDIO_ENCODING_SLINEAR_LE;
1069 	sc->sc_precision = 16;
1070 	sc->sc_voc[GUS_VOICE_LEFT].voccntl |= GUSMASK_DATA_SIZE16;
1071 	sc->sc_voc[GUS_VOICE_RIGHT].voccntl |= GUSMASK_DATA_SIZE16;
1072 	sc->sc_channels = 1;
1073 	sc->sc_ogain = 340;
1074 	gus_commit_settings(sc);
1075 
1076 	/*
1077 	 * We always put the left channel full left & right channel
1078 	 * full right.
1079 	 * For mono playback, we set up both voices playing the same buffer.
1080 	 */
1081 	bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, (unsigned char) GUS_VOICE_LEFT);
1082 	SELECT_GUS_REG(iot, ioh2, GUSREG_PAN_POS);
1083 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, GUS_PAN_FULL_LEFT);
1084 
1085 	bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, (unsigned char) GUS_VOICE_RIGHT);
1086 	SELECT_GUS_REG(iot, ioh2, GUSREG_PAN_POS);
1087 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, GUS_PAN_FULL_RIGHT);
1088 
1089 	/*
1090 	 * Attach to the generic audio layer
1091 	 */
1092 
1093 	audio_attach_mi(&gus_hw_if, HAS_CODEC(sc) ? (void *)&sc->sc_codec : (void *)sc, &sc->sc_dev);
1094 }
1095 
1096 int
1097 gusopen(addr, flags)
1098 	void *addr;
1099 	int flags;
1100 {
1101 	struct gus_softc *sc = addr;
1102 
1103 	DPRINTF(("gusopen() called\n"));
1104 
1105 	if (sc->sc_flags & GUS_OPEN)
1106 		return EBUSY;
1107 
1108 	/*
1109 	 * Some initialization
1110 	 */
1111 
1112 	sc->sc_flags |= GUS_OPEN;
1113 	sc->sc_dmabuf = 0;
1114 	sc->sc_playbuf = -1;
1115 	sc->sc_bufcnt = 0;
1116 	sc->sc_voc[GUS_VOICE_LEFT].start_addr = GUS_MEM_OFFSET - 1;
1117 	sc->sc_voc[GUS_VOICE_LEFT].current_addr = GUS_MEM_OFFSET;
1118 
1119 	if (HAS_CODEC(sc)) {
1120 		ad1848_open(&sc->sc_codec.sc_ad1848, flags);
1121 		sc->sc_codec.sc_ad1848.mute[AD1848_AUX1_CHANNEL] = 0;
1122 
1123 		/* turn on DAC output */
1124 		ad1848_mute_channel(&sc->sc_codec.sc_ad1848,
1125 				    AD1848_AUX1_CHANNEL, 0);
1126 		if (flags & FREAD) {
1127 			sc->sc_codec.sc_ad1848.mute[AD1848_MONO_CHANNEL] = 0;
1128 			ad1848_mute_channel(&sc->sc_codec.sc_ad1848,
1129 					    AD1848_MONO_CHANNEL, 0);
1130 		}
1131 	} else if (flags & FREAD) {
1132 		/* enable/unmute the microphone */
1133 		if (HAS_MIXER(sc)) {
1134 			gusics_mic_mute(&sc->sc_mixer, 0);
1135 		} else
1136 			gus_mic_ctl(sc, SPKR_ON);
1137 	}
1138 	if (sc->sc_nbufs == 0)
1139 	    gus_round_blocksize(sc, GUS_BUFFER_MULTIPLE); /* default blksiz */
1140 	return 0;
1141 }
1142 
1143 int
1144 gusmaxopen(addr, flags)
1145 	void *addr;
1146 	int flags;
1147 {
1148 	struct ad1848_isa_softc *ac = addr;
1149 	return gusopen(ac->sc_ad1848.parent, flags);
1150 }
1151 
1152 STATIC void
1153 gus_deinterleave(sc, buf, size)
1154 	struct gus_softc *sc;
1155 	void *buf;
1156 	int size;
1157 {
1158 	/* deinterleave the stereo data.  We can use sc->sc_deintr_buf
1159 	   for scratch space. */
1160 	int i;
1161 
1162 	if (size > sc->sc_blocksize) {
1163 		printf("gus: deinterleave %d > %d\n", size, sc->sc_blocksize);
1164 		return;
1165 	} else if (size < sc->sc_blocksize) {
1166 		DPRINTF(("gus: deinterleave %d < %d\n", size, sc->sc_blocksize));
1167 	}
1168 
1169 	/*
1170 	 * size is in bytes.
1171 	 */
1172 	if (sc->sc_precision == 16) {
1173 		u_short *dei = sc->sc_deintr_buf;
1174 		u_short *sbuf = buf;
1175 		size >>= 1;		/* bytecnt to shortcnt */
1176 		/* copy 2nd of each pair of samples to the staging area, while
1177 		   compacting the 1st of each pair into the original area. */
1178 		for (i = 0; i < size/2-1; i++)  {
1179 			dei[i] = sbuf[i*2+1];
1180 			sbuf[i+1] = sbuf[i*2+2];
1181 		}
1182 		/*
1183 		 * this has copied one less sample than half of the
1184 		 * buffer.  The first sample of the 1st stream was
1185 		 * already in place and didn't need copying.
1186 		 * Therefore, we've moved all of the 1st stream's
1187 		 * samples into place.  We have one sample from 2nd
1188 		 * stream in the last slot of original area, not
1189 		 * copied to the staging area (But we don't need to!).
1190 		 * Copy the remainder of the original stream into place.
1191 		 */
1192 		memcpy(&sbuf[size/2], dei, i * sizeof(short));
1193 	} else {
1194 		u_char *dei = sc->sc_deintr_buf;
1195 		u_char *sbuf = buf;
1196 		for (i = 0; i < size/2-1; i++)  {
1197 			dei[i] = sbuf[i*2+1];
1198 			sbuf[i+1] = sbuf[i*2+2];
1199 		}
1200 		memcpy(&sbuf[size/2], dei, i);
1201 	}
1202 }
1203 
1204 /*
1205  * Actually output a buffer to the DSP chip
1206  */
1207 
1208 int
1209 gusmax_dma_output(addr, buf, size, intr, arg)
1210 	void * addr;
1211 	void *buf;
1212 	int size;
1213 	void (*intr) __P((void *));
1214 	void *arg;
1215 {
1216 	struct ad1848_isa_softc *ac = addr;
1217 	return gus_dma_output(ac->sc_ad1848.parent, buf, size, intr, arg);
1218 }
1219 
1220 /*
1221  * called at splgus() from interrupt handler.
1222  */
1223 void
1224 stereo_dmaintr(arg)
1225 	void *arg;
1226 {
1227     struct gus_softc *sc = arg;
1228     struct stereo_dma_intr *sa = &sc->sc_stereo;
1229 
1230     DMAPRINTF(("stereo_dmaintr"));
1231 
1232     /*
1233      * Put other half in its place, then call the real interrupt routine :)
1234      */
1235 
1236     sc->sc_dmaoutintr = sa->intr;
1237     sc->sc_outarg = sa->arg;
1238 
1239 #ifdef GUSPLAYDEBUG
1240     if (gusstats) {
1241       microtime(&dmarecords[dmarecord_index].tv);
1242       dmarecords[dmarecord_index].gusaddr = sa->dmabuf;
1243       dmarecords[dmarecord_index].bsdaddr = sa->buffer;
1244       dmarecords[dmarecord_index].count = sa->size;
1245       dmarecords[dmarecord_index].channel = 1;
1246       dmarecords[dmarecord_index].direction = 1;
1247       dmarecord_index = (dmarecord_index + 1) % NDMARECS;
1248     }
1249 #endif
1250 
1251     gusdmaout(sc, sa->flags, sa->dmabuf, (caddr_t) sa->buffer, sa->size);
1252 
1253     sa->flags = 0;
1254     sa->dmabuf = 0;
1255     sa->buffer = 0;
1256     sa->size = 0;
1257     sa->intr = 0;
1258     sa->arg = 0;
1259 }
1260 
1261 /*
1262  * Start up DMA output to the card.
1263  * Called at splgus/splaudio already, either from intr handler or from
1264  * generic audio code.
1265  */
1266 int
1267 gus_dma_output(addr, buf, size, intr, arg)
1268 	void * addr;
1269 	void *buf;
1270 	int size;
1271 	void (*intr) __P((void *));
1272 	void *arg;
1273 {
1274 	struct gus_softc *sc = addr;
1275 	u_char *buffer = buf;
1276 	u_long boarddma;
1277 	int flags;
1278 
1279 	DMAPRINTF(("gus_dma_output %d @ %p\n", size, buf));
1280 
1281 	if (size != sc->sc_blocksize) {
1282 	    DPRINTF(("gus_dma_output reqsize %d not sc_blocksize %d\n",
1283 		     size, sc->sc_blocksize));
1284 	    return EINVAL;
1285 	}
1286 
1287 	flags = GUSMASK_DMA_WRITE;
1288 	if (sc->sc_precision == 16)
1289 	    flags |= GUSMASK_DMA_DATA_SIZE;
1290 	if (sc->sc_encoding == AUDIO_ENCODING_ULAW ||
1291 	    sc->sc_encoding == AUDIO_ENCODING_ALAW ||
1292 	    sc->sc_encoding == AUDIO_ENCODING_ULINEAR_BE ||
1293 	    sc->sc_encoding == AUDIO_ENCODING_ULINEAR_LE)
1294 	    flags |= GUSMASK_DMA_INVBIT;
1295 
1296 	if (sc->sc_channels == 2) {
1297 		if (sc->sc_precision == 16) {
1298 			if (size & 3) {
1299 				DPRINTF(("gus_dma_output: unpaired 16bit samples"));
1300 				size &= 3;
1301 			}
1302 		} else if (size & 1) {
1303 			DPRINTF(("gus_dma_output: unpaired samples"));
1304 			size &= 1;
1305 		}
1306 		if (size == 0)
1307 			return 0;
1308 
1309 		gus_deinterleave(sc, (void *)buffer, size);
1310 
1311 		size >>= 1;
1312 
1313  		boarddma = size * sc->sc_dmabuf + GUS_MEM_OFFSET;
1314 
1315 		sc->sc_stereo.intr = intr;
1316 		sc->sc_stereo.arg = arg;
1317 		sc->sc_stereo.size = size;
1318 		sc->sc_stereo.dmabuf = boarddma + GUS_LEFT_RIGHT_OFFSET;
1319 		sc->sc_stereo.buffer = buffer + size;
1320 		sc->sc_stereo.flags = flags;
1321 		if (gus_dostereo) {
1322 		  intr = stereo_dmaintr;
1323 		  arg = sc;
1324 		}
1325 	} else
1326 		boarddma = size * sc->sc_dmabuf + GUS_MEM_OFFSET;
1327 
1328 
1329 	sc->sc_flags |= GUS_LOCKED;
1330 	sc->sc_dmaoutintr = intr;
1331 	sc->sc_outarg = arg;
1332 
1333 #ifdef GUSPLAYDEBUG
1334 	if (gusstats) {
1335 	  microtime(&dmarecords[dmarecord_index].tv);
1336 	  dmarecords[dmarecord_index].gusaddr = boarddma;
1337 	  dmarecords[dmarecord_index].bsdaddr = buffer;
1338 	  dmarecords[dmarecord_index].count = size;
1339 	  dmarecords[dmarecord_index].channel = 0;
1340 	  dmarecords[dmarecord_index].direction = 1;
1341 	  dmarecord_index = (dmarecord_index + 1) % NDMARECS;
1342 	}
1343 #endif
1344 
1345 	gusdmaout(sc, flags, boarddma, (caddr_t) buffer, size);
1346 
1347 	return 0;
1348 }
1349 
1350 void
1351 gusmax_close(addr)
1352 	void *addr;
1353 {
1354 	struct ad1848_isa_softc *ac = addr;
1355 	struct gus_softc *sc = ac->sc_ad1848.parent;
1356 #if 0
1357 	ac->mute[AD1848_AUX1_CHANNEL] = MUTE_ALL;
1358 	ad1848_mute_channel(ac, MUTE_ALL); /* turn off DAC output */
1359 #endif
1360 	ad1848_close(&ac->sc_ad1848);
1361 	gusclose(sc);
1362 }
1363 
1364 /*
1365  * Close out device stuff.  Called at splgus() from generic audio layer.
1366  */
1367 void
1368 gusclose(addr)
1369 	void *addr;
1370 {
1371 	struct gus_softc *sc = addr;
1372 
1373         DPRINTF(("gus_close: sc=%p\n", sc));
1374 
1375 
1376 /*	if (sc->sc_flags & GUS_DMAOUT_ACTIVE) */ {
1377 		gus_halt_out_dma(sc);
1378 	}
1379 /*	if (sc->sc_flags & GUS_DMAIN_ACTIVE) */ {
1380 		gus_halt_in_dma(sc);
1381 	}
1382 	sc->sc_flags &= ~(GUS_OPEN|GUS_LOCKED|GUS_DMAOUT_ACTIVE|GUS_DMAIN_ACTIVE);
1383 
1384 	if (sc->sc_deintr_buf) {
1385 		FREE(sc->sc_deintr_buf, M_DEVBUF);
1386 		sc->sc_deintr_buf = NULL;
1387 	}
1388 	/* turn off speaker, etc. */
1389 
1390 	/* make sure the voices shut up: */
1391 	gus_stop_voice(sc, GUS_VOICE_LEFT, 1);
1392 	gus_stop_voice(sc, GUS_VOICE_RIGHT, 0);
1393 }
1394 
1395 /*
1396  * Service interrupts.  Farm them off to helper routines if we are using the
1397  * GUS for simple playback/record
1398  */
1399 
1400 #ifdef DIAGNOSTIC
1401 int gusintrcnt;
1402 int gusdmaintrcnt;
1403 int gusvocintrcnt;
1404 #endif
1405 
1406 int
1407 gusintr(arg)
1408 	void *arg;
1409 {
1410 	struct gus_softc *sc = arg;
1411 	bus_space_tag_t iot = sc->sc_iot;
1412 	bus_space_handle_t ioh1 = sc->sc_ioh1;
1413 	bus_space_handle_t ioh2 = sc->sc_ioh2;
1414 	unsigned char intr;
1415 
1416 	int retval = 0;
1417 
1418 	DPRINTF(("gusintr\n"));
1419 #ifdef DIAGNOSTIC
1420 	gusintrcnt++;
1421 #endif
1422 	if (HAS_CODEC(sc))
1423 		retval = ad1848_isa_intr(&sc->sc_codec);
1424 	if ((intr = bus_space_read_1(iot, ioh1, GUS_IRQ_STATUS)) & GUSMASK_IRQ_DMATC) {
1425 		DMAPRINTF(("gusintr DMA flags=%x\n", sc->sc_flags));
1426 #ifdef DIAGNOSTIC
1427 		gusdmaintrcnt++;
1428 #endif
1429 		retval += gus_dmaout_intr(sc);
1430 		if (sc->sc_flags & GUS_DMAIN_ACTIVE) {
1431 		    SELECT_GUS_REG(iot, ioh2, GUSREG_SAMPLE_CONTROL);
1432 		    intr = bus_space_read_1(iot, ioh2, GUS_DATA_HIGH);
1433 		    if (intr & GUSMASK_SAMPLE_DMATC) {
1434 			retval += gus_dmain_intr(sc);
1435 		    }
1436 		}
1437 	}
1438 	if (intr & (GUSMASK_IRQ_VOICE | GUSMASK_IRQ_VOLUME)) {
1439 		DMAPRINTF(("gusintr voice flags=%x\n", sc->sc_flags));
1440 #ifdef DIAGNOSTIC
1441 		gusvocintrcnt++;
1442 #endif
1443 		retval += gus_voice_intr(sc);
1444 	}
1445 	if (retval)
1446 		return 1;
1447 	return retval;
1448 }
1449 
1450 int gus_bufcnt[GUS_MEM_FOR_BUFFERS / GUS_BUFFER_MULTIPLE];
1451 int gus_restart;				/* how many restarts? */
1452 int gus_stops;				/* how many times did voice stop? */
1453 int gus_falsestops;			/* stopped but not done? */
1454 int gus_continues;
1455 
1456 struct playcont {
1457 	struct timeval tv;
1458 	u_int playbuf;
1459 	u_int dmabuf;
1460 	u_char bufcnt;
1461 	u_char vaction;
1462 	u_char voccntl;
1463 	u_char volcntl;
1464 	u_long curaddr;
1465 	u_long endaddr;
1466 } playstats[NDMARECS];
1467 
1468 int playcntr;
1469 
1470 STATIC void
1471 gus_dmaout_timeout(arg)
1472  	void *arg;
1473 {
1474  	struct gus_softc *sc = arg;
1475  	bus_space_tag_t iot = sc->sc_iot;
1476  	bus_space_handle_t ioh2 = sc->sc_ioh2;
1477  	int s;
1478 
1479  	printf("%s: dmaout timeout\n", sc->sc_dev.dv_xname);
1480  	/*
1481  	 * Stop any DMA.
1482  	 */
1483 
1484  	s = splgus();
1485  	SELECT_GUS_REG(iot, ioh2, GUSREG_DMA_CONTROL);
1486  	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0);
1487 
1488 #if 0
1489  	/* XXX we will dmadone below? */
1490  	isa_dmaabort(sc->sc_dev.dv_parent, sc->sc_playdrq);
1491 #endif
1492 
1493  	gus_dmaout_dointr(sc);
1494  	splx(s);
1495 }
1496 
1497 
1498 /*
1499  * Service DMA interrupts.  This routine will only get called if we're doing
1500  * a DMA transfer for playback/record requests from the audio layer.
1501  */
1502 
1503 STATIC int
1504 gus_dmaout_intr(sc)
1505 	struct gus_softc *sc;
1506 {
1507 	bus_space_tag_t iot = sc->sc_iot;
1508 	bus_space_handle_t ioh2 = sc->sc_ioh2;
1509 
1510 	/*
1511 	 * If we got a DMA transfer complete from the GUS DRAM, then deal
1512 	 * with it.
1513 	 */
1514 
1515 	SELECT_GUS_REG(iot, ioh2, GUSREG_DMA_CONTROL);
1516  	if (bus_space_read_1(iot, ioh2, GUS_DATA_HIGH) & GUSMASK_DMA_IRQPEND) {
1517 	    callout_stop(&sc->sc_dmaout_ch);
1518 	    gus_dmaout_dointr(sc);
1519 	    return 1;
1520 	}
1521 	return 0;
1522 }
1523 
1524 STATIC void
1525 gus_dmaout_dointr(sc)
1526 	struct gus_softc *sc;
1527 {
1528  	bus_space_tag_t iot = sc->sc_iot;
1529  	bus_space_handle_t ioh2 = sc->sc_ioh2;
1530 
1531 	/* sc->sc_dmaoutcnt - 1 because DMA controller counts from zero?. */
1532  	isa_dmadone(sc->sc_ic, sc->sc_playdrq);
1533 	sc->sc_flags &= ~GUS_DMAOUT_ACTIVE;  /* pending DMA is done */
1534  	DMAPRINTF(("gus_dmaout_dointr %d @ %p\n", sc->sc_dmaoutcnt,
1535 		   sc->sc_dmaoutaddr));
1536 
1537 	/*
1538 	 * to prevent clicking, we need to copy last sample
1539 	 * from last buffer to scratch area just before beginning of
1540 	 * buffer.  However, if we're doing formats that are converted by
1541 	 * the card during the DMA process, we need to pick up the converted
1542 	 * byte rather than the one we have in memory.
1543 	 */
1544 	if (sc->sc_dmabuf == sc->sc_nbufs - 1) {
1545 	  int i;
1546 	  switch (sc->sc_encoding) {
1547 	  case AUDIO_ENCODING_SLINEAR_LE:
1548 	  case AUDIO_ENCODING_SLINEAR_BE:
1549 	    if (sc->sc_precision == 8)
1550 	      goto byte;
1551 	    /* we have the native format */
1552 	    for (i = 1; i <= 2; i++)
1553 	      guspoke(iot, ioh2, sc->sc_gusaddr -
1554 		      (sc->sc_nbufs - 1) * sc->sc_chanblocksize - i,
1555 		      sc->sc_dmaoutaddr[sc->sc_dmaoutcnt-i]);
1556 	    break;
1557 	  case AUDIO_ENCODING_ULINEAR_LE:
1558 	  case AUDIO_ENCODING_ULINEAR_BE:
1559 	    guspoke(iot, ioh2, sc->sc_gusaddr -
1560 		    (sc->sc_nbufs - 1) * sc->sc_chanblocksize - 2,
1561 		    guspeek(iot, ioh2,
1562 			    sc->sc_gusaddr + sc->sc_chanblocksize - 2));
1563 	  case AUDIO_ENCODING_ALAW:
1564 	  case AUDIO_ENCODING_ULAW:
1565 	  byte:
1566 	    /* we need to fetch the translated byte, then stuff it. */
1567 	    guspoke(iot, ioh2, sc->sc_gusaddr -
1568 		    (sc->sc_nbufs - 1) * sc->sc_chanblocksize - 1,
1569 		    guspeek(iot, ioh2,
1570 			    sc->sc_gusaddr + sc->sc_chanblocksize - 1));
1571 	    break;
1572 	  }
1573 	}
1574 	/*
1575 	 * If this is the first half of stereo, "ignore" this one
1576 	 * and copy out the second half.
1577 	 */
1578 	if (sc->sc_dmaoutintr == stereo_dmaintr) {
1579 	    (*sc->sc_dmaoutintr)(sc->sc_outarg);
1580 	    return;
1581 	}
1582 	/*
1583 	 * If the voice is stopped, then start it.  Reset the loop
1584 	 * and roll bits.  Call the audio layer routine, since if
1585 	 * we're starting a stopped voice, that means that the next
1586 	 * buffer can be filled
1587 	 */
1588 
1589 	sc->sc_flags &= ~GUS_LOCKED;
1590 	if (sc->sc_voc[GUS_VOICE_LEFT].voccntl &
1591 	    GUSMASK_VOICE_STOPPED) {
1592 	    if (sc->sc_flags & GUS_PLAYING) {
1593 		printf("%s: playing yet stopped?\n", sc->sc_dev.dv_xname);
1594 	    }
1595 	    sc->sc_bufcnt++; /* another yet to be played */
1596 	    gus_start_playing(sc, sc->sc_dmabuf);
1597 	    gus_restart++;
1598 	} else {
1599 	    /*
1600 	     * set the sound action based on which buffer we
1601 	     * just transferred.  If we just transferred buffer 0
1602 	     * we want the sound to loop when it gets to the nth
1603 	     * buffer; if we just transferred
1604 	     * any other buffer, we want the sound to roll over
1605 	     * at least one more time.  The voice interrupt
1606 	     * handlers will take care of accounting &
1607 	     * setting control bits if it's not caught up to us
1608 	     * yet.
1609 	     */
1610 	    if (++sc->sc_bufcnt == 2) {
1611 		/*
1612 		 * XXX
1613 		 * If we're too slow in reaction here,
1614 		 * the voice could be just approaching the
1615 		 * end of its run.  It should be set to stop,
1616 		 * so these adjustments might not DTRT.
1617 		 */
1618 		if (sc->sc_dmabuf == 0 &&
1619 		    sc->sc_playbuf == sc->sc_nbufs - 1) {
1620 		    /* player is just at the last buf, we're at the
1621 		       first.  Turn on looping, turn off rolling. */
1622 		    sc->sc_voc[GUS_VOICE_LEFT].voccntl |= GUSMASK_LOOP_ENABLE;
1623 		    sc->sc_voc[GUS_VOICE_LEFT].volcntl &= ~GUSMASK_VOICE_ROLL;
1624 		    playstats[playcntr].vaction = 3;
1625 		} else {
1626 		    /* player is at previous buf:
1627 		       turn on rolling, turn off looping */
1628 		    sc->sc_voc[GUS_VOICE_LEFT].voccntl &= ~GUSMASK_LOOP_ENABLE;
1629 		    sc->sc_voc[GUS_VOICE_LEFT].volcntl |= GUSMASK_VOICE_ROLL;
1630 		    playstats[playcntr].vaction = 4;
1631 		}
1632 #ifdef GUSPLAYDEBUG
1633 		if (gusstats) {
1634 		  microtime(&playstats[playcntr].tv);
1635 		  playstats[playcntr].endaddr = sc->sc_voc[GUS_VOICE_LEFT].end_addr;
1636 		  playstats[playcntr].voccntl = sc->sc_voc[GUS_VOICE_LEFT].voccntl;
1637 		  playstats[playcntr].volcntl = sc->sc_voc[GUS_VOICE_LEFT].volcntl;
1638 		  playstats[playcntr].playbuf = sc->sc_playbuf;
1639 		  playstats[playcntr].dmabuf = sc->sc_dmabuf;
1640 		  playstats[playcntr].bufcnt = sc->sc_bufcnt;
1641 		  playstats[playcntr].curaddr = gus_get_curaddr(sc, GUS_VOICE_LEFT);
1642 		  playcntr = (playcntr + 1) % NDMARECS;
1643 		}
1644 #endif
1645 		bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, GUS_VOICE_LEFT);
1646 		SELECT_GUS_REG(iot, ioh2, GUSREG_VOICE_CNTL);
1647 		bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[GUS_VOICE_LEFT].voccntl);
1648 		SELECT_GUS_REG(iot, ioh2, GUSREG_VOLUME_CONTROL);
1649 		bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[GUS_VOICE_LEFT].volcntl);
1650 	    }
1651 	}
1652 	gus_bufcnt[sc->sc_bufcnt-1]++;
1653 	/*
1654 	 * flip to the next DMA buffer
1655 	 */
1656 
1657 	sc->sc_dmabuf = ++sc->sc_dmabuf % sc->sc_nbufs;
1658 	/*
1659 	 * See comments below about DMA admission control strategy.
1660 	 * We can call the upper level here if we have an
1661 	 * idle buffer (not currently playing) to DMA into.
1662 	 */
1663 	if (sc->sc_dmaoutintr && sc->sc_bufcnt < sc->sc_nbufs) {
1664 	    /* clean out to prevent double calls */
1665 	    void (*pfunc) __P((void *)) = sc->sc_dmaoutintr;
1666 	    void *arg = sc->sc_outarg;
1667 
1668 	    sc->sc_outarg = 0;
1669 	    sc->sc_dmaoutintr = 0;
1670 	    (*pfunc)(arg);
1671 	}
1672 }
1673 
1674 /*
1675  * Service voice interrupts
1676  */
1677 
1678 STATIC int
1679 gus_voice_intr(sc)
1680 	struct gus_softc *sc;
1681 {
1682 	bus_space_tag_t iot = sc->sc_iot;
1683 	bus_space_handle_t ioh2 = sc->sc_ioh2;
1684 	int ignore = 0, voice, rval = 0;
1685 	unsigned char intr, status;
1686 
1687 	/*
1688 	 * The point of this may not be obvious at first.  A voice can
1689 	 * interrupt more than once; according to the GUS SDK we are supposed
1690 	 * to ignore multiple interrupts for the same voice.
1691 	 */
1692 
1693 	while(1) {
1694 		SELECT_GUS_REG(iot, ioh2, GUSREG_IRQ_STATUS);
1695 		intr = bus_space_read_1(iot, ioh2, GUS_DATA_HIGH);
1696 
1697 		if ((intr & (GUSMASK_WIRQ_VOLUME | GUSMASK_WIRQ_VOICE))
1698 			== (GUSMASK_WIRQ_VOLUME | GUSMASK_WIRQ_VOICE))
1699 			/*
1700 			 * No more interrupts, time to return
1701 			 */
1702 		 	return rval;
1703 
1704 		if ((intr & GUSMASK_WIRQ_VOICE) == 0) {
1705 
1706 		    /*
1707 		     * We've got a voice interrupt.  Ignore previous
1708 		     * interrupts by the same voice.
1709 		     */
1710 
1711 		    rval = 1;
1712 		    voice = intr & GUSMASK_WIRQ_VOICEMASK;
1713 
1714 		    if ((1 << voice) & ignore)
1715 			break;
1716 
1717 		    ignore |= 1 << voice;
1718 
1719 		    /*
1720 		     * If the voice is stopped, then force it to stop
1721 		     * (this stops it from continuously generating IRQs)
1722 		     */
1723 
1724 		    SELECT_GUS_REG(iot, ioh2, GUSREG_VOICE_CNTL+0x80);
1725 		    status = bus_space_read_1(iot, ioh2, GUS_DATA_HIGH);
1726 		    if (status & GUSMASK_VOICE_STOPPED) {
1727 			if (voice != GUS_VOICE_LEFT) {
1728 			    DMAPRINTF(("%s: spurious voice %d stop?\n",
1729 				       sc->sc_dev.dv_xname, voice));
1730 			    gus_stop_voice(sc, voice, 0);
1731 			    continue;
1732 			}
1733 			gus_stop_voice(sc, voice, 1);
1734 			/* also kill right voice */
1735 			gus_stop_voice(sc, GUS_VOICE_RIGHT, 0);
1736 			sc->sc_bufcnt--; /* it finished a buffer */
1737 			if (sc->sc_bufcnt > 0) {
1738 			    /*
1739 			     * probably a race to get here: the voice
1740 			     * stopped while the DMA code was just trying to
1741 			     * get the next buffer in place.
1742 			     * Start the voice again.
1743 			     */
1744 			    printf("%s: stopped voice not drained? (%x)\n",
1745 				   sc->sc_dev.dv_xname, sc->sc_bufcnt);
1746 			    gus_falsestops++;
1747 
1748 			    sc->sc_playbuf = ++sc->sc_playbuf % sc->sc_nbufs;
1749 			    gus_start_playing(sc, sc->sc_playbuf);
1750 			} else if (sc->sc_bufcnt < 0) {
1751 			    panic("%s: negative bufcnt in stopped voice",
1752 				  sc->sc_dev.dv_xname);
1753 			} else {
1754 			    sc->sc_playbuf = -1; /* none are active */
1755 			    gus_stops++;
1756 			}
1757 			/* fall through to callback and admit another
1758 			   buffer.... */
1759 		    } else if (sc->sc_bufcnt != 0) {
1760 			/*
1761 			 * This should always be taken if the voice
1762 			 * is not stopped.
1763 			 */
1764 			gus_continues++;
1765 			if (gus_continue_playing(sc, voice)) {
1766 				/*
1767 				 * we shouldn't have continued--active DMA
1768 				 * is in the way in the ring, for
1769 				 * some as-yet undebugged reason.
1770 				 */
1771 				gus_stop_voice(sc, GUS_VOICE_LEFT, 1);
1772 				/* also kill right voice */
1773 				gus_stop_voice(sc, GUS_VOICE_RIGHT, 0);
1774 				sc->sc_playbuf = -1;
1775 				gus_stops++;
1776 			}
1777 		    }
1778 		    /*
1779 		     * call the upper level to send on down another
1780 		     * block. We do admission rate control as follows:
1781 		     *
1782 		     * When starting up output (in the first N
1783 		     * blocks), call the upper layer after the DMA is
1784 		     * complete (see above in gus_dmaout_intr()).
1785 		     *
1786 		     * When output is already in progress and we have
1787 		     * no more GUS buffers to use for DMA, the DMA
1788 		     * output routines do not call the upper layer.
1789 		     * Instead, we call the DMA completion routine
1790 		     * here, after the voice interrupts indicating
1791 		     * that it's finished with a buffer.
1792 		     *
1793 		     * However, don't call anything here if the DMA
1794 		     * output flag is set, (which shouldn't happen)
1795 		     * because we'll squish somebody else's DMA if
1796 		     * that's the case.  When DMA is done, it will
1797 		     * call back if there is a spare buffer.
1798 		     */
1799 		    if (sc->sc_dmaoutintr && !(sc->sc_flags & GUS_LOCKED)) {
1800 			if (sc->sc_dmaoutintr == stereo_dmaintr)
1801 			    printf("gusdmaout botch?\n");
1802 			else {
1803 			    /* clean out to avoid double calls */
1804 			    void (*pfunc) __P((void *)) = sc->sc_dmaoutintr;
1805 			    void *arg = sc->sc_outarg;
1806 
1807 			    sc->sc_outarg = 0;
1808 			    sc->sc_dmaoutintr = 0;
1809 			    (*pfunc)(arg);
1810 			}
1811 		    }
1812 		}
1813 
1814 		/*
1815 		 * Ignore other interrupts for now
1816 		 */
1817 	}
1818 	return 0;
1819 }
1820 
1821 STATIC void
1822 gus_start_playing(sc, bufno)
1823 	struct gus_softc *sc;
1824 	int bufno;
1825 {
1826 	bus_space_tag_t iot = sc->sc_iot;
1827 	bus_space_handle_t ioh2 = sc->sc_ioh2;
1828 	/*
1829 	 * Start the voices playing, with buffer BUFNO.
1830 	 */
1831 
1832 	/*
1833 	 * Loop or roll if we have buffers ready.
1834 	 */
1835 
1836 	if (sc->sc_bufcnt == 1) {
1837 		sc->sc_voc[GUS_VOICE_LEFT].voccntl &= ~(GUSMASK_LOOP_ENABLE);
1838 		sc->sc_voc[GUS_VOICE_LEFT].volcntl &= ~(GUSMASK_VOICE_ROLL);
1839 	} else {
1840 		if (bufno == sc->sc_nbufs - 1) {
1841 			sc->sc_voc[GUS_VOICE_LEFT].voccntl |= GUSMASK_LOOP_ENABLE;
1842 			sc->sc_voc[GUS_VOICE_LEFT].volcntl &= ~(GUSMASK_VOICE_ROLL);
1843 		} else {
1844 			sc->sc_voc[GUS_VOICE_LEFT].voccntl &= ~GUSMASK_LOOP_ENABLE;
1845 			sc->sc_voc[GUS_VOICE_LEFT].volcntl |= GUSMASK_VOICE_ROLL;
1846 		}
1847 	}
1848 
1849 	bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, GUS_VOICE_LEFT);
1850 
1851 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOICE_CNTL);
1852 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[GUS_VOICE_LEFT].voccntl);
1853 
1854 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOLUME_CONTROL);
1855 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[GUS_VOICE_LEFT].volcntl);
1856 
1857 	sc->sc_voc[GUS_VOICE_LEFT].current_addr =
1858 		GUS_MEM_OFFSET + sc->sc_chanblocksize * bufno;
1859 	sc->sc_voc[GUS_VOICE_LEFT].end_addr =
1860 		sc->sc_voc[GUS_VOICE_LEFT].current_addr + sc->sc_chanblocksize - 1;
1861 	sc->sc_voc[GUS_VOICE_RIGHT].current_addr =
1862 		sc->sc_voc[GUS_VOICE_LEFT].current_addr +
1863 		(gus_dostereo && sc->sc_channels == 2 ? GUS_LEFT_RIGHT_OFFSET : 0);
1864 	/*
1865 	 * set up right channel to just loop forever, no interrupts,
1866 	 * starting at the buffer we just filled.  We'll feed it data
1867 	 * at the same time as left channel.
1868 	 */
1869 	sc->sc_voc[GUS_VOICE_RIGHT].voccntl |= GUSMASK_LOOP_ENABLE;
1870 	sc->sc_voc[GUS_VOICE_RIGHT].volcntl &= ~(GUSMASK_VOICE_ROLL);
1871 
1872 #ifdef GUSPLAYDEBUG
1873 	if (gusstats) {
1874 		microtime(&playstats[playcntr].tv);
1875 		playstats[playcntr].curaddr = sc->sc_voc[GUS_VOICE_LEFT].current_addr;
1876 
1877 		playstats[playcntr].voccntl = sc->sc_voc[GUS_VOICE_LEFT].voccntl;
1878 		playstats[playcntr].volcntl = sc->sc_voc[GUS_VOICE_LEFT].volcntl;
1879 		playstats[playcntr].endaddr = sc->sc_voc[GUS_VOICE_LEFT].end_addr;
1880 		playstats[playcntr].playbuf = bufno;
1881 		playstats[playcntr].dmabuf = sc->sc_dmabuf;
1882 		playstats[playcntr].bufcnt = sc->sc_bufcnt;
1883 		playstats[playcntr].vaction = 5;
1884 		playcntr = (playcntr + 1) % NDMARECS;
1885 	}
1886 #endif
1887 
1888 	bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, GUS_VOICE_RIGHT);
1889 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOICE_CNTL);
1890 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[GUS_VOICE_RIGHT].voccntl);
1891 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOLUME_CONTROL);
1892 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[GUS_VOICE_RIGHT].volcntl);
1893 
1894 	gus_start_voice(sc, GUS_VOICE_RIGHT, 0);
1895 	gus_start_voice(sc, GUS_VOICE_LEFT, 1);
1896 	if (sc->sc_playbuf == -1)
1897 		/* mark start of playing */
1898 		sc->sc_playbuf = bufno;
1899 }
1900 
1901 STATIC int
1902 gus_continue_playing(sc, voice)
1903 	struct gus_softc *sc;
1904 	int voice;
1905 {
1906 	bus_space_tag_t iot = sc->sc_iot;
1907 	bus_space_handle_t ioh2 = sc->sc_ioh2;
1908 
1909 	/*
1910 	 * stop this voice from interrupting while we work.
1911 	 */
1912 
1913 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOICE_CNTL);
1914 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[voice].voccntl & ~(GUSMASK_VOICE_IRQ));
1915 
1916 	/*
1917 	 * update playbuf to point to the buffer the hardware just started
1918 	 * playing
1919 	 */
1920 	sc->sc_playbuf = ++sc->sc_playbuf % sc->sc_nbufs;
1921 
1922 	/*
1923 	 * account for buffer just finished
1924 	 */
1925 	if (--sc->sc_bufcnt == 0) {
1926 		DPRINTF(("gus: bufcnt 0 on continuing voice?\n"));
1927 	}
1928 	if (sc->sc_playbuf == sc->sc_dmabuf && (sc->sc_flags & GUS_LOCKED)) {
1929 		printf("%s: continue into active dmabuf?\n", sc->sc_dev.dv_xname);
1930 		return 1;
1931 	}
1932 
1933 	/*
1934 	 * Select the end of the buffer based on the currently active
1935 	 * buffer, [plus extra contiguous buffers (if ready)].
1936 	 */
1937 
1938 	/*
1939 	 * set endpoint at end of buffer we just started playing.
1940 	 *
1941 	 * The total gets -1 because end addrs are one less than you might
1942 	 * think (the end_addr is the address of the last sample to play)
1943 	 */
1944 	gus_set_endaddr(sc, voice, GUS_MEM_OFFSET +
1945 			sc->sc_chanblocksize * (sc->sc_playbuf + 1) - 1);
1946 
1947 	if (sc->sc_bufcnt < 2) {
1948 		/*
1949 		 * Clear out the loop and roll flags, and rotate the currently
1950 		 * playing buffer.  That way, if we don't manage to get more
1951 		 * data before this buffer finishes, we'll just stop.
1952 		 */
1953 		sc->sc_voc[voice].voccntl &= ~GUSMASK_LOOP_ENABLE;
1954 		sc->sc_voc[voice].volcntl &= ~GUSMASK_VOICE_ROLL;
1955 		playstats[playcntr].vaction = 0;
1956 	} else {
1957 		/*
1958 		 * We have some buffers to play.  set LOOP if we're on the
1959 		 * last buffer in the ring, otherwise set ROLL.
1960 		 */
1961 		if (sc->sc_playbuf == sc->sc_nbufs - 1) {
1962 			sc->sc_voc[voice].voccntl |= GUSMASK_LOOP_ENABLE;
1963 			sc->sc_voc[voice].volcntl &= ~GUSMASK_VOICE_ROLL;
1964 			playstats[playcntr].vaction = 1;
1965 		} else {
1966 			sc->sc_voc[voice].voccntl &= ~GUSMASK_LOOP_ENABLE;
1967 			sc->sc_voc[voice].volcntl |= GUSMASK_VOICE_ROLL;
1968 			playstats[playcntr].vaction = 2;
1969 		}
1970 	}
1971 #ifdef GUSPLAYDEBUG
1972 	if (gusstats) {
1973 		microtime(&playstats[playcntr].tv);
1974 		playstats[playcntr].curaddr = gus_get_curaddr(sc, voice);
1975 
1976 		playstats[playcntr].voccntl = sc->sc_voc[voice].voccntl;
1977 		playstats[playcntr].volcntl = sc->sc_voc[voice].volcntl;
1978 		playstats[playcntr].endaddr = sc->sc_voc[voice].end_addr;
1979 		playstats[playcntr].playbuf = sc->sc_playbuf;
1980 		playstats[playcntr].dmabuf = sc->sc_dmabuf;
1981 		playstats[playcntr].bufcnt = sc->sc_bufcnt;
1982 		playcntr = (playcntr + 1) % NDMARECS;
1983 	}
1984 #endif
1985 
1986 	/*
1987 	 * (re-)set voice parameters.  This will reenable interrupts from this
1988 	 * voice.
1989 	 */
1990 
1991 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOICE_CNTL);
1992 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[voice].voccntl);
1993 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOLUME_CONTROL);
1994 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[voice].volcntl);
1995 	return 0;
1996 }
1997 
1998 /*
1999  * Send/receive data into GUS's DRAM using DMA.  Called at splgus()
2000  */
2001 
2002 STATIC void
2003 gusdmaout(sc, flags, gusaddr, buffaddr, length)
2004 	struct gus_softc *sc;
2005 	int flags, length;
2006 	u_long gusaddr;
2007 	caddr_t buffaddr;
2008 {
2009 	unsigned char c = (unsigned char) flags;
2010 	bus_space_tag_t iot = sc->sc_iot;
2011 	bus_space_handle_t ioh2 = sc->sc_ioh2;
2012 
2013 	DMAPRINTF(("gusdmaout flags=%x scflags=%x\n", flags, sc->sc_flags));
2014 
2015 	sc->sc_gusaddr = gusaddr;
2016 
2017 	/*
2018 	 * If we're using a 16 bit DMA channel, we have to jump through some
2019 	 * extra hoops; this includes translating the DRAM address a bit
2020 	 */
2021 
2022 	if (sc->sc_playdrq >= 4) {
2023 		c |= GUSMASK_DMA_WIDTH;
2024 		gusaddr = convert_to_16bit(gusaddr);
2025 	}
2026 
2027 	/*
2028 	 * Add flag bits that we always set - fast DMA, enable IRQ
2029 	 */
2030 
2031 	c |= GUSMASK_DMA_ENABLE | GUSMASK_DMA_R0 | GUSMASK_DMA_IRQ;
2032 
2033 	/*
2034 	 * Make sure the GUS _isn't_ setup for DMA
2035 	 */
2036 
2037  	SELECT_GUS_REG(iot, ioh2, GUSREG_DMA_CONTROL);
2038 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0);
2039 
2040 	/*
2041 	 * Tell the PC DMA controller to start doing DMA
2042 	 */
2043 
2044 	sc->sc_dmaoutaddr = (u_char *) buffaddr;
2045 	sc->sc_dmaoutcnt = length;
2046  	isa_dmastart(sc->sc_ic, sc->sc_playdrq, buffaddr, length,
2047  	    NULL, DMAMODE_WRITE, BUS_DMA_NOWAIT);
2048 
2049 	/*
2050 	 * Set up DMA address - use the upper 16 bits ONLY
2051 	 */
2052 
2053 	sc->sc_flags |= GUS_DMAOUT_ACTIVE;
2054 
2055  	SELECT_GUS_REG(iot, ioh2, GUSREG_DMA_START);
2056  	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, (int) (gusaddr >> 4));
2057 
2058  	/*
2059  	 * Tell the GUS to start doing DMA
2060  	 */
2061 
2062  	SELECT_GUS_REG(iot, ioh2, GUSREG_DMA_CONTROL);
2063 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, c);
2064 
2065 	/*
2066 	 * XXX If we don't finish in one second, give up...
2067 	 */
2068 	callout_reset(&sc->sc_dmaout_ch, hz, gus_dmaout_timeout, sc);
2069 }
2070 
2071 /*
2072  * Start a voice playing on the GUS.  Called from interrupt handler at
2073  * splgus().
2074  */
2075 
2076 STATIC void
2077 gus_start_voice(sc, voice, intrs)
2078 	struct gus_softc *sc;
2079 	int voice;
2080 	int intrs;
2081 {
2082 	bus_space_tag_t iot = sc->sc_iot;
2083 	bus_space_handle_t ioh2 = sc->sc_ioh2;
2084 	u_long start;
2085 	u_long current;
2086 	u_long end;
2087 
2088 	/*
2089 	 * Pick all the values for the voice out of the gus_voice struct
2090 	 * and use those to program the voice
2091 	 */
2092 
2093  	start = sc->sc_voc[voice].start_addr;
2094  	current = sc->sc_voc[voice].current_addr;
2095  	end = sc->sc_voc[voice].end_addr;
2096 
2097  	/*
2098 	 * If we're using 16 bit data, mangle the addresses a bit
2099 	 */
2100 
2101 	if (sc->sc_voc[voice].voccntl & GUSMASK_DATA_SIZE16) {
2102 	        /* -1 on start so that we get onto sample boundary--other
2103 		   code always sets it for 1-byte rollover protection */
2104 		start = convert_to_16bit(start-1);
2105 		current = convert_to_16bit(current);
2106 		end = convert_to_16bit(end);
2107 	}
2108 
2109 	/*
2110 	 * Select the voice we want to use, and program the data addresses
2111 	 */
2112 
2113 	bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, (unsigned char) voice);
2114 
2115 	SELECT_GUS_REG(iot, ioh2, GUSREG_START_ADDR_HIGH);
2116 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, ADDR_HIGH(start));
2117 	SELECT_GUS_REG(iot, ioh2, GUSREG_START_ADDR_LOW);
2118 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, ADDR_LOW(start));
2119 
2120 	SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_ADDR_HIGH);
2121 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, ADDR_HIGH(current));
2122 	SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_ADDR_LOW);
2123 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, ADDR_LOW(current));
2124 
2125 	SELECT_GUS_REG(iot, ioh2, GUSREG_END_ADDR_HIGH);
2126 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, ADDR_HIGH(end));
2127 	SELECT_GUS_REG(iot, ioh2, GUSREG_END_ADDR_LOW);
2128 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, ADDR_LOW(end));
2129 
2130 	/*
2131 	 * (maybe) enable interrupts, disable voice stopping
2132 	 */
2133 
2134 	if (intrs) {
2135 		sc->sc_flags |= GUS_PLAYING; /* playing is about to start */
2136 		sc->sc_voc[voice].voccntl |= GUSMASK_VOICE_IRQ;
2137 		DMAPRINTF(("gus voice playing=%x\n", sc->sc_flags));
2138 	} else
2139 		sc->sc_voc[voice].voccntl &= ~GUSMASK_VOICE_IRQ;
2140 	sc->sc_voc[voice].voccntl &= ~(GUSMASK_VOICE_STOPPED |
2141 		GUSMASK_STOP_VOICE);
2142 
2143 	/*
2144 	 * Tell the GUS about it.  Note that we're doing volume ramping here
2145 	 * from 0 up to the set volume to help reduce clicks.
2146 	 */
2147 
2148 	SELECT_GUS_REG(iot, ioh2, GUSREG_START_VOLUME);
2149 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0x00);
2150 	SELECT_GUS_REG(iot, ioh2, GUSREG_END_VOLUME);
2151 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[voice].current_volume >> 4);
2152 	SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_VOLUME);
2153 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, 0x00);
2154 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOLUME_RATE);
2155 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 63);
2156 
2157 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOICE_CNTL);
2158 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[voice].voccntl);
2159 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOLUME_CONTROL);
2160 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0x00);
2161 	delay(50);
2162 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOICE_CNTL);
2163 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[voice].voccntl);
2164 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOLUME_CONTROL);
2165 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0x00);
2166 
2167 }
2168 
2169 /*
2170  * Stop a given voice.  called at splgus()
2171  */
2172 
2173 STATIC void
2174 gus_stop_voice(sc, voice, intrs_too)
2175 	struct gus_softc *sc;
2176 	int voice;
2177 	int intrs_too;
2178 {
2179 	bus_space_tag_t iot = sc->sc_iot;
2180 	bus_space_handle_t ioh2 = sc->sc_ioh2;
2181 
2182 	sc->sc_voc[voice].voccntl |= GUSMASK_VOICE_STOPPED |
2183 		GUSMASK_STOP_VOICE;
2184 	if (intrs_too) {
2185 	  sc->sc_voc[voice].voccntl &= ~(GUSMASK_VOICE_IRQ);
2186 	  /* no more DMA to do */
2187 	  sc->sc_flags &= ~GUS_PLAYING;
2188 	}
2189 	DMAPRINTF(("gusintr voice notplaying=%x\n", sc->sc_flags));
2190 
2191 	guspoke(iot, ioh2, 0L, 0);
2192 
2193 	bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, (unsigned char) voice);
2194 
2195 	SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_VOLUME);
2196 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, 0x0000);
2197 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOICE_CNTL);
2198 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[voice].voccntl);
2199 	delay(100);
2200 	SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_VOLUME);
2201 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, 0x0000);
2202 	SELECT_GUS_REG(iot, ioh2, GUSREG_VOICE_CNTL);
2203 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[voice].voccntl);
2204 
2205 	SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_ADDR_HIGH);
2206 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, 0x0000);
2207 	SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_ADDR_LOW);
2208 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, 0x0000);
2209 
2210 }
2211 
2212 
2213 /*
2214  * Set the volume of a given voice.  Called at splgus().
2215  */
2216 STATIC void
2217 gus_set_volume(sc, voice, volume)
2218 	struct gus_softc *sc;
2219 	int voice, volume;
2220 {
2221 	bus_space_tag_t iot = sc->sc_iot;
2222 	bus_space_handle_t ioh2 = sc->sc_ioh2;
2223 	unsigned int gusvol;
2224 
2225 	gusvol = gus_log_volumes[volume < 512 ? volume : 511];
2226 
2227 	sc->sc_voc[voice].current_volume = gusvol;
2228 
2229 	bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, (unsigned char) voice);
2230 
2231 	SELECT_GUS_REG(iot, ioh2, GUSREG_START_VOLUME);
2232 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, (unsigned char) (gusvol >> 4));
2233 
2234 	SELECT_GUS_REG(iot, ioh2, GUSREG_END_VOLUME);
2235 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, (unsigned char) (gusvol >> 4));
2236 
2237 	SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_VOLUME);
2238 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, gusvol << 4);
2239 	delay(500);
2240 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, gusvol << 4);
2241 
2242 }
2243 
2244 /*
2245  * Interface to the audio layer.
2246  */
2247 
2248 int
2249 gusmax_set_params(addr, setmode, usemode, p, r)
2250 	void *addr;
2251 	int setmode, usemode;
2252 	struct audio_params *p, *r;
2253 {
2254 	struct ad1848_isa_softc *ac = addr;
2255 	struct gus_softc *sc = ac->sc_ad1848.parent;
2256 	int error;
2257 
2258 	error = ad1848_set_params(ac, setmode, usemode, p, r);
2259 	if (error)
2260 		return error;
2261 	error = gus_set_params(sc, setmode, usemode, p, r);
2262 	return error;
2263 }
2264 
2265 int
2266 gus_set_params(addr, setmode, usemode, p, r)
2267 	void *addr;
2268 	int setmode, usemode;
2269 	struct audio_params *p, *r;
2270 {
2271 	struct gus_softc *sc = addr;
2272 	int s;
2273 
2274 	switch (p->encoding) {
2275 	case AUDIO_ENCODING_ULAW:
2276 	case AUDIO_ENCODING_ALAW:
2277 	case AUDIO_ENCODING_SLINEAR_LE:
2278 	case AUDIO_ENCODING_ULINEAR_LE:
2279 	case AUDIO_ENCODING_SLINEAR_BE:
2280 	case AUDIO_ENCODING_ULINEAR_BE:
2281 		break;
2282 	default:
2283 		return (EINVAL);
2284 	}
2285 
2286 	s = splaudio();
2287 
2288 	if (p->precision == 8) {
2289 		sc->sc_voc[GUS_VOICE_LEFT].voccntl &= ~GUSMASK_DATA_SIZE16;
2290 		sc->sc_voc[GUS_VOICE_RIGHT].voccntl &= ~GUSMASK_DATA_SIZE16;
2291 	} else {
2292 		sc->sc_voc[GUS_VOICE_LEFT].voccntl |= GUSMASK_DATA_SIZE16;
2293 		sc->sc_voc[GUS_VOICE_RIGHT].voccntl |= GUSMASK_DATA_SIZE16;
2294 	}
2295 
2296 	sc->sc_encoding = p->encoding;
2297 	sc->sc_precision = p->precision;
2298 	sc->sc_channels = p->channels;
2299 
2300 	splx(s);
2301 
2302 	if (p->sample_rate > gus_max_frequency[sc->sc_voices - GUS_MIN_VOICES])
2303 		p->sample_rate = gus_max_frequency[sc->sc_voices - GUS_MIN_VOICES];
2304 	if (setmode & AUMODE_RECORD)
2305 		sc->sc_irate = p->sample_rate;
2306 	if (setmode & AUMODE_PLAY)
2307 		sc->sc_orate = p->sample_rate;
2308 
2309 	switch (p->encoding) {
2310 	case AUDIO_ENCODING_ULAW:
2311 		p->sw_code = mulaw_to_ulinear8;
2312 		r->sw_code = ulinear8_to_mulaw;
2313 		break;
2314 	case AUDIO_ENCODING_ALAW:
2315 		p->sw_code = alaw_to_ulinear8;
2316 		r->sw_code = ulinear8_to_alaw;
2317 		break;
2318 	case AUDIO_ENCODING_ULINEAR_BE:
2319 	case AUDIO_ENCODING_SLINEAR_BE:
2320 		r->sw_code = p->sw_code = swap_bytes;
2321 		break;
2322 	}
2323 
2324 	return 0;
2325 }
2326 
2327 /*
2328  * Interface to the audio layer - set the blocksize to the correct number
2329  * of units
2330  */
2331 
2332 int
2333 gusmax_round_blocksize(addr, blocksize)
2334 	void * addr;
2335 	int blocksize;
2336 {
2337 	struct ad1848_isa_softc *ac = addr;
2338 	struct gus_softc *sc = ac->sc_ad1848.parent;
2339 
2340 /*	blocksize = ad1848_round_blocksize(ac, blocksize);*/
2341 	return gus_round_blocksize(sc, blocksize);
2342 }
2343 
2344 int
2345 gus_round_blocksize(addr, blocksize)
2346 	void * addr;
2347 	int blocksize;
2348 {
2349 	struct gus_softc *sc = addr;
2350 
2351 	DPRINTF(("gus_round_blocksize called\n"));
2352 
2353 	if ((sc->sc_encoding == AUDIO_ENCODING_ULAW ||
2354 	     sc->sc_encoding == AUDIO_ENCODING_ALAW) && blocksize > 32768)
2355 		blocksize = 32768;
2356 	else if (blocksize > 65536)
2357 		blocksize = 65536;
2358 
2359 	if ((blocksize % GUS_BUFFER_MULTIPLE) != 0)
2360 		blocksize = (blocksize / GUS_BUFFER_MULTIPLE + 1) *
2361 			GUS_BUFFER_MULTIPLE;
2362 
2363 	/* set up temporary buffer to hold the deinterleave, if necessary
2364 	   for stereo output */
2365 	if (sc->sc_deintr_buf) {
2366 		FREE(sc->sc_deintr_buf, M_DEVBUF);
2367 		sc->sc_deintr_buf = NULL;
2368 	}
2369 	MALLOC(sc->sc_deintr_buf, void *, blocksize>>1, M_DEVBUF, M_WAITOK);
2370 
2371 	sc->sc_blocksize = blocksize;
2372 	/* multi-buffering not quite working yet. */
2373 	sc->sc_nbufs = /*GUS_MEM_FOR_BUFFERS / blocksize*/ 2;
2374 
2375 	gus_set_chan_addrs(sc);
2376 
2377 	return blocksize;
2378 }
2379 
2380 int
2381 gus_get_out_gain(addr)
2382 	caddr_t addr;
2383 {
2384 	struct gus_softc *sc = (struct gus_softc *) addr;
2385 
2386 	DPRINTF(("gus_get_out_gain called\n"));
2387 	return sc->sc_ogain / 2;
2388 }
2389 
2390 STATIC inline void gus_set_voices(sc, voices)
2391 struct gus_softc *sc;
2392 int voices;
2393 {
2394 	bus_space_tag_t iot = sc->sc_iot;
2395 	bus_space_handle_t ioh2 = sc->sc_ioh2;
2396 	/*
2397 	 * Select the active number of voices
2398 	 */
2399 
2400 	SELECT_GUS_REG(iot, ioh2, GUSREG_ACTIVE_VOICES);
2401 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, (voices-1) | 0xc0);
2402 
2403 	sc->sc_voices = voices;
2404 }
2405 
2406 /*
2407  * Actually set the settings of various values on the card
2408  */
2409 
2410 int
2411 gusmax_commit_settings(addr)
2412 	void * addr;
2413 {
2414 	struct ad1848_isa_softc *ac = addr;
2415 	struct gus_softc *sc = ac->sc_ad1848.parent;
2416 	int error;
2417 
2418 	error = ad1848_commit_settings(ac);
2419 	if (error)
2420 		return error;
2421 	return gus_commit_settings(sc);
2422 }
2423 
2424 /*
2425  * Commit the settings.  Called at normal IPL.
2426  */
2427 int
2428 gus_commit_settings(addr)
2429 	void * addr;
2430 {
2431 	struct gus_softc *sc = addr;
2432 	int s;
2433 
2434 	DPRINTF(("gus_commit_settings called (gain = %d)\n",sc->sc_ogain));
2435 
2436 
2437 	s = splgus();
2438 
2439 	gus_set_recrate(sc, sc->sc_irate);
2440 	gus_set_volume(sc, GUS_VOICE_LEFT, sc->sc_ogain);
2441 	gus_set_volume(sc, GUS_VOICE_RIGHT, sc->sc_ogain);
2442 	gus_set_samprate(sc, GUS_VOICE_LEFT, sc->sc_orate);
2443 	gus_set_samprate(sc, GUS_VOICE_RIGHT, sc->sc_orate);
2444 	splx(s);
2445 	gus_set_chan_addrs(sc);
2446 
2447 	return 0;
2448 }
2449 
2450 STATIC void
2451 gus_set_chan_addrs(sc)
2452 struct gus_softc *sc;
2453 {
2454 	/*
2455 	 * We use sc_nbufs * blocksize bytes of storage in the on-board GUS
2456 	 * ram.
2457 	 * For mono, each of the sc_nbufs buffers is DMA'd to in one chunk,
2458 	 * and both left & right channels play the same buffer.
2459 	 *
2460 	 * For stereo, each channel gets a contiguous half of the memory,
2461 	 * and each has sc_nbufs buffers of size blocksize/2.
2462 	 * Stereo data are deinterleaved in main memory before the DMA out
2463 	 * routines are called to queue the output.
2464 	 *
2465 	 * The blocksize per channel is kept in sc_chanblocksize.
2466 	 */
2467 	if (sc->sc_channels == 2)
2468 	    sc->sc_chanblocksize = sc->sc_blocksize/2;
2469 	else
2470 	    sc->sc_chanblocksize = sc->sc_blocksize;
2471 
2472 	sc->sc_voc[GUS_VOICE_LEFT].start_addr = GUS_MEM_OFFSET - 1;
2473 	sc->sc_voc[GUS_VOICE_RIGHT].start_addr =
2474 	    (gus_dostereo && sc->sc_channels == 2 ? GUS_LEFT_RIGHT_OFFSET : 0)
2475 	      + GUS_MEM_OFFSET - 1;
2476 	sc->sc_voc[GUS_VOICE_RIGHT].current_addr =
2477 	    sc->sc_voc[GUS_VOICE_RIGHT].start_addr + 1;
2478 	sc->sc_voc[GUS_VOICE_RIGHT].end_addr =
2479 	    sc->sc_voc[GUS_VOICE_RIGHT].start_addr +
2480 	    sc->sc_nbufs * sc->sc_chanblocksize;
2481 
2482 }
2483 
2484 /*
2485  * Set the sample rate of the given voice.  Called at splgus().
2486  */
2487 
2488 STATIC void
2489 gus_set_samprate(sc, voice, freq)
2490 	struct gus_softc *sc;
2491 	int voice, freq;
2492 {
2493 	bus_space_tag_t iot = sc->sc_iot;
2494 	bus_space_handle_t ioh2 = sc->sc_ioh2;
2495 	unsigned int fc;
2496 	u_long temp, f = (u_long) freq;
2497 
2498 	/*
2499 	 * calculate fc based on the number of active voices;
2500 	 * we need to use longs to preserve enough bits
2501 	 */
2502 
2503 	temp = (u_long) gus_max_frequency[sc->sc_voices-GUS_MIN_VOICES];
2504 
2505  	fc = (unsigned int)(((f << 9L) + (temp >> 1L)) / temp);
2506 
2507  	fc <<= 1;
2508 
2509 
2510 	/*
2511 	 * Program the voice frequency, and set it in the voice data record
2512 	 */
2513 
2514 	bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, (unsigned char) voice);
2515 	SELECT_GUS_REG(iot, ioh2, GUSREG_FREQ_CONTROL);
2516 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, fc);
2517 
2518 	sc->sc_voc[voice].rate = freq;
2519 
2520 }
2521 
2522 /*
2523  * Set the sample rate of the recording frequency.  Formula is from the GUS
2524  * SDK.  Called at splgus().
2525  */
2526 
2527 STATIC void
2528 gus_set_recrate(sc, rate)
2529 	struct gus_softc *sc;
2530 	u_long rate;
2531 {
2532 	bus_space_tag_t iot = sc->sc_iot;
2533 	bus_space_handle_t ioh2 = sc->sc_ioh2;
2534 	u_char realrate;
2535 	DPRINTF(("gus_set_recrate %lu\n", rate));
2536 
2537 #if 0
2538 	realrate = 9878400/(16*(rate+2)); /* formula from GUS docs */
2539 #endif
2540 	realrate = (9878400 >> 4)/rate - 2; /* formula from code, sigh. */
2541 
2542 	SELECT_GUS_REG(iot, ioh2, GUSREG_SAMPLE_FREQ);
2543  	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, realrate);
2544 }
2545 
2546 /*
2547  * Interface to the audio layer - turn the output on or off.  Note that some
2548  * of these bits are flipped in the register
2549  */
2550 
2551 int
2552 gusmax_speaker_ctl(addr, newstate)
2553 	void * addr;
2554 	int newstate;
2555 {
2556 	struct ad1848_isa_softc *sc = addr;
2557 	return gus_speaker_ctl(sc->sc_ad1848.parent, newstate);
2558 }
2559 
2560 int
2561 gus_speaker_ctl(addr, newstate)
2562 	void * addr;
2563 	int newstate;
2564 {
2565 	struct gus_softc *sc = (struct gus_softc *) addr;
2566 	bus_space_tag_t iot = sc->sc_iot;
2567 	bus_space_handle_t ioh1 = sc->sc_ioh1;
2568 
2569 	/* Line out bit is flipped: 0 enables, 1 disables */
2570 	if ((newstate == SPKR_ON) &&
2571 	    (sc->sc_mixcontrol & GUSMASK_LINE_OUT)) {
2572 		sc->sc_mixcontrol &= ~GUSMASK_LINE_OUT;
2573 		bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL, sc->sc_mixcontrol);
2574 	}
2575 	if ((newstate == SPKR_OFF) &&
2576 	    (sc->sc_mixcontrol & GUSMASK_LINE_OUT) == 0) {
2577 		sc->sc_mixcontrol |= GUSMASK_LINE_OUT;
2578 		bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL, sc->sc_mixcontrol);
2579 	}
2580 
2581 	return 0;
2582 }
2583 
2584 STATIC int
2585 gus_linein_ctl(addr, newstate)
2586 	void * addr;
2587 	int newstate;
2588 {
2589 	struct gus_softc *sc = (struct gus_softc *) addr;
2590 	bus_space_tag_t iot = sc->sc_iot;
2591 	bus_space_handle_t ioh1 = sc->sc_ioh1;
2592 
2593 	/* Line in bit is flipped: 0 enables, 1 disables */
2594 	if ((newstate == SPKR_ON) &&
2595 	    (sc->sc_mixcontrol & GUSMASK_LINE_IN)) {
2596 		sc->sc_mixcontrol &= ~GUSMASK_LINE_IN;
2597 		bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL, sc->sc_mixcontrol);
2598 	}
2599 	if ((newstate == SPKR_OFF) &&
2600 	    (sc->sc_mixcontrol & GUSMASK_LINE_IN) == 0) {
2601 		sc->sc_mixcontrol |= GUSMASK_LINE_IN;
2602 		bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL, sc->sc_mixcontrol);
2603 	}
2604 
2605 	return 0;
2606 }
2607 
2608 STATIC int
2609 gus_mic_ctl(addr, newstate)
2610 	void * addr;
2611 	int newstate;
2612 {
2613 	struct gus_softc *sc = (struct gus_softc *) addr;
2614 	bus_space_tag_t iot = sc->sc_iot;
2615 	bus_space_handle_t ioh1 = sc->sc_ioh1;
2616 
2617 	/* Mic bit is normal: 1 enables, 0 disables */
2618 	if ((newstate == SPKR_ON) &&
2619 	    (sc->sc_mixcontrol & GUSMASK_MIC_IN) == 0) {
2620 		sc->sc_mixcontrol |= GUSMASK_MIC_IN;
2621 		bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL, sc->sc_mixcontrol);
2622 	}
2623 	if ((newstate == SPKR_OFF) &&
2624 	    (sc->sc_mixcontrol & GUSMASK_MIC_IN)) {
2625 		sc->sc_mixcontrol &= ~GUSMASK_MIC_IN;
2626 		bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL, sc->sc_mixcontrol);
2627 	}
2628 
2629 	return 0;
2630 }
2631 
2632 /*
2633  * Set the end address of a give voice.  Called at splgus()
2634  */
2635 
2636 STATIC void
2637 gus_set_endaddr(sc, voice, addr)
2638 	struct gus_softc *sc;
2639 	int voice;
2640 	u_long addr;
2641 {
2642 	bus_space_tag_t iot = sc->sc_iot;
2643 	bus_space_handle_t ioh2 = sc->sc_ioh2;
2644 
2645 	sc->sc_voc[voice].end_addr = addr;
2646 
2647 	if (sc->sc_voc[voice].voccntl & GUSMASK_DATA_SIZE16)
2648 		addr = convert_to_16bit(addr);
2649 
2650 	SELECT_GUS_REG(iot, ioh2, GUSREG_END_ADDR_HIGH);
2651 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, ADDR_HIGH(addr));
2652 	SELECT_GUS_REG(iot, ioh2, GUSREG_END_ADDR_LOW);
2653 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, ADDR_LOW(addr));
2654 
2655 }
2656 
2657 #ifdef GUSPLAYDEBUG
2658 /*
2659  * Set current address.  called at splgus()
2660  */
2661 STATIC void
2662 gus_set_curaddr(sc, voice, addr)
2663 	struct gus_softc *sc;
2664 	int voice;
2665 	u_long addr;
2666 {
2667 	bus_space_tag_t iot = sc->sc_iot;
2668 	bus_space_handle_t ioh2 = sc->sc_ioh2;
2669 
2670 	sc->sc_voc[voice].current_addr = addr;
2671 
2672 	if (sc->sc_voc[voice].voccntl & GUSMASK_DATA_SIZE16)
2673 		addr = convert_to_16bit(addr);
2674 
2675 	bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, (unsigned char) voice);
2676 
2677 	SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_ADDR_HIGH);
2678 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, ADDR_HIGH(addr));
2679 	SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_ADDR_LOW);
2680 	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, ADDR_LOW(addr));
2681 
2682 }
2683 
2684 /*
2685  * Get current GUS playback address.  Called at splgus().
2686  */
2687 STATIC u_long
2688 gus_get_curaddr(sc, voice)
2689 	struct gus_softc *sc;
2690 	int voice;
2691 {
2692 	bus_space_tag_t iot = sc->sc_iot;
2693 	bus_space_handle_t ioh2 = sc->sc_ioh2;
2694 	u_long addr;
2695 
2696 	bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, (unsigned char) voice);
2697 	SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_ADDR_HIGH|GUSREG_READ);
2698 	addr = (bus_space_read_2(iot, ioh2, GUS_DATA_LOW) & 0x1fff) << 7;
2699 	SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_ADDR_LOW|GUSREG_READ);
2700 	addr |= (bus_space_read_2(iot, ioh2, GUS_DATA_LOW) >> 9L) & 0x7f;
2701 
2702 	if (sc->sc_voc[voice].voccntl & GUSMASK_DATA_SIZE16)
2703 	    addr = (addr & 0xc0000) | ((addr & 0x1ffff) << 1); /* undo 16-bit change */
2704 	DPRINTF(("gus voice %d curaddr %ld end_addr %ld\n",
2705 		 voice, addr, sc->sc_voc[voice].end_addr));
2706 	/* XXX sanity check the address? */
2707 
2708 	return(addr);
2709 }
2710 #endif
2711 
2712 /*
2713  * Convert an address value to a "16 bit" value - why this is necessary I
2714  * have NO idea
2715  */
2716 
2717 STATIC u_long
2718 convert_to_16bit(address)
2719 	u_long address;
2720 {
2721 	u_long old_address;
2722 
2723 	old_address = address;
2724 	address >>= 1;
2725 	address &= 0x0001ffffL;
2726 	address |= (old_address & 0x000c0000L);
2727 
2728 	return (address);
2729 }
2730 
2731 /*
2732  * Write a value into the GUS's DRAM
2733  */
2734 
2735 STATIC void
2736 guspoke(iot, ioh2, address, value)
2737 	bus_space_tag_t iot;
2738 	bus_space_handle_t ioh2;
2739 	long address;
2740 	unsigned char value;
2741 {
2742 
2743 	/*
2744 	 * Select the DRAM address
2745 	 */
2746 
2747  	SELECT_GUS_REG(iot, ioh2, GUSREG_DRAM_ADDR_LOW);
2748  	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, (unsigned int) (address & 0xffff));
2749  	SELECT_GUS_REG(iot, ioh2, GUSREG_DRAM_ADDR_HIGH);
2750  	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, (unsigned char) ((address >> 16) & 0xff));
2751 
2752 	/*
2753 	 * Actually write the data
2754 	 */
2755 
2756 	bus_space_write_1(iot, ioh2, GUS_DRAM_DATA, value);
2757 }
2758 
2759 /*
2760  * Read a value from the GUS's DRAM
2761  */
2762 
2763 STATIC unsigned char
2764 guspeek(iot, ioh2, address)
2765 	bus_space_tag_t iot;
2766 	bus_space_handle_t ioh2;
2767 	u_long address;
2768 {
2769 
2770 	/*
2771 	 * Select the DRAM address
2772 	 */
2773 
2774  	SELECT_GUS_REG(iot, ioh2, GUSREG_DRAM_ADDR_LOW);
2775  	bus_space_write_2(iot, ioh2, GUS_DATA_LOW, (unsigned int) (address & 0xffff));
2776  	SELECT_GUS_REG(iot, ioh2, GUSREG_DRAM_ADDR_HIGH);
2777  	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, (unsigned char) ((address >> 16) & 0xff));
2778 
2779 	/*
2780 	 * Read in the data from the board
2781 	 */
2782 
2783 	return (unsigned char) bus_space_read_1(iot, ioh2, GUS_DRAM_DATA);
2784 }
2785 
2786 /*
2787  * Reset the Gravis UltraSound card, completely
2788  */
2789 
2790 STATIC void
2791 gusreset(sc, voices)
2792 	struct gus_softc *sc;
2793 	int voices;
2794 {
2795 	bus_space_tag_t iot = sc->sc_iot;
2796 	bus_space_handle_t ioh1 = sc->sc_ioh1;
2797 	bus_space_handle_t ioh2 = sc->sc_ioh2;
2798 	bus_space_handle_t ioh4 = sc->sc_ioh4;
2799 	int i,s;
2800 
2801 	s = splgus();
2802 
2803 	/*
2804 	 * Reset the GF1 chip
2805 	 */
2806 
2807 	SELECT_GUS_REG(iot, ioh2, GUSREG_RESET);
2808 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0x00);
2809 
2810 	delay(500);
2811 
2812 	/*
2813 	 * Release reset
2814 	 */
2815 
2816 	SELECT_GUS_REG(iot, ioh2, GUSREG_RESET);
2817 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, GUSMASK_MASTER_RESET);
2818 
2819 	delay(500);
2820 
2821 	/*
2822 	 * Reset MIDI port as well
2823 	 */
2824 
2825 	bus_space_write_1(iot, ioh4, GUS_MIDI_CONTROL, MIDI_RESET);
2826 
2827 	delay(500);
2828 
2829 	bus_space_write_1(iot, ioh4, GUS_MIDI_CONTROL, 0x00);
2830 
2831 	/*
2832 	 * Clear interrupts
2833 	 */
2834 
2835 	SELECT_GUS_REG(iot, ioh2, GUSREG_DMA_CONTROL);
2836 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0x00);
2837 	SELECT_GUS_REG(iot, ioh2, GUSREG_TIMER_CONTROL);
2838 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0x00);
2839 	SELECT_GUS_REG(iot, ioh2, GUSREG_SAMPLE_CONTROL);
2840 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0x00);
2841 
2842 	gus_set_voices(sc, voices);
2843 
2844 	bus_space_read_1(iot, ioh1, GUS_IRQ_STATUS);
2845 	SELECT_GUS_REG(iot, ioh2, GUSREG_DMA_CONTROL);
2846 	bus_space_read_1(iot, ioh2, GUS_DATA_HIGH);
2847 	SELECT_GUS_REG(iot, ioh2, GUSREG_SAMPLE_CONTROL);
2848 	bus_space_read_1(iot, ioh2, GUS_DATA_HIGH);
2849 	SELECT_GUS_REG(iot, ioh2, GUSREG_IRQ_STATUS);
2850 	bus_space_read_1(iot, ioh2, GUS_DATA_HIGH);
2851 
2852 	/*
2853 	 * Reset voice specific information
2854 	 */
2855 
2856 	for(i = 0; i < voices; i++) {
2857 		bus_space_write_1(iot, ioh2, GUS_VOICE_SELECT, (unsigned char) i);
2858 
2859 		SELECT_GUS_REG(iot, ioh2, GUSREG_VOICE_CNTL);
2860 
2861 		sc->sc_voc[i].voccntl = GUSMASK_VOICE_STOPPED |
2862 			GUSMASK_STOP_VOICE;
2863 
2864 		bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[i].voccntl);
2865 
2866 		sc->sc_voc[i].volcntl = GUSMASK_VOLUME_STOPPED |
2867 				GUSMASK_STOP_VOLUME;
2868 
2869 		SELECT_GUS_REG(iot, ioh2, GUSREG_VOLUME_CONTROL);
2870 		bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, sc->sc_voc[i].volcntl);
2871 
2872 		delay(100);
2873 
2874 		gus_set_samprate(sc, i, 8000);
2875 		SELECT_GUS_REG(iot, ioh2, GUSREG_START_ADDR_HIGH);
2876 		bus_space_write_2(iot, ioh2, GUS_DATA_LOW, 0x0000);
2877 		SELECT_GUS_REG(iot, ioh2, GUSREG_START_ADDR_LOW);
2878 		bus_space_write_2(iot, ioh2, GUS_DATA_LOW, 0x0000);
2879 		SELECT_GUS_REG(iot, ioh2, GUSREG_END_ADDR_HIGH);
2880 		bus_space_write_2(iot, ioh2, GUS_DATA_LOW, 0x0000);
2881 		SELECT_GUS_REG(iot, ioh2, GUSREG_END_ADDR_LOW);
2882 		bus_space_write_2(iot, ioh2, GUS_DATA_LOW, 0x0000);
2883 		SELECT_GUS_REG(iot, ioh2, GUSREG_VOLUME_RATE);
2884 		bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0x01);
2885 		SELECT_GUS_REG(iot, ioh2, GUSREG_START_VOLUME);
2886 		bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0x10);
2887 		SELECT_GUS_REG(iot, ioh2, GUSREG_END_VOLUME);
2888 		bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0xe0);
2889 		SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_VOLUME);
2890 		bus_space_write_2(iot, ioh2, GUS_DATA_LOW, 0x0000);
2891 
2892 		SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_ADDR_HIGH);
2893 		bus_space_write_2(iot, ioh2, GUS_DATA_LOW, 0x0000);
2894 		SELECT_GUS_REG(iot, ioh2, GUSREG_CUR_ADDR_LOW);
2895 		bus_space_write_2(iot, ioh2, GUS_DATA_LOW, 0x0000);
2896 		SELECT_GUS_REG(iot, ioh2, GUSREG_PAN_POS);
2897 		bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0x07);
2898 	}
2899 
2900 	/*
2901 	 * Clear out any pending IRQs
2902 	 */
2903 
2904 	bus_space_read_1(iot, ioh1, GUS_IRQ_STATUS);
2905 	SELECT_GUS_REG(iot, ioh2, GUSREG_DMA_CONTROL);
2906 	bus_space_read_1(iot, ioh2, GUS_DATA_HIGH);
2907 	SELECT_GUS_REG(iot, ioh2, GUSREG_SAMPLE_CONTROL);
2908 	bus_space_read_1(iot, ioh2, GUS_DATA_HIGH);
2909 	SELECT_GUS_REG(iot, ioh2, GUSREG_IRQ_STATUS);
2910 	bus_space_read_1(iot, ioh2, GUS_DATA_HIGH);
2911 
2912 	SELECT_GUS_REG(iot, ioh2, GUSREG_RESET);
2913 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, GUSMASK_MASTER_RESET | GUSMASK_DAC_ENABLE |
2914 		GUSMASK_IRQ_ENABLE);
2915 
2916 	splx(s);
2917 }
2918 
2919 
2920 STATIC int
2921 gus_init_cs4231(sc)
2922 	struct gus_softc *sc;
2923 {
2924 	bus_space_tag_t iot = sc->sc_iot;
2925 	bus_space_handle_t ioh1 = sc->sc_ioh1;
2926 	int port = sc->sc_iobase;
2927 	u_char ctrl;
2928 
2929 	ctrl = (port & 0xf0) >> 4;	/* set port address middle nibble */
2930 	/*
2931 	 * The codec is a bit weird--swapped DMA channels.
2932 	 */
2933 	ctrl |= GUS_MAX_CODEC_ENABLE;
2934 	if (sc->sc_playdrq >= 4)
2935 		ctrl |= GUS_MAX_RECCHAN16;
2936 	if (sc->sc_recdrq >= 4)
2937 		ctrl |= GUS_MAX_PLAYCHAN16;
2938 
2939 	bus_space_write_1(iot, ioh1, GUS_MAX_CTRL, ctrl);
2940 
2941 	sc->sc_codec.sc_ad1848.sc_iot = sc->sc_iot;
2942 	sc->sc_codec.sc_iobase = port+GUS_MAX_CODEC_BASE;
2943 
2944 	if (ad1848_isa_mapprobe(&sc->sc_codec, sc->sc_codec.sc_iobase) == 0) {
2945 		sc->sc_flags &= ~GUS_CODEC_INSTALLED;
2946 		return (0);
2947 	} else {
2948 		struct ad1848_volume vol = {AUDIO_MAX_GAIN, AUDIO_MAX_GAIN};
2949 		sc->sc_flags |= GUS_CODEC_INSTALLED;
2950 		sc->sc_codec.sc_ad1848.parent = sc;
2951 		sc->sc_codec.sc_playdrq = sc->sc_recdrq;
2952 		sc->sc_codec.sc_play_maxsize = sc->sc_req_maxsize;
2953 		sc->sc_codec.sc_recdrq = sc->sc_playdrq;
2954 		sc->sc_codec.sc_rec_maxsize = sc->sc_play_maxsize;
2955 		gus_hw_if = gusmax_hw_if;
2956 		/* enable line in and mic in the GUS mixer; the codec chip
2957 		   will do the real mixing for them. */
2958 		sc->sc_mixcontrol &= ~GUSMASK_LINE_IN; /* 0 enables. */
2959 		sc->sc_mixcontrol |= GUSMASK_MIC_IN; /* 1 enables. */
2960 		bus_space_write_1(iot, ioh1, GUS_MIX_CONTROL, sc->sc_mixcontrol);
2961 
2962 		ad1848_isa_attach(&sc->sc_codec);
2963 		/* turn on pre-MUX microphone gain. */
2964 		ad1848_set_mic_gain(&sc->sc_codec.sc_ad1848, &vol);
2965 
2966 		return (1);
2967 	}
2968 }
2969 
2970 
2971 /*
2972  * Return info about the audio device, for the AUDIO_GETINFO ioctl
2973  */
2974 
2975 int
2976 gus_getdev(addr, dev)
2977 	void * addr;
2978 	struct audio_device *dev;
2979 {
2980 	*dev = gus_device;
2981 	return 0;
2982 }
2983 
2984 /*
2985  * stubs (XXX)
2986  */
2987 
2988 int
2989 gus_set_in_gain(addr, gain, balance)
2990 	caddr_t addr;
2991 	u_int gain;
2992 	u_char balance;
2993 {
2994 	DPRINTF(("gus_set_in_gain called\n"));
2995 	return 0;
2996 }
2997 
2998 int
2999 gus_get_in_gain(addr)
3000 	caddr_t addr;
3001 {
3002 	DPRINTF(("gus_get_in_gain called\n"));
3003 	return 0;
3004 }
3005 
3006 int
3007 gusmax_dma_input(addr, buf, size, callback, arg)
3008 	void * addr;
3009 	void *buf;
3010 	int size;
3011 	void (*callback) __P((void *));
3012 	void *arg;
3013 {
3014 	struct ad1848_isa_softc *sc = addr;
3015 	return gus_dma_input(sc->sc_ad1848.parent, buf, size, callback, arg);
3016 }
3017 
3018 /*
3019  * Start sampling the input source into the requested DMA buffer.
3020  * Called at splgus(), either from top-half or from interrupt handler.
3021  */
3022 int
3023 gus_dma_input(addr, buf, size, callback, arg)
3024 	void * addr;
3025 	void *buf;
3026 	int size;
3027 	void (*callback) __P((void *));
3028 	void *arg;
3029 {
3030 	struct gus_softc *sc = addr;
3031 	bus_space_tag_t iot = sc->sc_iot;
3032 	bus_space_handle_t ioh2 = sc->sc_ioh2;
3033 	u_char dmac;
3034 	DMAPRINTF(("gus_dma_input called\n"));
3035 
3036 	/*
3037 	 * Sample SIZE bytes of data from the card, into buffer at BUF.
3038 	 */
3039 
3040 	if (sc->sc_precision == 16)
3041 	    return EINVAL;		/* XXX */
3042 
3043 	/* set DMA modes */
3044 	dmac = GUSMASK_SAMPLE_IRQ|GUSMASK_SAMPLE_START;
3045 	if (sc->sc_recdrq >= 4)
3046 		dmac |= GUSMASK_SAMPLE_DATA16;
3047 	if (sc->sc_encoding == AUDIO_ENCODING_ULAW ||
3048  	    sc->sc_encoding == AUDIO_ENCODING_ALAW ||
3049  	    sc->sc_encoding == AUDIO_ENCODING_ULINEAR_LE ||
3050  	    sc->sc_encoding == AUDIO_ENCODING_ULINEAR_BE)
3051 	    dmac |= GUSMASK_SAMPLE_INVBIT;
3052 	if (sc->sc_channels == 2)
3053 	    dmac |= GUSMASK_SAMPLE_STEREO;
3054  	isa_dmastart(sc->sc_ic, sc->sc_recdrq, buf, size,
3055  	    NULL, DMAMODE_READ, BUS_DMA_NOWAIT);
3056 
3057 	DMAPRINTF(("gus_dma_input isa_dmastarted\n"));
3058 	sc->sc_flags |= GUS_DMAIN_ACTIVE;
3059 	sc->sc_dmainintr = callback;
3060 	sc->sc_inarg = arg;
3061 	sc->sc_dmaincnt = size;
3062 	sc->sc_dmainaddr = buf;
3063 
3064 	SELECT_GUS_REG(iot, ioh2, GUSREG_SAMPLE_CONTROL);
3065 	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, dmac);	/* Go! */
3066 
3067 
3068 	DMAPRINTF(("gus_dma_input returning\n"));
3069 
3070 	return 0;
3071 }
3072 
3073 STATIC int
3074 gus_dmain_intr(sc)
3075 	struct gus_softc *sc;
3076 {
3077         void (*callback) __P((void *));
3078 	void *arg;
3079 
3080 	DMAPRINTF(("gus_dmain_intr called\n"));
3081 	if (sc->sc_dmainintr) {
3082  	    isa_dmadone(sc->sc_ic, sc->sc_recdrq);
3083 	    callback = sc->sc_dmainintr;
3084 	    arg = sc->sc_inarg;
3085 
3086 	    sc->sc_dmainaddr = 0;
3087 	    sc->sc_dmaincnt = 0;
3088 	    sc->sc_dmainintr = 0;
3089 	    sc->sc_inarg = 0;
3090 
3091 	    sc->sc_flags &= ~GUS_DMAIN_ACTIVE;
3092 	    DMAPRINTF(("calling dmain_intr callback %p(%p)\n", callback, arg));
3093 	    (*callback)(arg);
3094 	    return 1;
3095 	} else {
3096 	    DMAPRINTF(("gus_dmain_intr false?\n"));
3097 	    return 0;			/* XXX ??? */
3098 	}
3099 }
3100 
3101 int
3102 gusmax_halt_out_dma(addr)
3103 	void * addr;
3104 {
3105 	struct ad1848_isa_softc *sc = addr;
3106 	return gus_halt_out_dma(sc->sc_ad1848.parent);
3107 }
3108 
3109 
3110 int
3111 gusmax_halt_in_dma(addr)
3112 	void * addr;
3113 {
3114 	struct ad1848_isa_softc *sc = addr;
3115 	return gus_halt_in_dma(sc->sc_ad1848.parent);
3116 }
3117 
3118 /*
3119  * Stop any DMA output.  Called at splgus().
3120  */
3121 int
3122 gus_halt_out_dma(addr)
3123 	void * addr;
3124 {
3125  	struct gus_softc *sc = addr;
3126  	bus_space_tag_t iot = sc->sc_iot;
3127  	bus_space_handle_t ioh2 = sc->sc_ioh2;
3128 
3129 	DMAPRINTF(("gus_halt_out_dma called\n"));
3130 	/*
3131 	 * Make sure the GUS _isn't_ setup for DMA
3132 	 */
3133 
3134   	SELECT_GUS_REG(iot, ioh2, GUSREG_DMA_CONTROL);
3135  	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH, 0);
3136 
3137 	callout_stop(&sc->sc_dmaout_ch);
3138  	isa_dmaabort(sc->sc_ic, sc->sc_playdrq);
3139 	sc->sc_flags &= ~(GUS_DMAOUT_ACTIVE|GUS_LOCKED);
3140 	sc->sc_dmaoutintr = 0;
3141 	sc->sc_outarg = 0;
3142 	sc->sc_dmaoutaddr = 0;
3143 	sc->sc_dmaoutcnt = 0;
3144 	sc->sc_dmabuf = 0;
3145 	sc->sc_bufcnt = 0;
3146 	sc->sc_playbuf = -1;
3147 	/* also stop playing */
3148 	gus_stop_voice(sc, GUS_VOICE_LEFT, 1);
3149 	gus_stop_voice(sc, GUS_VOICE_RIGHT, 0);
3150 
3151 	return 0;
3152 }
3153 
3154 /*
3155  * Stop any DMA output.  Called at splgus().
3156  */
3157 int
3158 gus_halt_in_dma(addr)
3159 	void * addr;
3160 {
3161  	struct gus_softc *sc = addr;
3162  	bus_space_tag_t iot = sc->sc_iot;
3163  	bus_space_handle_t ioh2 = sc->sc_ioh2;
3164 	DMAPRINTF(("gus_halt_in_dma called\n"));
3165 
3166 	/*
3167 	 * Make sure the GUS _isn't_ setup for DMA
3168 	 */
3169 
3170   	SELECT_GUS_REG(iot, ioh2, GUSREG_SAMPLE_CONTROL);
3171  	bus_space_write_1(iot, ioh2, GUS_DATA_HIGH,
3172  	     bus_space_read_1(iot, ioh2, GUS_DATA_HIGH) & ~(GUSMASK_SAMPLE_START|GUSMASK_SAMPLE_IRQ));
3173 
3174  	isa_dmaabort(sc->sc_ic, sc->sc_recdrq);
3175 	sc->sc_flags &= ~GUS_DMAIN_ACTIVE;
3176 	sc->sc_dmainintr = 0;
3177 	sc->sc_inarg = 0;
3178 	sc->sc_dmainaddr = 0;
3179 	sc->sc_dmaincnt = 0;
3180 
3181 	return 0;
3182 }
3183 
3184 
3185 static ad1848_devmap_t gusmapping[] = {
3186 	{ GUSMAX_DAC_LVL, AD1848_KIND_LVL, AD1848_AUX1_CHANNEL },
3187 	{ GUSMAX_LINE_IN_LVL, AD1848_KIND_LVL, AD1848_LINE_CHANNEL },
3188 	{ GUSMAX_MONO_LVL, AD1848_KIND_LVL, AD1848_MONO_CHANNEL },
3189 	{ GUSMAX_CD_LVL, AD1848_KIND_LVL, AD1848_AUX2_CHANNEL },
3190 	{ GUSMAX_MONITOR_LVL, AD1848_KIND_LVL, AD1848_MONITOR_CHANNEL },
3191 	{ GUSMAX_OUT_LVL, AD1848_KIND_LVL, AD1848_DAC_CHANNEL },
3192 	{ GUSMAX_DAC_MUTE, AD1848_KIND_MUTE, AD1848_AUX1_CHANNEL },
3193 	{ GUSMAX_LINE_IN_MUTE, AD1848_KIND_MUTE, AD1848_LINE_CHANNEL },
3194 	{ GUSMAX_MONO_MUTE, AD1848_KIND_MUTE, AD1848_MONO_CHANNEL },
3195 	{ GUSMAX_CD_MUTE, AD1848_KIND_MUTE, AD1848_AUX2_CHANNEL },
3196 	{ GUSMAX_MONITOR_MUTE, AD1848_KIND_MUTE, AD1848_MONITOR_CHANNEL },
3197 	{ GUSMAX_REC_LVL, AD1848_KIND_RECORDGAIN, -1 },
3198 	{ GUSMAX_RECORD_SOURCE, AD1848_KIND_RECORDSOURCE, -1 }
3199 };
3200 
3201 static int nummap = sizeof(gusmapping) / sizeof(gusmapping[0]);
3202 
3203 STATIC int
3204 gusmax_mixer_get_port(addr, cp)
3205 	void *addr;
3206 	mixer_ctrl_t *cp;
3207 {
3208 	struct ad1848_isa_softc *ac = addr;
3209 	struct gus_softc *sc = ac->sc_ad1848.parent;
3210 	struct ad1848_volume vol;
3211 	int error = ad1848_mixer_get_port(&ac->sc_ad1848, gusmapping,
3212 					  nummap, cp);
3213 
3214 	if (error != ENXIO)
3215 	  return (error);
3216 
3217 	error = EINVAL;
3218 
3219 	switch (cp->dev) {
3220 	case GUSMAX_SPEAKER_LVL:	/* fake speaker for mute naming */
3221 		if (cp->type == AUDIO_MIXER_VALUE) {
3222 			if (sc->sc_mixcontrol & GUSMASK_LINE_OUT)
3223 				vol.left = vol.right = AUDIO_MAX_GAIN;
3224 			else
3225 				vol.left = vol.right = AUDIO_MIN_GAIN;
3226 			error = 0;
3227 			ad1848_from_vol(cp, &vol);
3228 		}
3229 		break;
3230 
3231 	case GUSMAX_SPEAKER_MUTE:
3232 		if (cp->type == AUDIO_MIXER_ENUM) {
3233 			cp->un.ord = sc->sc_mixcontrol & GUSMASK_LINE_OUT ? 1 : 0;
3234 			error = 0;
3235 		}
3236 		break;
3237 	default:
3238 		error = ENXIO;
3239 		break;
3240 	}
3241 
3242 	return(error);
3243 }
3244 
3245 STATIC int
3246 gus_mixer_get_port(addr, cp)
3247 	void *addr;
3248 	mixer_ctrl_t *cp;
3249 {
3250 	struct gus_softc *sc = addr;
3251 	struct ics2101_softc *ic = &sc->sc_mixer;
3252 	struct ad1848_volume vol;
3253 	int error = EINVAL;
3254 
3255 	DPRINTF(("gus_mixer_get_port: dev=%d type=%d\n", cp->dev, cp->type));
3256 
3257 	if (!HAS_MIXER(sc) && cp->dev > GUSICS_MASTER_MUTE)
3258 		return ENXIO;
3259 
3260 	switch (cp->dev) {
3261 
3262 	case GUSICS_MIC_IN_MUTE:	/* Microphone */
3263 		if (cp->type == AUDIO_MIXER_ENUM) {
3264 			if (HAS_MIXER(sc))
3265 				cp->un.ord = ic->sc_mute[GUSMIX_CHAN_MIC][ICSMIX_LEFT];
3266 			else
3267 				cp->un.ord =
3268 				    sc->sc_mixcontrol & GUSMASK_MIC_IN ? 0 : 1;
3269 			error = 0;
3270 		}
3271 		break;
3272 
3273 	case GUSICS_LINE_IN_MUTE:
3274 		if (cp->type == AUDIO_MIXER_ENUM) {
3275 			if (HAS_MIXER(sc))
3276 				cp->un.ord = ic->sc_mute[GUSMIX_CHAN_LINE][ICSMIX_LEFT];
3277 			else
3278 				cp->un.ord =
3279 				    sc->sc_mixcontrol & GUSMASK_LINE_IN ? 1 : 0;
3280 			error = 0;
3281 		}
3282 		break;
3283 
3284 	case GUSICS_MASTER_MUTE:
3285 		if (cp->type == AUDIO_MIXER_ENUM) {
3286 			if (HAS_MIXER(sc))
3287 				cp->un.ord = ic->sc_mute[GUSMIX_CHAN_MASTER][ICSMIX_LEFT];
3288 			else
3289 				cp->un.ord =
3290 				    sc->sc_mixcontrol & GUSMASK_LINE_OUT ? 1 : 0;
3291 			error = 0;
3292 		}
3293 		break;
3294 
3295 	case GUSICS_DAC_MUTE:
3296 		if (cp->type == AUDIO_MIXER_ENUM) {
3297 			cp->un.ord = ic->sc_mute[GUSMIX_CHAN_DAC][ICSMIX_LEFT];
3298 			error = 0;
3299 		}
3300 		break;
3301 
3302 	case GUSICS_CD_MUTE:
3303 		if (cp->type == AUDIO_MIXER_ENUM) {
3304 			cp->un.ord = ic->sc_mute[GUSMIX_CHAN_CD][ICSMIX_LEFT];
3305 			error = 0;
3306 		}
3307 		break;
3308 
3309 	case GUSICS_MASTER_LVL:
3310 		if (cp->type == AUDIO_MIXER_VALUE) {
3311 			vol.left = ic->sc_setting[GUSMIX_CHAN_MASTER][ICSMIX_LEFT];
3312 			vol.right = ic->sc_setting[GUSMIX_CHAN_MASTER][ICSMIX_RIGHT];
3313 			if (ad1848_from_vol(cp, &vol))
3314 				error = 0;
3315 		}
3316 		break;
3317 
3318 	case GUSICS_MIC_IN_LVL:	/* Microphone */
3319 		if (cp->type == AUDIO_MIXER_VALUE) {
3320 			vol.left = ic->sc_setting[GUSMIX_CHAN_MIC][ICSMIX_LEFT];
3321 			vol.right = ic->sc_setting[GUSMIX_CHAN_MIC][ICSMIX_RIGHT];
3322 			if (ad1848_from_vol(cp, &vol))
3323 				error = 0;
3324 		}
3325 		break;
3326 
3327 	case GUSICS_LINE_IN_LVL:	/* line in */
3328 		if (cp->type == AUDIO_MIXER_VALUE) {
3329 			vol.left = ic->sc_setting[GUSMIX_CHAN_LINE][ICSMIX_LEFT];
3330 			vol.right = ic->sc_setting[GUSMIX_CHAN_LINE][ICSMIX_RIGHT];
3331 			if (ad1848_from_vol(cp, &vol))
3332 				error = 0;
3333 		}
3334 		break;
3335 
3336 
3337 	case GUSICS_CD_LVL:
3338 		if (cp->type == AUDIO_MIXER_VALUE) {
3339 			vol.left = ic->sc_setting[GUSMIX_CHAN_CD][ICSMIX_LEFT];
3340 			vol.right = ic->sc_setting[GUSMIX_CHAN_CD][ICSMIX_RIGHT];
3341 			if (ad1848_from_vol(cp, &vol))
3342 				error = 0;
3343 		}
3344 		break;
3345 
3346 	case GUSICS_DAC_LVL:		/* dac out */
3347 		if (cp->type == AUDIO_MIXER_VALUE) {
3348 			vol.left = ic->sc_setting[GUSMIX_CHAN_DAC][ICSMIX_LEFT];
3349 			vol.right = ic->sc_setting[GUSMIX_CHAN_DAC][ICSMIX_RIGHT];
3350 			if (ad1848_from_vol(cp, &vol))
3351 				error = 0;
3352 		}
3353 		break;
3354 
3355 
3356 	case GUSICS_RECORD_SOURCE:
3357 		if (cp->type == AUDIO_MIXER_ENUM) {
3358 			/* Can't set anything else useful, sigh. */
3359 			 cp->un.ord = 0;
3360 		}
3361 		break;
3362 
3363 	default:
3364 		return ENXIO;
3365 	    /*NOTREACHED*/
3366 	}
3367 	return error;
3368 }
3369 
3370 STATIC void
3371 gusics_master_mute(ic, mute)
3372 	struct ics2101_softc *ic;
3373 	int mute;
3374 {
3375 	ics2101_mix_mute(ic, GUSMIX_CHAN_MASTER, ICSMIX_LEFT, mute);
3376 	ics2101_mix_mute(ic, GUSMIX_CHAN_MASTER, ICSMIX_RIGHT, mute);
3377 }
3378 
3379 STATIC void
3380 gusics_mic_mute(ic, mute)
3381 	struct ics2101_softc *ic;
3382 	int mute;
3383 {
3384 	ics2101_mix_mute(ic, GUSMIX_CHAN_MIC, ICSMIX_LEFT, mute);
3385 	ics2101_mix_mute(ic, GUSMIX_CHAN_MIC, ICSMIX_RIGHT, mute);
3386 }
3387 
3388 STATIC void
3389 gusics_linein_mute(ic, mute)
3390 	struct ics2101_softc *ic;
3391 	int mute;
3392 {
3393 	ics2101_mix_mute(ic, GUSMIX_CHAN_LINE, ICSMIX_LEFT, mute);
3394 	ics2101_mix_mute(ic, GUSMIX_CHAN_LINE, ICSMIX_RIGHT, mute);
3395 }
3396 
3397 STATIC void
3398 gusics_cd_mute(ic, mute)
3399 	struct ics2101_softc *ic;
3400 	int mute;
3401 {
3402 	ics2101_mix_mute(ic, GUSMIX_CHAN_CD, ICSMIX_LEFT, mute);
3403 	ics2101_mix_mute(ic, GUSMIX_CHAN_CD, ICSMIX_RIGHT, mute);
3404 }
3405 
3406 STATIC void
3407 gusics_dac_mute(ic, mute)
3408 	struct ics2101_softc *ic;
3409 	int mute;
3410 {
3411 	ics2101_mix_mute(ic, GUSMIX_CHAN_DAC, ICSMIX_LEFT, mute);
3412 	ics2101_mix_mute(ic, GUSMIX_CHAN_DAC, ICSMIX_RIGHT, mute);
3413 }
3414 
3415 STATIC int
3416 gusmax_mixer_set_port(addr, cp)
3417 	void *addr;
3418 	mixer_ctrl_t *cp;
3419 {
3420 	struct ad1848_isa_softc *ac = addr;
3421 	struct gus_softc *sc = ac->sc_ad1848.parent;
3422 	struct ad1848_volume vol;
3423 	int error = ad1848_mixer_set_port(&ac->sc_ad1848, gusmapping,
3424 					  nummap, cp);
3425 
3426 	if (error != ENXIO)
3427 	  return (error);
3428 
3429 	DPRINTF(("gusmax_mixer_set_port: dev=%d type=%d\n", cp->dev, cp->type));
3430 
3431 	switch (cp->dev) {
3432 	case GUSMAX_SPEAKER_LVL:
3433 		if (cp->type == AUDIO_MIXER_VALUE &&
3434 		    cp->un.value.num_channels == 1) {
3435 			if (ad1848_to_vol(cp, &vol)) {
3436 				gus_speaker_ctl(sc, vol.left > AUDIO_MIN_GAIN ?
3437 						SPKR_ON : SPKR_OFF);
3438 				error = 0;
3439 			}
3440 		}
3441 		break;
3442 
3443 	case GUSMAX_SPEAKER_MUTE:
3444 		if (cp->type == AUDIO_MIXER_ENUM) {
3445 			gus_speaker_ctl(sc, cp->un.ord ? SPKR_OFF : SPKR_ON);
3446 			error = 0;
3447 		}
3448 		break;
3449 
3450 	default:
3451 		return ENXIO;
3452 	    /*NOTREACHED*/
3453     }
3454     return error;
3455 }
3456 
3457 STATIC int
3458 gus_mixer_set_port(addr, cp)
3459 	void *addr;
3460 	mixer_ctrl_t *cp;
3461 {
3462 	struct gus_softc *sc = addr;
3463 	struct ics2101_softc *ic = &sc->sc_mixer;
3464 	struct ad1848_volume vol;
3465 	int error = EINVAL;
3466 
3467 	DPRINTF(("gus_mixer_set_port: dev=%d type=%d\n", cp->dev, cp->type));
3468 
3469 	if (!HAS_MIXER(sc) && cp->dev > GUSICS_MASTER_MUTE)
3470 		return ENXIO;
3471 
3472 	switch (cp->dev) {
3473 
3474 	case GUSICS_MIC_IN_MUTE:	/* Microphone */
3475 		if (cp->type == AUDIO_MIXER_ENUM) {
3476 			DPRINTF(("mic mute %d\n", cp->un.ord));
3477 			if (HAS_MIXER(sc)) {
3478 				gusics_mic_mute(ic, cp->un.ord);
3479 			}
3480 			gus_mic_ctl(sc, cp->un.ord ? SPKR_OFF : SPKR_ON);
3481 			error = 0;
3482 		}
3483 		break;
3484 
3485 	case GUSICS_LINE_IN_MUTE:
3486 		if (cp->type == AUDIO_MIXER_ENUM) {
3487 			DPRINTF(("linein mute %d\n", cp->un.ord));
3488 			if (HAS_MIXER(sc)) {
3489 				gusics_linein_mute(ic, cp->un.ord);
3490 			}
3491 			gus_linein_ctl(sc, cp->un.ord ? SPKR_OFF : SPKR_ON);
3492 			error = 0;
3493 		}
3494 		break;
3495 
3496 	case GUSICS_MASTER_MUTE:
3497 		if (cp->type == AUDIO_MIXER_ENUM) {
3498 			DPRINTF(("master mute %d\n", cp->un.ord));
3499 			if (HAS_MIXER(sc)) {
3500 				gusics_master_mute(ic, cp->un.ord);
3501 			}
3502 			gus_speaker_ctl(sc, cp->un.ord ? SPKR_OFF : SPKR_ON);
3503 			error = 0;
3504 		}
3505 		break;
3506 
3507 	case GUSICS_DAC_MUTE:
3508 		if (cp->type == AUDIO_MIXER_ENUM) {
3509 			gusics_dac_mute(ic, cp->un.ord);
3510 			error = 0;
3511 		}
3512 		break;
3513 
3514 	case GUSICS_CD_MUTE:
3515 		if (cp->type == AUDIO_MIXER_ENUM) {
3516 			gusics_cd_mute(ic, cp->un.ord);
3517 			error = 0;
3518 		}
3519 		break;
3520 
3521 	case GUSICS_MASTER_LVL:
3522 		if (cp->type == AUDIO_MIXER_VALUE) {
3523 			if (ad1848_to_vol(cp, &vol)) {
3524 				ics2101_mix_attenuate(ic,
3525 						      GUSMIX_CHAN_MASTER,
3526 						      ICSMIX_LEFT,
3527 						      vol.left);
3528 				ics2101_mix_attenuate(ic,
3529 						      GUSMIX_CHAN_MASTER,
3530 						      ICSMIX_RIGHT,
3531 						      vol.right);
3532 				error = 0;
3533 			}
3534 		}
3535 		break;
3536 
3537 	case GUSICS_MIC_IN_LVL:	/* Microphone */
3538 		if (cp->type == AUDIO_MIXER_VALUE) {
3539 			if (ad1848_to_vol(cp, &vol)) {
3540 				ics2101_mix_attenuate(ic,
3541 						      GUSMIX_CHAN_MIC,
3542 						      ICSMIX_LEFT,
3543 						      vol.left);
3544 				ics2101_mix_attenuate(ic,
3545 						      GUSMIX_CHAN_MIC,
3546 						      ICSMIX_RIGHT,
3547 						      vol.right);
3548 				error = 0;
3549 			}
3550 		}
3551 		break;
3552 
3553 	case GUSICS_LINE_IN_LVL:	/* line in */
3554 		if (cp->type == AUDIO_MIXER_VALUE) {
3555 			if (ad1848_to_vol(cp, &vol)) {
3556 				ics2101_mix_attenuate(ic,
3557 						      GUSMIX_CHAN_LINE,
3558 						      ICSMIX_LEFT,
3559 						      vol.left);
3560 				ics2101_mix_attenuate(ic,
3561 						      GUSMIX_CHAN_LINE,
3562 						      ICSMIX_RIGHT,
3563 						      vol.right);
3564 				error = 0;
3565 			}
3566 		}
3567 		break;
3568 
3569 
3570 	case GUSICS_CD_LVL:
3571 		if (cp->type == AUDIO_MIXER_VALUE) {
3572 			if (ad1848_to_vol(cp, &vol)) {
3573 				ics2101_mix_attenuate(ic,
3574 						      GUSMIX_CHAN_CD,
3575 						      ICSMIX_LEFT,
3576 						      vol.left);
3577 				ics2101_mix_attenuate(ic,
3578 						      GUSMIX_CHAN_CD,
3579 						      ICSMIX_RIGHT,
3580 						      vol.right);
3581 				error = 0;
3582 			}
3583 		}
3584 		break;
3585 
3586 	case GUSICS_DAC_LVL:		/* dac out */
3587 		if (cp->type == AUDIO_MIXER_VALUE) {
3588 			if (ad1848_to_vol(cp, &vol)) {
3589 				ics2101_mix_attenuate(ic,
3590 						      GUSMIX_CHAN_DAC,
3591 						      ICSMIX_LEFT,
3592 						      vol.left);
3593 				ics2101_mix_attenuate(ic,
3594 						      GUSMIX_CHAN_DAC,
3595 						      ICSMIX_RIGHT,
3596 						      vol.right);
3597 				error = 0;
3598 			}
3599 		}
3600 		break;
3601 
3602 
3603 	case GUSICS_RECORD_SOURCE:
3604 		if (cp->type == AUDIO_MIXER_ENUM && cp->un.ord == 0) {
3605 			/* Can't set anything else useful, sigh. */
3606 			error = 0;
3607 		}
3608 		break;
3609 
3610 	default:
3611 		return ENXIO;
3612 	    /*NOTREACHED*/
3613 	}
3614 	return error;
3615 }
3616 
3617 STATIC int
3618 gus_get_props(addr)
3619 	void *addr;
3620 {
3621 	struct gus_softc *sc = addr;
3622 	return (AUDIO_PROP_MMAP |
3623 	    (sc->sc_recdrq == sc->sc_playdrq ? 0 : AUDIO_PROP_FULLDUPLEX));
3624 }
3625 
3626 STATIC int
3627 gusmax_get_props(addr)
3628 	void *addr;
3629 {
3630 	struct ad1848_isa_softc *ac = addr;
3631 	return gus_get_props(ac->sc_ad1848.parent);
3632 }
3633 
3634 STATIC int
3635 gusmax_mixer_query_devinfo(addr, dip)
3636 	void *addr;
3637 	mixer_devinfo_t *dip;
3638 {
3639 	DPRINTF(("gusmax_query_devinfo: index=%d\n", dip->index));
3640 
3641 	switch(dip->index) {
3642 #if 0
3643     case GUSMAX_MIC_IN_LVL:	/* Microphone */
3644 	dip->type = AUDIO_MIXER_VALUE;
3645 	dip->mixer_class = GUSMAX_INPUT_CLASS;
3646 	dip->prev = AUDIO_MIXER_LAST;
3647 	dip->next = GUSMAX_MIC_IN_MUTE;
3648 	strcpy(dip->label.name, AudioNmicrophone);
3649 	dip->un.v.num_channels = 2;
3650 	strcpy(dip->un.v.units.name, AudioNvolume);
3651 	break;
3652 #endif
3653 
3654     case GUSMAX_MONO_LVL:	/* mono/microphone mixer */
3655 	dip->type = AUDIO_MIXER_VALUE;
3656 	dip->mixer_class = GUSMAX_INPUT_CLASS;
3657 	dip->prev = AUDIO_MIXER_LAST;
3658 	dip->next = GUSMAX_MONO_MUTE;
3659 	strcpy(dip->label.name, AudioNmicrophone);
3660 	dip->un.v.num_channels = 1;
3661 	strcpy(dip->un.v.units.name, AudioNvolume);
3662 	break;
3663 
3664     case GUSMAX_DAC_LVL:		/*  dacout */
3665 	dip->type = AUDIO_MIXER_VALUE;
3666 	dip->mixer_class = GUSMAX_INPUT_CLASS;
3667 	dip->prev = AUDIO_MIXER_LAST;
3668 	dip->next = GUSMAX_DAC_MUTE;
3669 	strcpy(dip->label.name, AudioNdac);
3670 	dip->un.v.num_channels = 2;
3671 	strcpy(dip->un.v.units.name, AudioNvolume);
3672 	break;
3673 
3674     case GUSMAX_LINE_IN_LVL:	/* line */
3675 	dip->type = AUDIO_MIXER_VALUE;
3676 	dip->mixer_class = GUSMAX_INPUT_CLASS;
3677 	dip->prev = AUDIO_MIXER_LAST;
3678 	dip->next = GUSMAX_LINE_IN_MUTE;
3679 	strcpy(dip->label.name, AudioNline);
3680 	dip->un.v.num_channels = 2;
3681 	strcpy(dip->un.v.units.name, AudioNvolume);
3682 	break;
3683 
3684     case GUSMAX_CD_LVL:		/* cd */
3685 	dip->type = AUDIO_MIXER_VALUE;
3686 	dip->mixer_class = GUSMAX_INPUT_CLASS;
3687 	dip->prev = AUDIO_MIXER_LAST;
3688 	dip->next = GUSMAX_CD_MUTE;
3689 	strcpy(dip->label.name, AudioNcd);
3690 	dip->un.v.num_channels = 2;
3691 	strcpy(dip->un.v.units.name, AudioNvolume);
3692 	break;
3693 
3694 
3695     case GUSMAX_MONITOR_LVL:	/* monitor level */
3696 	dip->type = AUDIO_MIXER_VALUE;
3697 	dip->mixer_class = GUSMAX_MONITOR_CLASS;
3698 	dip->next = GUSMAX_MONITOR_MUTE;
3699 	dip->prev = AUDIO_MIXER_LAST;
3700 	strcpy(dip->label.name, AudioNmonitor);
3701 	dip->un.v.num_channels = 1;
3702 	strcpy(dip->un.v.units.name, AudioNvolume);
3703 	break;
3704 
3705     case GUSMAX_OUT_LVL:		/* cs4231 output volume: not useful? */
3706 	dip->type = AUDIO_MIXER_VALUE;
3707 	dip->mixer_class = GUSMAX_MONITOR_CLASS;
3708 	dip->prev = dip->next = AUDIO_MIXER_LAST;
3709 	strcpy(dip->label.name, AudioNoutput);
3710 	dip->un.v.num_channels = 2;
3711 	strcpy(dip->un.v.units.name, AudioNvolume);
3712 	break;
3713 
3714     case GUSMAX_SPEAKER_LVL:		/* fake speaker volume */
3715 	dip->type = AUDIO_MIXER_VALUE;
3716 	dip->mixer_class = GUSMAX_MONITOR_CLASS;
3717 	dip->prev = AUDIO_MIXER_LAST;
3718 	dip->next = GUSMAX_SPEAKER_MUTE;
3719 	strcpy(dip->label.name, AudioNmaster);
3720 	dip->un.v.num_channels = 2;
3721 	strcpy(dip->un.v.units.name, AudioNvolume);
3722 	break;
3723 
3724     case GUSMAX_LINE_IN_MUTE:
3725 	dip->mixer_class = GUSMAX_INPUT_CLASS;
3726 	dip->type = AUDIO_MIXER_ENUM;
3727 	dip->prev = GUSMAX_LINE_IN_LVL;
3728 	dip->next = AUDIO_MIXER_LAST;
3729 	goto mute;
3730 
3731     case GUSMAX_DAC_MUTE:
3732 	dip->mixer_class = GUSMAX_INPUT_CLASS;
3733 	dip->type = AUDIO_MIXER_ENUM;
3734 	dip->prev = GUSMAX_DAC_LVL;
3735 	dip->next = AUDIO_MIXER_LAST;
3736 	goto mute;
3737 
3738     case GUSMAX_CD_MUTE:
3739 	dip->mixer_class = GUSMAX_INPUT_CLASS;
3740 	dip->type = AUDIO_MIXER_ENUM;
3741 	dip->prev = GUSMAX_CD_LVL;
3742 	dip->next = AUDIO_MIXER_LAST;
3743 	goto mute;
3744 
3745     case GUSMAX_MONO_MUTE:
3746 	dip->mixer_class = GUSMAX_INPUT_CLASS;
3747 	dip->type = AUDIO_MIXER_ENUM;
3748 	dip->prev = GUSMAX_MONO_LVL;
3749 	dip->next = AUDIO_MIXER_LAST;
3750 	goto mute;
3751 
3752     case GUSMAX_MONITOR_MUTE:
3753 	dip->mixer_class = GUSMAX_OUTPUT_CLASS;
3754 	dip->type = AUDIO_MIXER_ENUM;
3755 	dip->prev = GUSMAX_MONITOR_LVL;
3756 	dip->next = AUDIO_MIXER_LAST;
3757 	goto mute;
3758 
3759     case GUSMAX_SPEAKER_MUTE:
3760 	dip->mixer_class = GUSMAX_OUTPUT_CLASS;
3761 	dip->type = AUDIO_MIXER_ENUM;
3762 	dip->prev = GUSMAX_SPEAKER_LVL;
3763 	dip->next = AUDIO_MIXER_LAST;
3764     mute:
3765 	strcpy(dip->label.name, AudioNmute);
3766 	dip->un.e.num_mem = 2;
3767 	strcpy(dip->un.e.member[0].label.name, AudioNoff);
3768 	dip->un.e.member[0].ord = 0;
3769 	strcpy(dip->un.e.member[1].label.name, AudioNon);
3770 	dip->un.e.member[1].ord = 1;
3771 	break;
3772 
3773     case GUSMAX_REC_LVL:	/* record level */
3774 	dip->type = AUDIO_MIXER_VALUE;
3775 	dip->mixer_class = GUSMAX_RECORD_CLASS;
3776 	dip->prev = AUDIO_MIXER_LAST;
3777 	dip->next = GUSMAX_RECORD_SOURCE;
3778 	strcpy(dip->label.name, AudioNrecord);
3779 	dip->un.v.num_channels = 2;
3780 	strcpy(dip->un.v.units.name, AudioNvolume);
3781 	break;
3782 
3783     case GUSMAX_RECORD_SOURCE:
3784 	dip->mixer_class = GUSMAX_RECORD_CLASS;
3785 	dip->type = AUDIO_MIXER_ENUM;
3786 	dip->prev = GUSMAX_REC_LVL;
3787 	dip->next = AUDIO_MIXER_LAST;
3788 	strcpy(dip->label.name, AudioNsource);
3789 	dip->un.e.num_mem = 4;
3790 	strcpy(dip->un.e.member[0].label.name, AudioNoutput);
3791 	dip->un.e.member[0].ord = DAC_IN_PORT;
3792 	strcpy(dip->un.e.member[1].label.name, AudioNmicrophone);
3793 	dip->un.e.member[1].ord = MIC_IN_PORT;
3794 	strcpy(dip->un.e.member[2].label.name, AudioNdac);
3795 	dip->un.e.member[2].ord = AUX1_IN_PORT;
3796 	strcpy(dip->un.e.member[3].label.name, AudioNline);
3797 	dip->un.e.member[3].ord = LINE_IN_PORT;
3798 	break;
3799 
3800     case GUSMAX_INPUT_CLASS:			/* input class descriptor */
3801 	dip->type = AUDIO_MIXER_CLASS;
3802 	dip->mixer_class = GUSMAX_INPUT_CLASS;
3803 	dip->next = dip->prev = AUDIO_MIXER_LAST;
3804 	strcpy(dip->label.name, AudioCinputs);
3805 	break;
3806 
3807     case GUSMAX_OUTPUT_CLASS:			/* output class descriptor */
3808 	dip->type = AUDIO_MIXER_CLASS;
3809 	dip->mixer_class = GUSMAX_OUTPUT_CLASS;
3810 	dip->next = dip->prev = AUDIO_MIXER_LAST;
3811 	strcpy(dip->label.name, AudioCoutputs);
3812 	break;
3813 
3814     case GUSMAX_MONITOR_CLASS:			/* monitor class descriptor */
3815 	dip->type = AUDIO_MIXER_CLASS;
3816 	dip->mixer_class = GUSMAX_MONITOR_CLASS;
3817 	dip->next = dip->prev = AUDIO_MIXER_LAST;
3818 	strcpy(dip->label.name, AudioCmonitor);
3819 	break;
3820 
3821     case GUSMAX_RECORD_CLASS:			/* record source class */
3822 	dip->type = AUDIO_MIXER_CLASS;
3823 	dip->mixer_class = GUSMAX_RECORD_CLASS;
3824 	dip->next = dip->prev = AUDIO_MIXER_LAST;
3825 	strcpy(dip->label.name, AudioCrecord);
3826 	break;
3827 
3828     default:
3829 	return ENXIO;
3830 	/*NOTREACHED*/
3831     }
3832     DPRINTF(("AUDIO_MIXER_DEVINFO: name=%s\n", dip->label.name));
3833 	return 0;
3834 }
3835 
3836 STATIC int
3837 gus_mixer_query_devinfo(addr, dip)
3838 	void *addr;
3839 	mixer_devinfo_t *dip;
3840 {
3841 	struct gus_softc *sc = addr;
3842 
3843 	DPRINTF(("gusmax_query_devinfo: index=%d\n", dip->index));
3844 
3845 	if (!HAS_MIXER(sc) && dip->index > GUSICS_MASTER_MUTE)
3846 		return ENXIO;
3847 
3848 	switch(dip->index) {
3849 
3850 	case GUSICS_MIC_IN_LVL:	/* Microphone */
3851 		dip->type = AUDIO_MIXER_VALUE;
3852 		dip->mixer_class = GUSICS_INPUT_CLASS;
3853 		dip->prev = AUDIO_MIXER_LAST;
3854 		dip->next = GUSICS_MIC_IN_MUTE;
3855 		strcpy(dip->label.name, AudioNmicrophone);
3856 		dip->un.v.num_channels = 2;
3857 		strcpy(dip->un.v.units.name, AudioNvolume);
3858 		break;
3859 
3860 	case GUSICS_LINE_IN_LVL:	/* line */
3861 		dip->type = AUDIO_MIXER_VALUE;
3862 		dip->mixer_class = GUSICS_INPUT_CLASS;
3863 		dip->prev = AUDIO_MIXER_LAST;
3864 		dip->next = GUSICS_LINE_IN_MUTE;
3865 		strcpy(dip->label.name, AudioNline);
3866 		dip->un.v.num_channels = 2;
3867 		strcpy(dip->un.v.units.name, AudioNvolume);
3868 		break;
3869 
3870 	case GUSICS_CD_LVL:		/* cd */
3871 		dip->type = AUDIO_MIXER_VALUE;
3872 		dip->mixer_class = GUSICS_INPUT_CLASS;
3873 		dip->prev = AUDIO_MIXER_LAST;
3874 		dip->next = GUSICS_CD_MUTE;
3875 		strcpy(dip->label.name, AudioNcd);
3876 		dip->un.v.num_channels = 2;
3877 		strcpy(dip->un.v.units.name, AudioNvolume);
3878 		break;
3879 
3880 	case GUSICS_DAC_LVL:		/*  dacout */
3881 		dip->type = AUDIO_MIXER_VALUE;
3882 		dip->mixer_class = GUSICS_INPUT_CLASS;
3883 		dip->prev = AUDIO_MIXER_LAST;
3884 		dip->next = GUSICS_DAC_MUTE;
3885 		strcpy(dip->label.name, AudioNdac);
3886 		dip->un.v.num_channels = 2;
3887 		strcpy(dip->un.v.units.name, AudioNvolume);
3888 		break;
3889 
3890 	case GUSICS_MASTER_LVL:		/*  master output */
3891 		dip->type = AUDIO_MIXER_VALUE;
3892 		dip->mixer_class = GUSICS_OUTPUT_CLASS;
3893 		dip->prev = AUDIO_MIXER_LAST;
3894 		dip->next = GUSICS_MASTER_MUTE;
3895 		strcpy(dip->label.name, AudioNmaster);
3896 		dip->un.v.num_channels = 2;
3897 		strcpy(dip->un.v.units.name, AudioNvolume);
3898 		break;
3899 
3900 
3901 	case GUSICS_LINE_IN_MUTE:
3902 		dip->mixer_class = GUSICS_INPUT_CLASS;
3903 		dip->type = AUDIO_MIXER_ENUM;
3904 		dip->prev = GUSICS_LINE_IN_LVL;
3905 		dip->next = AUDIO_MIXER_LAST;
3906 		goto mute;
3907 
3908 	case GUSICS_DAC_MUTE:
3909 		dip->mixer_class = GUSICS_INPUT_CLASS;
3910 		dip->type = AUDIO_MIXER_ENUM;
3911 		dip->prev = GUSICS_DAC_LVL;
3912 		dip->next = AUDIO_MIXER_LAST;
3913 		goto mute;
3914 
3915 	case GUSICS_CD_MUTE:
3916 		dip->mixer_class = GUSICS_INPUT_CLASS;
3917 		dip->type = AUDIO_MIXER_ENUM;
3918 		dip->prev = GUSICS_CD_LVL;
3919 		dip->next = AUDIO_MIXER_LAST;
3920 		goto mute;
3921 
3922 	case GUSICS_MIC_IN_MUTE:
3923 		dip->mixer_class = GUSICS_INPUT_CLASS;
3924 		dip->type = AUDIO_MIXER_ENUM;
3925 		dip->prev = GUSICS_MIC_IN_LVL;
3926 		dip->next = AUDIO_MIXER_LAST;
3927 		goto mute;
3928 
3929 	case GUSICS_MASTER_MUTE:
3930 		dip->mixer_class = GUSICS_OUTPUT_CLASS;
3931 		dip->type = AUDIO_MIXER_ENUM;
3932 		dip->prev = GUSICS_MASTER_LVL;
3933 		dip->next = AUDIO_MIXER_LAST;
3934 mute:
3935 		strcpy(dip->label.name, AudioNmute);
3936 		dip->un.e.num_mem = 2;
3937 		strcpy(dip->un.e.member[0].label.name, AudioNoff);
3938 		dip->un.e.member[0].ord = 0;
3939 		strcpy(dip->un.e.member[1].label.name, AudioNon);
3940 		dip->un.e.member[1].ord = 1;
3941 		break;
3942 
3943 	case GUSICS_RECORD_SOURCE:
3944 		dip->mixer_class = GUSICS_RECORD_CLASS;
3945 		dip->type = AUDIO_MIXER_ENUM;
3946 		dip->prev = dip->next = AUDIO_MIXER_LAST;
3947 		strcpy(dip->label.name, AudioNsource);
3948 		dip->un.e.num_mem = 1;
3949 		strcpy(dip->un.e.member[0].label.name, AudioNoutput);
3950 		dip->un.e.member[0].ord = GUSICS_MASTER_LVL;
3951 		break;
3952 
3953 	case GUSICS_INPUT_CLASS:
3954 		dip->type = AUDIO_MIXER_CLASS;
3955 		dip->mixer_class = GUSICS_INPUT_CLASS;
3956 		dip->next = dip->prev = AUDIO_MIXER_LAST;
3957 		strcpy(dip->label.name, AudioCinputs);
3958 		break;
3959 
3960 	case GUSICS_OUTPUT_CLASS:
3961 		dip->type = AUDIO_MIXER_CLASS;
3962 		dip->mixer_class = GUSICS_OUTPUT_CLASS;
3963 		dip->next = dip->prev = AUDIO_MIXER_LAST;
3964 		strcpy(dip->label.name, AudioCoutputs);
3965 		break;
3966 
3967 	case GUSICS_RECORD_CLASS:
3968 		dip->type = AUDIO_MIXER_CLASS;
3969 		dip->mixer_class = GUSICS_RECORD_CLASS;
3970 		dip->next = dip->prev = AUDIO_MIXER_LAST;
3971 		strcpy(dip->label.name, AudioCrecord);
3972 		break;
3973 
3974 	default:
3975 		return ENXIO;
3976 	/*NOTREACHED*/
3977 	}
3978 	DPRINTF(("AUDIO_MIXER_DEVINFO: name=%s\n", dip->label.name));
3979 	return 0;
3980 }
3981 
3982 STATIC int
3983 gus_query_encoding(addr, fp)
3984 	void *addr;
3985 	struct audio_encoding *fp;
3986 {
3987 	switch (fp->index) {
3988 	case 0:
3989 		strcpy(fp->name, AudioEmulaw);
3990 		fp->encoding = AUDIO_ENCODING_ULAW;
3991 		fp->precision = 8;
3992 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
3993 		break;
3994 	case 1:
3995 		strcpy(fp->name, AudioEslinear);
3996 		fp->encoding = AUDIO_ENCODING_SLINEAR;
3997 		fp->precision = 8;
3998 		fp->flags = 0;
3999 		break;
4000 	case 2:
4001 		strcpy(fp->name, AudioEslinear_le);
4002 		fp->encoding = AUDIO_ENCODING_SLINEAR_LE;
4003 		fp->precision = 16;
4004 		fp->flags = 0;
4005 		break;
4006 	case 3:
4007 		strcpy(fp->name, AudioEulinear);
4008 		fp->encoding = AUDIO_ENCODING_ULINEAR;
4009 		fp->precision = 8;
4010 		fp->flags = 0;
4011 		break;
4012 	case 4:
4013 		strcpy(fp->name, AudioEulinear_le);
4014 		fp->encoding = AUDIO_ENCODING_ULINEAR_LE;
4015 		fp->precision = 16;
4016 		fp->flags = 0;
4017 		break;
4018 	case 5:
4019 		strcpy(fp->name, AudioEslinear_be);
4020 		fp->encoding = AUDIO_ENCODING_SLINEAR_BE;
4021 		fp->precision = 16;
4022 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
4023 		break;
4024 	case 6:
4025 		strcpy(fp->name, AudioEulinear_be);
4026 		fp->encoding = AUDIO_ENCODING_ULINEAR_BE;
4027 		fp->precision = 16;
4028 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
4029 		break;
4030 	case 7:
4031 		strcpy(fp->name, AudioEalaw);
4032 		fp->encoding = AUDIO_ENCODING_ALAW;
4033 		fp->precision = 8;
4034 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
4035 		break;
4036 
4037 	default:
4038 		return(EINVAL);
4039 		/*NOTREACHED*/
4040 	}
4041 	return (0);
4042 }
4043 
4044 /*
4045  * Setup the ICS mixer in "transparent" mode: reset everything to a sensible
4046  * level.  Levels as suggested by GUS SDK code.
4047  */
4048 
4049 STATIC void
4050 gus_init_ics2101(sc)
4051 	struct gus_softc *sc;
4052 {
4053 	struct ics2101_softc *ic = &sc->sc_mixer;
4054 	sc->sc_mixer.sc_iot = sc->sc_iot;
4055 	sc->sc_mixer.sc_selio = GUS_MIXER_SELECT;
4056 	sc->sc_mixer.sc_selio_ioh = sc->sc_ioh3;
4057 	sc->sc_mixer.sc_dataio = GUS_MIXER_DATA;
4058 	sc->sc_mixer.sc_dataio_ioh = sc->sc_ioh2;
4059 	sc->sc_mixer.sc_flags = (sc->sc_revision == 5) ? ICS_FLIP : 0;
4060 
4061 	ics2101_mix_attenuate(ic,
4062 			      GUSMIX_CHAN_MIC,
4063 			      ICSMIX_LEFT,
4064 			      ICSMIX_MIN_ATTN);
4065 	ics2101_mix_attenuate(ic,
4066 			      GUSMIX_CHAN_MIC,
4067 			      ICSMIX_RIGHT,
4068 			      ICSMIX_MIN_ATTN);
4069 	/*
4070 	 * Start with microphone muted by the mixer...
4071 	 */
4072 	gusics_mic_mute(ic, 1);
4073 
4074 	/* ... and enabled by the GUS master mix control */
4075 	gus_mic_ctl(sc, SPKR_ON);
4076 
4077 	ics2101_mix_attenuate(ic,
4078 			      GUSMIX_CHAN_LINE,
4079 			      ICSMIX_LEFT,
4080 			      ICSMIX_MIN_ATTN);
4081 	ics2101_mix_attenuate(ic,
4082 			      GUSMIX_CHAN_LINE,
4083 			      ICSMIX_RIGHT,
4084 			      ICSMIX_MIN_ATTN);
4085 
4086 	ics2101_mix_attenuate(ic,
4087 			      GUSMIX_CHAN_CD,
4088 			      ICSMIX_LEFT,
4089 			      ICSMIX_MIN_ATTN);
4090 	ics2101_mix_attenuate(ic,
4091 			      GUSMIX_CHAN_CD,
4092 			      ICSMIX_RIGHT,
4093 			      ICSMIX_MIN_ATTN);
4094 
4095 	ics2101_mix_attenuate(ic,
4096 			      GUSMIX_CHAN_DAC,
4097 			      ICSMIX_LEFT,
4098 			      ICSMIX_MIN_ATTN);
4099 	ics2101_mix_attenuate(ic,
4100 			      GUSMIX_CHAN_DAC,
4101 			      ICSMIX_RIGHT,
4102 			      ICSMIX_MIN_ATTN);
4103 
4104 	ics2101_mix_attenuate(ic,
4105 			      ICSMIX_CHAN_4,
4106 			      ICSMIX_LEFT,
4107 			      ICSMIX_MAX_ATTN);
4108 	ics2101_mix_attenuate(ic,
4109 			      ICSMIX_CHAN_4,
4110 			      ICSMIX_RIGHT,
4111 			      ICSMIX_MAX_ATTN);
4112 
4113 	ics2101_mix_attenuate(ic,
4114 			      GUSMIX_CHAN_MASTER,
4115 			      ICSMIX_LEFT,
4116 			      ICSMIX_MIN_ATTN);
4117 	ics2101_mix_attenuate(ic,
4118 			      GUSMIX_CHAN_MASTER,
4119 			      ICSMIX_RIGHT,
4120 			      ICSMIX_MIN_ATTN);
4121 	/* unmute other stuff: */
4122 	gusics_cd_mute(ic, 0);
4123 	gusics_dac_mute(ic, 0);
4124 	gusics_linein_mute(ic, 0);
4125 	return;
4126 }
4127 
4128 
4129 #endif /* NGUS */
4130