Lines Matching +full:dsp +full:- +full:config +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Driver for Gallant SC-6000 soundcard. This card is also known as
4 * Audio Excel DSP 16 or Zoltrix AV302.
5 * These cards use CompuMedia ASC-9308 chip + AD1848 codec.
6 * SC-6600 and SC-7000 cards are also supported. They are based on
7 * CompuMedia ASC-9408 chip and CS4231 codec.
30 MODULE_DESCRIPTION("Gallant SC-6000");
33 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
43 static bool joystick[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = false };
46 MODULE_PARM_DESC(index, "Index value for sc-6000 based soundcard.");
48 MODULE_PARM_DESC(id, "ID string for sc-6000 based soundcard.");
50 MODULE_PARM_DESC(enable, "Enable sc-6000 based soundcard.");
52 MODULE_PARM_DESC(port, "Port # for sc-6000 driver.");
54 MODULE_PARM_DESC(mss_port, "MSS Port # for sc-6000 driver.");
56 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for sc-6000 driver.");
58 MODULE_PARM_DESC(irq, "IRQ # for sc-6000 driver.");
60 MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for sc-6000 driver.");
62 MODULE_PARM_DESC(dma, "DMA # for sc-6000 driver.");
67 * Commands of SC6000's DSP (SBPRO+special).
70 #define WRITE_MDIRQ_CFG 0x50 /* Set M&I&DRQ mask (the real config) */
72 #define READ_HARD_CFG 0x58 /* Read Hardware Config (I/O base etc) */
81 #define GET_DSP_VERSION 0xe1 /* Get DSP Version */
82 #define GET_DSP_COPYRIGHT 0xe3 /* Get DSP Copyright */
85 * Offsets of SC6000 DSP I/O ports. The offset is added to base I/O port
90 * (w-) == Write
91 * (r-) == Read
93 #define DSP_RESET 0x06 /* offset of DSP RESET (wo) */
94 #define DSP_READ 0x0a /* offset of DSP READ (ro) */
95 #define DSP_WRITE 0x0c /* offset of DSP WRITE (w-) */
96 #define DSP_COMMAND 0x0c /* offset of DSP COMMAND (w-) */
97 #define DSP_STATUS 0x0c /* offset of DSP STATUS (r-) */
98 #define DSP_DATAVAIL 0x0e /* offset of DSP DATA AVAILABLE (ro) */
101 #define DRV_NAME "SC-6000"
106 * sc6000_irq_to_softcfg - Decode irq number into cfg code.
135 * sc6000_dma_to_softcfg - Decode dma number into cfg code.
158 * sc6000_mpu_irq_to_softcfg - Decode MPU-401 irq number into cfg code.
193 } while (loop--); in sc6000_wait_data()
195 return -EAGAIN; in sc6000_wait_data()
201 return -EBUSY; in sc6000_read()
215 * DSP ready to receive data if bit 7 of val == 0 in sc6000_write()
222 } while (loop--); in sc6000_write()
224 snd_printk(KERN_ERR "DSP Command (0x%x) timeout.\n", cmd); in sc6000_write()
226 return -EIO; in sc6000_write()
236 return -EIO; in sc6000_dsp_get_answer()
253 return len ? len : -EIO; in sc6000_dsp_get_answer()
264 return -ENODEV; in sc6000_dsp_reset()
272 return -EIO; in sc6000_hw_cfg_write()
276 return -EIO; in sc6000_hw_cfg_write()
280 return -EIO; in sc6000_hw_cfg_write()
284 return -EIO; in sc6000_hw_cfg_write()
288 return -EIO; in sc6000_hw_cfg_write()
299 return -EIO; in sc6000_cfg_write()
303 return -EIO; in sc6000_cfg_write()
308 static int sc6000_setup_board(char __iomem *vport, int config) in sc6000_setup_board() argument
316 return -EIO; in sc6000_setup_board()
318 } while ((sc6000_wait_data(vport) < 0) && loop--); in sc6000_setup_board()
323 return -EIO; in sc6000_setup_board()
326 if (sc6000_cfg_write(vport, config)) in sc6000_setup_board()
327 return -ENODEV; in sc6000_setup_board()
332 static int sc6000_init_mss(char __iomem *vport, int config, in sc6000_init_mss() argument
338 return -EIO; in sc6000_init_mss()
343 if (sc6000_cfg_write(vport, config)) in sc6000_init_mss()
344 return -EIO; in sc6000_init_mss()
380 int config = mss_config | in sc6000_init_board() local
395 return -ENODEV; in sc6000_init_board()
398 * My SC-6000 card return "SC-6000" in DSPCopyright, so in sc6000_init_board()
401 if (strncmp("SC-6000", answer, 7)) in sc6000_init_board()
402 snd_printk(KERN_WARNING "Warning: non SC-6000 audio card!\n"); in sc6000_init_board()
406 return -ENODEV; in sc6000_init_board()
408 printk(KERN_INFO PFX "Detected model: %s, DSP version %d.%d\n", in sc6000_init_board()
422 return -EIO; in sc6000_init_board()
425 err = sc6000_setup_board(vport, config); in sc6000_init_board()
428 return -ENODEV; in sc6000_init_board()
439 err = sc6000_setup_board(vport, config); in sc6000_init_board()
442 return -ENODEV; in sc6000_init_board()
444 err = sc6000_init_mss(vport, config, vmss_port, mss_config); in sc6000_init_board()
448 return -ENODEV; in sc6000_init_board()
456 struct snd_card *card = chip->card; in snd_sc6000_mixer()
465 strcpy(id1.name, "Aux Playback Switch"); in snd_sc6000_mixer()
466 strcpy(id2.name, "FM Playback Switch"); in snd_sc6000_mixer()
470 strcpy(id1.name, "Aux Playback Volume"); in snd_sc6000_mixer()
471 strcpy(id2.name, "FM Playback Volume"); in snd_sc6000_mixer()
476 strcpy(id1.name, "Aux Playback Switch"); id1.index = 1; in snd_sc6000_mixer()
477 strcpy(id2.name, "CD Playback Switch"); in snd_sc6000_mixer()
481 strcpy(id1.name, "Aux Playback Volume"); in snd_sc6000_mixer()
482 strcpy(id2.name, "CD Playback Volume"); in snd_sc6000_mixer()
519 printk(KERN_ERR PFX "invalid MPU-401 port %lx\n", in snd_sc6000_match()
526 printk(KERN_ERR PFX "invalid MPU-401 IRQ %d\n", mpu_irq[dev]); in snd_sc6000_match()
534 char __iomem *vport = (char __force __iomem *)card->private_data; in snd_sc6000_free()
542 static const int possible_irqs[] = { 5, 7, 9, 10, 11, -1 }; in __snd_sc6000_probe()
543 static const int possible_dmas[] = { 1, 3, 0, -1 }; in __snd_sc6000_probe()
562 return -EBUSY; in __snd_sc6000_probe()
570 return -EBUSY; in __snd_sc6000_probe()
577 return -EBUSY; in __snd_sc6000_probe()
583 return -EBUSY; in __snd_sc6000_probe()
585 card->private_data = (void __force *)vport; in __snd_sc6000_probe()
590 "SC-6000 port I/O port region is already in use.\n"); in __snd_sc6000_probe()
591 return -EBUSY; in __snd_sc6000_probe()
597 return -EBUSY; in __snd_sc6000_probe()
607 card->private_free = snd_sc6000_free; in __snd_sc6000_probe()
609 err = snd_wss_create(card, mss_port[dev] + 4, -1, xirq, xdma, -1, in __snd_sc6000_probe()
633 snd_printk(KERN_ERR PFX "no OPL device at 0x%x-0x%x ?\n", in __snd_sc6000_probe()
643 mpu_irq[dev] = -1; in __snd_sc6000_probe()
648 snd_printk(KERN_ERR "no MPU-401 device at 0x%lx ?\n", in __snd_sc6000_probe()
652 strcpy(card->driver, DRV_NAME); in __snd_sc6000_probe()
653 strcpy(card->shortname, "SC-6000"); in __snd_sc6000_probe()
654 sprintf(card->longname, "Gallant SC-6000 at 0x%lx, irq %d, dma %d", in __snd_sc6000_probe()
675 .name = DRV_NAME,