Lines Matching refs:gus
23 static int snd_gus_init_dma_irq(struct snd_gus_card * gus, int latches);
36 struct snd_gus_card *gus = snd_kcontrol_chip(kcontrol); in snd_gus_joystick_get() local
38 ucontrol->value.integer.value[0] = gus->joystick_dac & 31; in snd_gus_joystick_get()
44 struct snd_gus_card *gus = snd_kcontrol_chip(kcontrol); in snd_gus_joystick_put() local
50 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gus_joystick_put()
51 change = gus->joystick_dac != nval; in snd_gus_joystick_put()
52 gus->joystick_dac = nval; in snd_gus_joystick_put()
53 snd_gf1_write8(gus, SNDRV_GF1_GB_JOYSTICK_DAC_LEVEL, gus->joystick_dac); in snd_gus_joystick_put()
54 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gus_joystick_put()
66 static void snd_gus_init_control(struct snd_gus_card *gus) in snd_gus_init_control() argument
68 if (!gus->ace_flag) in snd_gus_init_control()
69 snd_ctl_add(gus->card, snd_ctl_new1(&snd_gus_joystick_control, gus)); in snd_gus_init_control()
76 static int snd_gus_free(struct snd_gus_card *gus) in snd_gus_free() argument
78 if (gus->gf1.res_port2 == NULL) in snd_gus_free()
80 snd_gf1_stop(gus); in snd_gus_free()
81 snd_gus_init_dma_irq(gus, 0); in snd_gus_free()
83 release_and_free_resource(gus->gf1.res_port1); in snd_gus_free()
84 release_and_free_resource(gus->gf1.res_port2); in snd_gus_free()
85 if (gus->gf1.irq >= 0) in snd_gus_free()
86 free_irq(gus->gf1.irq, (void *) gus); in snd_gus_free()
87 if (gus->gf1.dma1 >= 0) { in snd_gus_free()
88 disable_dma(gus->gf1.dma1); in snd_gus_free()
89 free_dma(gus->gf1.dma1); in snd_gus_free()
91 if (!gus->equal_dma && gus->gf1.dma2 >= 0) { in snd_gus_free()
92 disable_dma(gus->gf1.dma2); in snd_gus_free()
93 free_dma(gus->gf1.dma2); in snd_gus_free()
95 kfree(gus); in snd_gus_free()
101 struct snd_gus_card *gus = device->device_data; in snd_gus_dev_free() local
102 return snd_gus_free(gus); in snd_gus_dev_free()
114 struct snd_gus_card *gus; in snd_gus_create() local
121 gus = kzalloc(sizeof(*gus), GFP_KERNEL); in snd_gus_create()
122 if (gus == NULL) in snd_gus_create()
124 spin_lock_init(&gus->reg_lock); in snd_gus_create()
125 spin_lock_init(&gus->voice_alloc); in snd_gus_create()
126 spin_lock_init(&gus->active_voice_lock); in snd_gus_create()
127 spin_lock_init(&gus->event_lock); in snd_gus_create()
128 spin_lock_init(&gus->dma_lock); in snd_gus_create()
129 spin_lock_init(&gus->pcm_volume_level_lock); in snd_gus_create()
130 spin_lock_init(&gus->uart_cmd_lock); in snd_gus_create()
131 mutex_init(&gus->dma_mutex); in snd_gus_create()
132 gus->gf1.irq = -1; in snd_gus_create()
133 gus->gf1.dma1 = -1; in snd_gus_create()
134 gus->gf1.dma2 = -1; in snd_gus_create()
135 gus->card = card; in snd_gus_create()
136 gus->gf1.port = port; in snd_gus_create()
138 gus->gf1.reg_page = GUSP(gus, GF1PAGE); in snd_gus_create()
139 gus->gf1.reg_regsel = GUSP(gus, GF1REGSEL); in snd_gus_create()
140 gus->gf1.reg_data8 = GUSP(gus, GF1DATAHIGH); in snd_gus_create()
141 gus->gf1.reg_data16 = GUSP(gus, GF1DATALOW); in snd_gus_create()
142 gus->gf1.reg_irqstat = GUSP(gus, IRQSTAT); in snd_gus_create()
143 gus->gf1.reg_dram = GUSP(gus, DRAM); in snd_gus_create()
144 gus->gf1.reg_timerctrl = GUSP(gus, TIMERCNTRL); in snd_gus_create()
145 gus->gf1.reg_timerdata = GUSP(gus, TIMERDATA); in snd_gus_create()
147 gus->gf1.res_port1 = request_region(port, 16, "GUS GF1 (Adlib/SB)"); in snd_gus_create()
148 if (!gus->gf1.res_port1) { in snd_gus_create()
150 snd_gus_free(gus); in snd_gus_create()
153 gus->gf1.res_port2 = request_region(port + 0x100, 12, "GUS GF1 (Synth)"); in snd_gus_create()
154 if (!gus->gf1.res_port2) { in snd_gus_create()
156 snd_gus_free(gus); in snd_gus_create()
159 if (irq >= 0 && request_irq(irq, snd_gus_interrupt, 0, "GUS GF1", (void *) gus)) { in snd_gus_create()
161 snd_gus_free(gus); in snd_gus_create()
164 gus->gf1.irq = irq; in snd_gus_create()
168 snd_gus_free(gus); in snd_gus_create()
171 gus->gf1.dma1 = dma1; in snd_gus_create()
175 snd_gus_free(gus); in snd_gus_create()
178 gus->gf1.dma2 = dma2; in snd_gus_create()
180 gus->gf1.dma2 = gus->gf1.dma1; in snd_gus_create()
181 gus->equal_dma = 1; in snd_gus_create()
183 gus->timer_dev = timer_dev; in snd_gus_create()
194 gus->gf1.effect = effect ? 1 : 0; in snd_gus_create()
195 gus->gf1.active_voices = voices; in snd_gus_create()
196 gus->gf1.pcm_channels = pcm_channels; in snd_gus_create()
197 gus->gf1.volume_ramp = 25; in snd_gus_create()
198 gus->gf1.smooth_pan = 1; in snd_gus_create()
199 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, gus, &ops); in snd_gus_create()
201 snd_gus_free(gus); in snd_gus_create()
204 *rgus = gus; in snd_gus_create()
212 static int snd_gus_detect_memory(struct snd_gus_card * gus) in snd_gus_detect_memory() argument
217 snd_gf1_poke(gus, 0L, 0xaa); in snd_gus_detect_memory()
218 snd_gf1_poke(gus, 1L, 0x55); in snd_gus_detect_memory()
219 if (snd_gf1_peek(gus, 0L) != 0xaa || snd_gf1_peek(gus, 1L) != 0x55) { in snd_gus_detect_memory()
220 dev_err(gus->card->dev, in snd_gus_detect_memory()
222 gus->gf1.port); in snd_gus_detect_memory()
227 snd_gf1_poke(gus, local, d); in snd_gus_detect_memory()
228 snd_gf1_poke(gus, local + 1, d + 1); in snd_gus_detect_memory()
229 if (snd_gf1_peek(gus, local) != d || in snd_gus_detect_memory()
230 snd_gf1_peek(gus, local + 1) != d + 1 || in snd_gus_detect_memory()
231 snd_gf1_peek(gus, 0L) != 0xaa) in snd_gus_detect_memory()
235 gus->gf1.memory = idx << 18; in snd_gus_detect_memory()
237 gus->gf1.memory = 256 * 1024; in snd_gus_detect_memory()
239 for (l = 0, local = gus->gf1.memory; l < 4; l++, local -= 256 * 1024) { in snd_gus_detect_memory()
240 gus->gf1.mem_alloc.banks_8[l].address = in snd_gus_detect_memory()
241 gus->gf1.mem_alloc.banks_8[l].size = 0; in snd_gus_detect_memory()
242 gus->gf1.mem_alloc.banks_16[l].address = l << 18; in snd_gus_detect_memory()
243 gus->gf1.mem_alloc.banks_16[l].size = local > 0 ? 256 * 1024 : 0; in snd_gus_detect_memory()
245 gus->gf1.mem_alloc.banks_8[0].size = gus->gf1.memory; in snd_gus_detect_memory()
249 static int snd_gus_init_dma_irq(struct snd_gus_card * gus, int latches) in snd_gus_init_dma_irq() argument
259 if (snd_BUG_ON(!gus)) in snd_gus_init_dma_irq()
261 card = gus->card; in snd_gus_init_dma_irq()
265 gus->mix_cntrl_reg &= 0xf8; in snd_gus_init_dma_irq()
266 gus->mix_cntrl_reg |= 0x01; /* disable MIC, LINE IN, enable LINE OUT */ in snd_gus_init_dma_irq()
267 if (gus->codec_flag || gus->ess_flag) { in snd_gus_init_dma_irq()
268 gus->mix_cntrl_reg &= ~1; /* enable LINE IN */ in snd_gus_init_dma_irq()
269 gus->mix_cntrl_reg |= 4; /* enable MIC */ in snd_gus_init_dma_irq()
271 dma1 = gus->gf1.dma1; in snd_gus_init_dma_irq()
274 dma2 = gus->gf1.dma2; in snd_gus_init_dma_irq()
277 dma1 |= gus->equal_dma ? 0x40 : (dma2 << 3); in snd_gus_init_dma_irq()
280 dev_err(gus->card->dev, "Error! DMA isn't defined.\n"); in snd_gus_init_dma_irq()
283 irq = gus->gf1.irq; in snd_gus_init_dma_irq()
287 dev_err(gus->card->dev, "Error! IRQ isn't defined.\n"); in snd_gus_init_dma_irq()
295 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
296 outb(5, GUSP(gus, REGCNTRLS)); in snd_gus_init_dma_irq()
297 outb(gus->mix_cntrl_reg, GUSP(gus, MIXCNTRLREG)); in snd_gus_init_dma_irq()
298 outb(0x00, GUSP(gus, IRQDMACNTRLREG)); in snd_gus_init_dma_irq()
299 outb(0, GUSP(gus, REGCNTRLS)); in snd_gus_init_dma_irq()
300 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
304 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
305 outb(0x00 | gus->mix_cntrl_reg, GUSP(gus, MIXCNTRLREG)); in snd_gus_init_dma_irq()
306 outb(dma1, GUSP(gus, IRQDMACNTRLREG)); in snd_gus_init_dma_irq()
308 outb(0x40 | gus->mix_cntrl_reg, GUSP(gus, MIXCNTRLREG)); in snd_gus_init_dma_irq()
309 outb(irq, GUSP(gus, IRQDMACNTRLREG)); in snd_gus_init_dma_irq()
311 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
315 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
316 outb(0x00 | gus->mix_cntrl_reg, GUSP(gus, MIXCNTRLREG)); in snd_gus_init_dma_irq()
317 outb(dma1, GUSP(gus, IRQDMACNTRLREG)); in snd_gus_init_dma_irq()
319 outb(0x40 | gus->mix_cntrl_reg, GUSP(gus, MIXCNTRLREG)); in snd_gus_init_dma_irq()
320 outb(irq, GUSP(gus, IRQDMACNTRLREG)); in snd_gus_init_dma_irq()
322 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
324 snd_gf1_delay(gus); in snd_gus_init_dma_irq()
327 gus->mix_cntrl_reg |= 0x08; /* enable latches */ in snd_gus_init_dma_irq()
329 gus->mix_cntrl_reg &= ~0x08; /* disable latches */ in snd_gus_init_dma_irq()
330 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
331 outb(gus->mix_cntrl_reg, GUSP(gus, MIXCNTRLREG)); in snd_gus_init_dma_irq()
332 outb(0, GUSP(gus, GF1PAGE)); in snd_gus_init_dma_irq()
333 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gus_init_dma_irq()
338 static int snd_gus_check_version(struct snd_gus_card * gus) in snd_gus_check_version() argument
344 card = gus->card; in snd_gus_check_version()
345 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gus_check_version()
346 outb(0x20, GUSP(gus, REGCNTRLS)); in snd_gus_check_version()
347 val = inb(GUSP(gus, REGCNTRLS)); in snd_gus_check_version()
348 rev = inb(GUSP(gus, BOARDVERSION)); in snd_gus_check_version()
349 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gus_check_version()
350 dev_dbg(card->dev, "GF1 [0x%lx] init - val = 0x%x, rev = 0x%x\n", gus->gf1.port, val, rev); in snd_gus_check_version()
355 gus->ics_flag = 1; in snd_gus_check_version()
357 gus->ics_flipped = 1; in snd_gus_check_version()
365 gus->max_flag = 1; in snd_gus_check_version()
369 gus->ace_flag = 1; in snd_gus_check_version()
373 gus->ess_flag = 1; in snd_gus_check_version()
377 gus->gf1.port, rev, val); in snd_gus_check_version()
384 gus->uart_enable = 1; /* standard GUSes doesn't have midi uart trouble */ in snd_gus_check_version()
385 snd_gus_init_control(gus); in snd_gus_check_version()
389 int snd_gus_initialize(struct snd_gus_card *gus) in snd_gus_initialize() argument
393 if (!gus->interwave) { in snd_gus_initialize()
394 err = snd_gus_check_version(gus); in snd_gus_initialize()
396 dev_err(gus->card->dev, "version check failed\n"); in snd_gus_initialize()
399 err = snd_gus_detect_memory(gus); in snd_gus_initialize()
403 err = snd_gus_init_dma_irq(gus, 1); in snd_gus_initialize()
406 snd_gf1_start(gus); in snd_gus_initialize()
407 gus->initialized = 1; in snd_gus_initialize()