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