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