Lines Matching refs:gus
38 static int snd_gus_init_dma_irq(struct snd_gus_card * gus, int latches);
40 int snd_gus_use_inc(struct snd_gus_card * gus) in snd_gus_use_inc() argument
42 if (!try_module_get(gus->card->module)) in snd_gus_use_inc()
47 void snd_gus_use_dec(struct snd_gus_card * gus) in snd_gus_use_dec() argument
49 module_put(gus->card->module); in snd_gus_use_dec()
63 struct snd_gus_card *gus = snd_kcontrol_chip(kcontrol); in snd_gus_joystick_get() local
65 ucontrol->value.integer.value[0] = gus->joystick_dac & 31; in snd_gus_joystick_get()
71 struct snd_gus_card *gus = snd_kcontrol_chip(kcontrol); in snd_gus_joystick_put() local
77 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gus_joystick_put()
78 change = gus->joystick_dac != nval; in snd_gus_joystick_put()
79 gus->joystick_dac = nval; in snd_gus_joystick_put()
80 snd_gf1_write8(gus, SNDRV_GF1_GB_JOYSTICK_DAC_LEVEL, gus->joystick_dac); in snd_gus_joystick_put()
81 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gus_joystick_put()
93 static void snd_gus_init_control(struct snd_gus_card *gus) in snd_gus_init_control() argument
95 if (!gus->ace_flag) in snd_gus_init_control()
96 snd_ctl_add(gus->card, snd_ctl_new1(&snd_gus_joystick_control, gus)); in snd_gus_init_control()
103 static int snd_gus_free(struct snd_gus_card *gus) in snd_gus_free() argument
105 if (gus->gf1.res_port2 == NULL) in snd_gus_free()
107 snd_gf1_stop(gus); in snd_gus_free()
108 snd_gus_init_dma_irq(gus, 0); in snd_gus_free()
110 release_and_free_resource(gus->gf1.res_port1); in snd_gus_free()
111 release_and_free_resource(gus->gf1.res_port2); in snd_gus_free()
112 if (gus->gf1.irq >= 0) in snd_gus_free()
113 free_irq(gus->gf1.irq, (void *) gus); in snd_gus_free()
114 if (gus->gf1.dma1 >= 0) { in snd_gus_free()
115 disable_dma(gus->gf1.dma1); in snd_gus_free()
116 free_dma(gus->gf1.dma1); in snd_gus_free()
118 if (!gus->equal_dma && gus->gf1.dma2 >= 0) { in snd_gus_free()
119 disable_dma(gus->gf1.dma2); in snd_gus_free()
120 free_dma(gus->gf1.dma2); in snd_gus_free()
122 kfree(gus); in snd_gus_free()
128 struct snd_gus_card *gus = device->device_data; in snd_gus_dev_free() local
129 return snd_gus_free(gus); in snd_gus_dev_free()
141 struct snd_gus_card *gus; in snd_gus_create() local
148 gus = kzalloc(sizeof(*gus), GFP_KERNEL); in snd_gus_create()
149 if (gus == NULL) in snd_gus_create()
151 spin_lock_init(&gus->reg_lock); in snd_gus_create()
152 spin_lock_init(&gus->voice_alloc); in snd_gus_create()
153 spin_lock_init(&gus->active_voice_lock); in snd_gus_create()
154 spin_lock_init(&gus->event_lock); in snd_gus_create()
155 spin_lock_init(&gus->dma_lock); in snd_gus_create()
156 spin_lock_init(&gus->pcm_volume_level_lock); in snd_gus_create()
157 spin_lock_init(&gus->uart_cmd_lock); in snd_gus_create()
158 mutex_init(&gus->dma_mutex); in snd_gus_create()
159 gus->gf1.irq = -1; in snd_gus_create()
160 gus->gf1.dma1 = -1; in snd_gus_create()
161 gus->gf1.dma2 = -1; in snd_gus_create()
162 gus->card = card; in snd_gus_create()
163 gus->gf1.port = port; in snd_gus_create()
165 gus->gf1.reg_page = GUSP(gus, GF1PAGE); in snd_gus_create()
166 gus->gf1.reg_regsel = GUSP(gus, GF1REGSEL); in snd_gus_create()
167 gus->gf1.reg_data8 = GUSP(gus, GF1DATAHIGH); in snd_gus_create()
168 gus->gf1.reg_data16 = GUSP(gus, GF1DATALOW); in snd_gus_create()
169 gus->gf1.reg_irqstat = GUSP(gus, IRQSTAT); in snd_gus_create()
170 gus->gf1.reg_dram = GUSP(gus, DRAM); in snd_gus_create()
171 gus->gf1.reg_timerctrl = GUSP(gus, TIMERCNTRL); in snd_gus_create()
172 gus->gf1.reg_timerdata = GUSP(gus, TIMERDATA); in snd_gus_create()
174 if ((gus->gf1.res_port1 = request_region(port, 16, "GUS GF1 (Adlib/SB)")) == NULL) { in snd_gus_create()
176 snd_gus_free(gus); in snd_gus_create()
179 if ((gus->gf1.res_port2 = request_region(port + 0x100, 12, "GUS GF1 (Synth)")) == NULL) { in snd_gus_create()
181 snd_gus_free(gus); in snd_gus_create()
184 if (irq >= 0 && request_irq(irq, snd_gus_interrupt, 0, "GUS GF1", (void *) gus)) { in snd_gus_create()
186 snd_gus_free(gus); in snd_gus_create()
189 gus->gf1.irq = irq; in snd_gus_create()
192 snd_gus_free(gus); in snd_gus_create()
195 gus->gf1.dma1 = dma1; in snd_gus_create()
199 snd_gus_free(gus); in snd_gus_create()
202 gus->gf1.dma2 = dma2; in snd_gus_create()
204 gus->gf1.dma2 = gus->gf1.dma1; in snd_gus_create()
205 gus->equal_dma = 1; in snd_gus_create()
207 gus->timer_dev = timer_dev; in snd_gus_create()
218 gus->gf1.effect = effect ? 1 : 0; in snd_gus_create()
219 gus->gf1.active_voices = voices; in snd_gus_create()
220 gus->gf1.pcm_channels = pcm_channels; in snd_gus_create()
221 gus->gf1.volume_ramp = 25; in snd_gus_create()
222 gus->gf1.smooth_pan = 1; in snd_gus_create()
223 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, gus, &ops)) < 0) { in snd_gus_create()
224 snd_gus_free(gus); in snd_gus_create()
227 *rgus = gus; in snd_gus_create()
235 static int snd_gus_detect_memory(struct snd_gus_card * gus) in snd_gus_detect_memory() argument
240 snd_gf1_poke(gus, 0L, 0xaa); in snd_gus_detect_memory()
241 snd_gf1_poke(gus, 1L, 0x55); in snd_gus_detect_memory()
242 if (snd_gf1_peek(gus, 0L) != 0xaa || snd_gf1_peek(gus, 1L) != 0x55) { in snd_gus_detect_memory()
243 snd_printk(KERN_ERR "plain GF1 card at 0x%lx without onboard DRAM?\n", gus->gf1.port); in snd_gus_detect_memory()
248 snd_gf1_poke(gus, local, d); in snd_gus_detect_memory()
249 snd_gf1_poke(gus, local + 1, d + 1); in snd_gus_detect_memory()
250 if (snd_gf1_peek(gus, local) != d || in snd_gus_detect_memory()
251 snd_gf1_peek(gus, local + 1) != d + 1 || in snd_gus_detect_memory()
252 snd_gf1_peek(gus, 0L) != 0xaa) in snd_gus_detect_memory()
256 gus->gf1.memory = idx << 18; in snd_gus_detect_memory()
258 gus->gf1.memory = 256 * 1024; in snd_gus_detect_memory()
260 for (l = 0, local = gus->gf1.memory; l < 4; l++, local -= 256 * 1024) { in snd_gus_detect_memory()
261 gus->gf1.mem_alloc.banks_8[l].address = in snd_gus_detect_memory()
262 gus->gf1.mem_alloc.banks_8[l].size = 0; in snd_gus_detect_memory()
263 gus->gf1.mem_alloc.banks_16[l].address = l << 18; in snd_gus_detect_memory()
264 gus->gf1.mem_alloc.banks_16[l].size = local > 0 ? 256 * 1024 : 0; in snd_gus_detect_memory()
266 gus->gf1.mem_alloc.banks_8[0].size = gus->gf1.memory; in snd_gus_detect_memory()
270 static int snd_gus_init_dma_irq(struct snd_gus_card * gus, int latches) in snd_gus_init_dma_irq() argument
280 if (snd_BUG_ON(!gus)) in snd_gus_init_dma_irq()
282 card = gus->card; in snd_gus_init_dma_irq()
286 gus->mix_cntrl_reg &= 0xf8; in snd_gus_init_dma_irq()
287 gus->mix_cntrl_reg |= 0x01; /* disable MIC, LINE IN, enable LINE OUT */ in snd_gus_init_dma_irq()
288 if (gus->codec_flag || gus->ess_flag) { in snd_gus_init_dma_irq()
289 gus->mix_cntrl_reg &= ~1; /* enable LINE IN */ in snd_gus_init_dma_irq()
290 gus->mix_cntrl_reg |= 4; /* enable MIC */ in snd_gus_init_dma_irq()
292 dma1 = gus->gf1.dma1; in snd_gus_init_dma_irq()
295 dma2 = gus->gf1.dma2; in snd_gus_init_dma_irq()
298 dma1 |= gus->equal_dma ? 0x40 : (dma2 << 3); in snd_gus_init_dma_irq()
304 irq = gus->gf1.irq; in snd_gus_init_dma_irq()
316 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
317 outb(5, GUSP(gus, REGCNTRLS)); in snd_gus_init_dma_irq()
318 outb(gus->mix_cntrl_reg, GUSP(gus, MIXCNTRLREG)); in snd_gus_init_dma_irq()
319 outb(0x00, GUSP(gus, IRQDMACNTRLREG)); in snd_gus_init_dma_irq()
320 outb(0, GUSP(gus, REGCNTRLS)); in snd_gus_init_dma_irq()
321 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
325 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
326 outb(0x00 | gus->mix_cntrl_reg, GUSP(gus, MIXCNTRLREG)); in snd_gus_init_dma_irq()
327 outb(dma1, GUSP(gus, IRQDMACNTRLREG)); in snd_gus_init_dma_irq()
329 outb(0x40 | gus->mix_cntrl_reg, GUSP(gus, MIXCNTRLREG)); in snd_gus_init_dma_irq()
330 outb(irq, GUSP(gus, IRQDMACNTRLREG)); in snd_gus_init_dma_irq()
332 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
336 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
337 outb(0x00 | gus->mix_cntrl_reg, GUSP(gus, MIXCNTRLREG)); in snd_gus_init_dma_irq()
338 outb(dma1, GUSP(gus, IRQDMACNTRLREG)); in snd_gus_init_dma_irq()
340 outb(0x40 | gus->mix_cntrl_reg, GUSP(gus, MIXCNTRLREG)); in snd_gus_init_dma_irq()
341 outb(irq, GUSP(gus, IRQDMACNTRLREG)); in snd_gus_init_dma_irq()
343 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
345 snd_gf1_delay(gus); in snd_gus_init_dma_irq()
348 gus->mix_cntrl_reg |= 0x08; /* enable latches */ in snd_gus_init_dma_irq()
350 gus->mix_cntrl_reg &= ~0x08; /* disable latches */ in snd_gus_init_dma_irq()
351 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
352 outb(gus->mix_cntrl_reg, GUSP(gus, MIXCNTRLREG)); in snd_gus_init_dma_irq()
353 outb(0, GUSP(gus, GF1PAGE)); in snd_gus_init_dma_irq()
354 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
359 static int snd_gus_check_version(struct snd_gus_card * gus) in snd_gus_check_version() argument
365 card = gus->card; in snd_gus_check_version()
366 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gus_check_version()
367 outb(0x20, GUSP(gus, REGCNTRLS)); in snd_gus_check_version()
368 val = inb(GUSP(gus, REGCNTRLS)); in snd_gus_check_version()
369 rev = inb(GUSP(gus, BOARDVERSION)); in snd_gus_check_version()
370 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gus_check_version()
371 snd_printdd("GF1 [0x%lx] init - val = 0x%x, rev = 0x%x\n", gus->gf1.port, val, rev); in snd_gus_check_version()
376 gus->ics_flag = 1; in snd_gus_check_version()
378 gus->ics_flipped = 1; in snd_gus_check_version()
386 gus->max_flag = 1; in snd_gus_check_version()
390 gus->ace_flag = 1; in snd_gus_check_version()
394 gus->ess_flag = 1; in snd_gus_check_version()
396 …snd_printk(KERN_ERR "unknown GF1 revision number at 0x%lx - 0x%x (0x%x)\n", gus->gf1.port, rev, va… in snd_gus_check_version()
402 gus->uart_enable = 1; /* standard GUSes doesn't have midi uart trouble */ in snd_gus_check_version()
403 snd_gus_init_control(gus); in snd_gus_check_version()
407 int snd_gus_initialize(struct snd_gus_card *gus) in snd_gus_initialize() argument
411 if (!gus->interwave) { in snd_gus_initialize()
412 if ((err = snd_gus_check_version(gus)) < 0) { in snd_gus_initialize()
416 if ((err = snd_gus_detect_memory(gus)) < 0) in snd_gus_initialize()
419 if ((err = snd_gus_init_dma_irq(gus, 1)) < 0) in snd_gus_initialize()
421 snd_gf1_start(gus); in snd_gus_initialize()
422 gus->initialized = 1; in snd_gus_initialize()