Lines Matching +full:0 +full:- +full:n
1 // SPDX-License-Identifier: GPL-2.0-or-later
48 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for " CRD_NAME " driver.");
54 MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for " CRD_NAME " driver.");
64 #define DSP_PORT_RESET 0x6
65 #define DSP_PORT_READ 0xa
66 #define DSP_PORT_COMMAND 0xc
67 #define DSP_PORT_STATUS 0xc
68 #define DSP_PORT_DATA_AVAIL 0xe
70 #define DSP_SIGNATURE 0xaa
72 #define DSP_COMMAND_GET_VERSION 0xe1
78 while (!(ioread8(port + DSP_PORT_DATA_AVAIL) & 0x80)) { in dsp_get_byte()
79 if (!loops--) in dsp_get_byte()
80 return -EIO; in dsp_get_byte()
84 return 0; in dsp_get_byte()
93 iowrite8(0, port + DSP_PORT_RESET); in dsp_reset()
95 if (dsp_get_byte(port, &val) < 0 || val != DSP_SIGNATURE) in dsp_reset()
96 return -ENODEV; in dsp_reset()
98 return 0; in dsp_reset()
105 while (ioread8(port + DSP_PORT_STATUS) & 0x80) { in dsp_command()
106 if (!loops--) in dsp_command()
107 return -EIO; in dsp_command()
111 return 0; in dsp_command()
119 if (err < 0) in dsp_get_version()
123 if (err < 0) in dsp_get_version()
127 if (err < 0) in dsp_get_version()
130 return 0; in dsp_get_version()
137 #define WSS_CONFIG_DMA_0 (1 << 0)
138 #define WSS_CONFIG_DMA_1 (2 << 0)
139 #define WSS_CONFIG_DMA_3 (3 << 0)
146 #define WSS_PORT_CONFIG 0
153 if ((ioread8(wss_port + WSS_PORT_SIGNATURE) & 0x3f) != WSS_SIGNATURE) in wss_detect()
154 return -ENODEV; in wss_detect()
156 return 0; in wss_detect()
175 #define GALAXY_COMMAND_WSSMODE 0
194 static int snd_galaxy_match(struct device *dev, unsigned int n) in snd_galaxy_match() argument
196 if (!enable[n]) in snd_galaxy_match()
197 return 0; in snd_galaxy_match()
199 switch (port[n]) { in snd_galaxy_match()
201 dev_err(dev, "please specify port\n"); in snd_galaxy_match()
202 return 0; in snd_galaxy_match()
203 case 0x220: in snd_galaxy_match()
204 config[n] |= GALAXY_CONFIG_SBA_220; in snd_galaxy_match()
206 case 0x240: in snd_galaxy_match()
207 config[n] |= GALAXY_CONFIG_SBA_240; in snd_galaxy_match()
209 case 0x260: in snd_galaxy_match()
210 config[n] |= GALAXY_CONFIG_SBA_260; in snd_galaxy_match()
212 case 0x280: in snd_galaxy_match()
213 config[n] |= GALAXY_CONFIG_SBA_280; in snd_galaxy_match()
216 dev_err(dev, "invalid port %#lx\n", port[n]); in snd_galaxy_match()
217 return 0; in snd_galaxy_match()
220 switch (wss_port[n]) { in snd_galaxy_match()
222 dev_err(dev, "please specify wss_port\n"); in snd_galaxy_match()
223 return 0; in snd_galaxy_match()
224 case 0x530: in snd_galaxy_match()
225 config[n] |= GALAXY_CONFIG_WSS_ENABLE | GALAXY_CONFIG_WSSA_530; in snd_galaxy_match()
227 case 0x604: in snd_galaxy_match()
228 config[n] |= GALAXY_CONFIG_WSS_ENABLE | GALAXY_CONFIG_WSSA_604; in snd_galaxy_match()
230 case 0xe80: in snd_galaxy_match()
231 config[n] |= GALAXY_CONFIG_WSS_ENABLE | GALAXY_CONFIG_WSSA_E80; in snd_galaxy_match()
233 case 0xf40: in snd_galaxy_match()
234 config[n] |= GALAXY_CONFIG_WSS_ENABLE | GALAXY_CONFIG_WSSA_F40; in snd_galaxy_match()
237 dev_err(dev, "invalid WSS port %#lx\n", wss_port[n]); in snd_galaxy_match()
238 return 0; in snd_galaxy_match()
241 switch (irq[n]) { in snd_galaxy_match()
243 dev_err(dev, "please specify irq\n"); in snd_galaxy_match()
244 return 0; in snd_galaxy_match()
246 wss_config[n] |= WSS_CONFIG_IRQ_7; in snd_galaxy_match()
249 irq[n] = 9; in snd_galaxy_match()
252 wss_config[n] |= WSS_CONFIG_IRQ_9; in snd_galaxy_match()
255 wss_config[n] |= WSS_CONFIG_IRQ_10; in snd_galaxy_match()
258 wss_config[n] |= WSS_CONFIG_IRQ_11; in snd_galaxy_match()
261 dev_err(dev, "invalid IRQ %d\n", irq[n]); in snd_galaxy_match()
262 return 0; in snd_galaxy_match()
265 switch (dma1[n]) { in snd_galaxy_match()
267 dev_err(dev, "please specify dma1\n"); in snd_galaxy_match()
268 return 0; in snd_galaxy_match()
269 case 0: in snd_galaxy_match()
270 wss_config[n] |= WSS_CONFIG_DMA_0; in snd_galaxy_match()
273 wss_config[n] |= WSS_CONFIG_DMA_1; in snd_galaxy_match()
276 wss_config[n] |= WSS_CONFIG_DMA_3; in snd_galaxy_match()
279 dev_err(dev, "invalid playback DMA %d\n", dma1[n]); in snd_galaxy_match()
280 return 0; in snd_galaxy_match()
283 if (dma2[n] == SNDRV_AUTO_DMA || dma2[n] == dma1[n]) { in snd_galaxy_match()
284 dma2[n] = -1; in snd_galaxy_match()
288 wss_config[n] |= WSS_CONFIG_DUPLEX; in snd_galaxy_match()
289 switch (dma2[n]) { in snd_galaxy_match()
290 case 0: in snd_galaxy_match()
293 if (dma1[n] == 0) in snd_galaxy_match()
297 dev_err(dev, "invalid capture DMA %d\n", dma2[n]); in snd_galaxy_match()
298 return 0; in snd_galaxy_match()
302 switch (mpu_port[n]) { in snd_galaxy_match()
304 dev_warn(dev, "mpu_port not specified; not using MPU-401\n"); in snd_galaxy_match()
305 mpu_port[n] = -1; in snd_galaxy_match()
307 case 0x300: in snd_galaxy_match()
308 config[n] |= GALAXY_CONFIG_MPU_ENABLE | GALAXY_CONFIG_MPUA_300; in snd_galaxy_match()
310 case 0x330: in snd_galaxy_match()
311 config[n] |= GALAXY_CONFIG_MPU_ENABLE | GALAXY_CONFIG_MPUA_330; in snd_galaxy_match()
314 dev_err(dev, "invalid MPU port %#lx\n", mpu_port[n]); in snd_galaxy_match()
315 return 0; in snd_galaxy_match()
318 switch (mpu_irq[n]) { in snd_galaxy_match()
320 dev_warn(dev, "mpu_irq not specified: using polling mode\n"); in snd_galaxy_match()
321 mpu_irq[n] = -1; in snd_galaxy_match()
324 mpu_irq[n] = 9; in snd_galaxy_match()
327 config[n] |= GALAXY_CONFIG_MPUIRQ_2; in snd_galaxy_match()
331 config[n] |= GALAXY_CONFIG_MPUIRQ_3; in snd_galaxy_match()
335 config[n] |= GALAXY_CONFIG_MPUIRQ_5; in snd_galaxy_match()
338 config[n] |= GALAXY_CONFIG_MPUIRQ_7; in snd_galaxy_match()
342 config[n] |= GALAXY_CONFIG_MPUIRQ_10; in snd_galaxy_match()
346 dev_err(dev, "invalid MPU IRQ %d\n", mpu_irq[n]); in snd_galaxy_match()
347 return 0; in snd_galaxy_match()
350 if (mpu_irq[n] == irq[n]) { in snd_galaxy_match()
351 dev_err(dev, "cannot share IRQ between WSS and MPU-401\n"); in snd_galaxy_match()
352 return 0; in snd_galaxy_match()
356 switch (fm_port[n]) { in snd_galaxy_match()
358 dev_warn(dev, "fm_port not specified: not using OPL3\n"); in snd_galaxy_match()
359 fm_port[n] = -1; in snd_galaxy_match()
361 case 0x388: in snd_galaxy_match()
364 dev_err(dev, "illegal FM port %#lx\n", fm_port[n]); in snd_galaxy_match()
365 return 0; in snd_galaxy_match()
368 config[n] |= GALAXY_CONFIG_GAME_ENABLE; in snd_galaxy_match()
378 err = dsp_reset(galaxy->port); in galaxy_init()
379 if (err < 0) in galaxy_init()
382 err = dsp_get_version(galaxy->port, &major, &minor); in galaxy_init()
383 if (err < 0) in galaxy_init()
387 return -ENODEV; in galaxy_init()
389 err = dsp_command(galaxy->port, DSP_COMMAND_GALAXY_8); in galaxy_init()
390 if (err < 0) in galaxy_init()
393 err = dsp_command(galaxy->port, GALAXY_COMMAND_GET_TYPE); in galaxy_init()
394 if (err < 0) in galaxy_init()
397 err = dsp_get_byte(galaxy->port, type); in galaxy_init()
398 if (err < 0) in galaxy_init()
401 return 0; in galaxy_init()
408 err = dsp_command(galaxy->port, DSP_COMMAND_GALAXY_9); in galaxy_set_mode()
409 if (err < 0) in galaxy_set_mode()
412 err = dsp_command(galaxy->port, mode); in galaxy_set_mode()
413 if (err < 0) in galaxy_set_mode()
420 err = dsp_reset(galaxy->port); in galaxy_set_mode()
421 if (err < 0) in galaxy_set_mode()
425 return 0; in galaxy_set_mode()
430 u8 tmp = ioread8(galaxy->config_port + CONFIG_PORT_SET); in galaxy_set_config()
433 iowrite8(tmp | 0x80, galaxy->config_port + CONFIG_PORT_SET); in galaxy_set_config()
434 for (i = 0; i < GALAXY_CONFIG_SIZE; i++) { in galaxy_set_config()
435 iowrite8(config, galaxy->config_port + i); in galaxy_set_config()
438 iowrite8(tmp & 0x7f, galaxy->config_port + CONFIG_PORT_SET); in galaxy_set_config()
446 for (i = GALAXY_CONFIG_SIZE; i; i--) { in galaxy_config()
447 u8 tmp = ioread8(galaxy->config_port + i - 1); in galaxy_config()
448 galaxy->config = (galaxy->config << 8) | tmp; in galaxy_config()
450 config |= galaxy->config & GALAXY_CONFIG_MASK; in galaxy_config()
458 err = wss_detect(galaxy->wss_port); in galaxy_wss_config()
459 if (err < 0) in galaxy_wss_config()
462 wss_set_config(galaxy->wss_port, wss_config); in galaxy_wss_config()
465 if (err < 0) in galaxy_wss_config()
468 return 0; in galaxy_wss_config()
473 struct snd_galaxy *galaxy = card->private_data; in snd_galaxy_free()
475 if (galaxy->wss_port) in snd_galaxy_free()
476 wss_set_config(galaxy->wss_port, 0); in snd_galaxy_free()
477 if (galaxy->config_port) in snd_galaxy_free()
478 galaxy_set_config(galaxy, galaxy->config); in snd_galaxy_free()
481 static int __snd_galaxy_probe(struct device *dev, unsigned int n) in __snd_galaxy_probe() argument
489 err = snd_devm_card_new(dev, index[n], id[n], THIS_MODULE, in __snd_galaxy_probe()
491 if (err < 0) in __snd_galaxy_probe()
494 card->private_free = snd_galaxy_free; in __snd_galaxy_probe()
495 galaxy = card->private_data; in __snd_galaxy_probe()
497 galaxy->res_port = devm_request_region(dev, port[n], 16, DRV_NAME); in __snd_galaxy_probe()
498 if (!galaxy->res_port) { in __snd_galaxy_probe()
499 dev_err(dev, "could not grab ports %#lx-%#lx\n", port[n], in __snd_galaxy_probe()
500 port[n] + 15); in __snd_galaxy_probe()
501 return -EBUSY; in __snd_galaxy_probe()
503 galaxy->port = devm_ioport_map(dev, port[n], 16); in __snd_galaxy_probe()
504 if (!galaxy->port) in __snd_galaxy_probe()
505 return -ENOMEM; in __snd_galaxy_probe()
508 if (err < 0) { in __snd_galaxy_probe()
509 dev_err(dev, "did not find a Sound Galaxy at %#lx\n", port[n]); in __snd_galaxy_probe()
512 dev_info(dev, "Sound Galaxy (type %d) found at %#lx\n", type, port[n]); in __snd_galaxy_probe()
514 galaxy->res_config_port = in __snd_galaxy_probe()
515 devm_request_region(dev, port[n] + GALAXY_PORT_CONFIG, 16, in __snd_galaxy_probe()
517 if (!galaxy->res_config_port) { in __snd_galaxy_probe()
518 dev_err(dev, "could not grab ports %#lx-%#lx\n", in __snd_galaxy_probe()
519 port[n] + GALAXY_PORT_CONFIG, in __snd_galaxy_probe()
520 port[n] + GALAXY_PORT_CONFIG + 15); in __snd_galaxy_probe()
521 return -EBUSY; in __snd_galaxy_probe()
523 galaxy->config_port = in __snd_galaxy_probe()
524 devm_ioport_map(dev, port[n] + GALAXY_PORT_CONFIG, 16); in __snd_galaxy_probe()
525 if (!galaxy->config_port) in __snd_galaxy_probe()
526 return -ENOMEM; in __snd_galaxy_probe()
527 galaxy_config(galaxy, config[n]); in __snd_galaxy_probe()
529 galaxy->res_wss_port = devm_request_region(dev, wss_port[n], 4, DRV_NAME); in __snd_galaxy_probe()
530 if (!galaxy->res_wss_port) { in __snd_galaxy_probe()
531 dev_err(dev, "could not grab ports %#lx-%#lx\n", wss_port[n], in __snd_galaxy_probe()
532 wss_port[n] + 3); in __snd_galaxy_probe()
533 return -EBUSY; in __snd_galaxy_probe()
535 galaxy->wss_port = devm_ioport_map(dev, wss_port[n], 4); in __snd_galaxy_probe()
536 if (!galaxy->wss_port) in __snd_galaxy_probe()
537 return -ENOMEM; in __snd_galaxy_probe()
539 err = galaxy_wss_config(galaxy, wss_config[n]); in __snd_galaxy_probe()
540 if (err < 0) { in __snd_galaxy_probe()
541 dev_err(dev, "could not configure WSS\n"); in __snd_galaxy_probe()
545 strscpy(card->driver, DRV_NAME); in __snd_galaxy_probe()
546 strscpy(card->shortname, DRV_NAME); in __snd_galaxy_probe()
547 sprintf(card->longname, "%s at %#lx/%#lx, irq %d, dma %d/%d", in __snd_galaxy_probe()
548 card->shortname, port[n], wss_port[n], irq[n], dma1[n], in __snd_galaxy_probe()
549 dma2[n]); in __snd_galaxy_probe()
551 err = snd_wss_create(card, wss_port[n] + 4, -1, irq[n], dma1[n], in __snd_galaxy_probe()
552 dma2[n], WSS_HW_DETECT, 0, &chip); in __snd_galaxy_probe()
553 if (err < 0) in __snd_galaxy_probe()
556 err = snd_wss_pcm(chip, 0); in __snd_galaxy_probe()
557 if (err < 0) in __snd_galaxy_probe()
561 if (err < 0) in __snd_galaxy_probe()
564 err = snd_wss_timer(chip, 0); in __snd_galaxy_probe()
565 if (err < 0) in __snd_galaxy_probe()
568 if (mpu_port[n] >= 0) { in __snd_galaxy_probe()
569 err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, in __snd_galaxy_probe()
570 mpu_port[n], 0, mpu_irq[n], NULL); in __snd_galaxy_probe()
571 if (err < 0) in __snd_galaxy_probe()
575 if (fm_port[n] >= 0) { in __snd_galaxy_probe()
578 err = snd_opl3_create(card, fm_port[n], fm_port[n] + 2, in __snd_galaxy_probe()
579 OPL3_HW_AUTO, 0, &opl3); in __snd_galaxy_probe()
580 if (err < 0) { in __snd_galaxy_probe()
581 dev_err(dev, "no OPL device at %#lx\n", fm_port[n]); in __snd_galaxy_probe()
585 if (err < 0) in __snd_galaxy_probe()
588 err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); in __snd_galaxy_probe()
589 if (err < 0) in __snd_galaxy_probe()
594 if (err < 0) in __snd_galaxy_probe()
598 return 0; in __snd_galaxy_probe()
601 static int snd_galaxy_probe(struct device *dev, unsigned int n) in snd_galaxy_probe() argument
603 return snd_card_free_on_error(dev, __snd_galaxy_probe(dev, n)); in snd_galaxy_probe()