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");
32 MODULE_SUPPORTED_DEVICE("{{Gallant, SC-6000},"
33 "{AudioExcel, Audio Excel DSP 16},"
36 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
46 static bool joystick[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = false };
49 MODULE_PARM_DESC(index, "Index value for sc-6000 based soundcard.");
51 MODULE_PARM_DESC(id, "ID string for sc-6000 based soundcard.");
53 MODULE_PARM_DESC(enable, "Enable sc-6000 based soundcard.");
55 MODULE_PARM_DESC(port, "Port # for sc-6000 driver.");
57 MODULE_PARM_DESC(mss_port, "MSS Port # for sc-6000 driver.");
59 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for sc-6000 driver.");
61 MODULE_PARM_DESC(irq, "IRQ # for sc-6000 driver.");
63 MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for sc-6000 driver.");
65 MODULE_PARM_DESC(dma, "DMA # for sc-6000 driver.");
70 * Commands of SC6000's DSP (SBPRO+special).
73 #define WRITE_MDIRQ_CFG 0x50 /* Set M&I&DRQ mask (the real config) */
75 #define READ_HARD_CFG 0x58 /* Read Hardware Config (I/O base etc) */
84 #define GET_DSP_VERSION 0xe1 /* Get DSP Version */
85 #define GET_DSP_COPYRIGHT 0xe3 /* Get DSP Copyright */
88 * Offsets of SC6000 DSP I/O ports. The offset is added to base I/O port
93 * (w-) == Write
94 * (r-) == Read
96 #define DSP_RESET 0x06 /* offset of DSP RESET (wo) */
97 #define DSP_READ 0x0a /* offset of DSP READ (ro) */
98 #define DSP_WRITE 0x0c /* offset of DSP WRITE (w-) */
99 #define DSP_COMMAND 0x0c /* offset of DSP COMMAND (w-) */
100 #define DSP_STATUS 0x0c /* offset of DSP STATUS (r-) */
101 #define DSP_DATAVAIL 0x0e /* offset of DSP DATA AVAILABLE (ro) */
104 #define DRV_NAME "SC-6000"
109 * sc6000_irq_to_softcfg - Decode irq number into cfg code.
138 * sc6000_dma_to_softcfg - Decode dma number into cfg code.
161 * sc6000_mpu_irq_to_softcfg - Decode MPU-401 irq number into cfg code.
196 } while (loop--); in sc6000_wait_data()
198 return -EAGAIN; in sc6000_wait_data()
204 return -EBUSY; in sc6000_read()
218 * DSP ready to receive data if bit 7 of val == 0 in sc6000_write()
225 } while (loop--); in sc6000_write()
227 snd_printk(KERN_ERR "DSP Command (0x%x) timeout.\n", cmd); in sc6000_write()
229 return -EIO; in sc6000_write()
239 return -EIO; in sc6000_dsp_get_answer()
256 return len ? len : -EIO; in sc6000_dsp_get_answer()
267 return -ENODEV; in sc6000_dsp_reset()
275 return -EIO; in sc6000_hw_cfg_write()
279 return -EIO; in sc6000_hw_cfg_write()
283 return -EIO; in sc6000_hw_cfg_write()
287 return -EIO; in sc6000_hw_cfg_write()
291 return -EIO; in sc6000_hw_cfg_write()
302 return -EIO; in sc6000_cfg_write()
306 return -EIO; in sc6000_cfg_write()
311 static int sc6000_setup_board(char __iomem *vport, int config) in sc6000_setup_board() argument
319 return -EIO; in sc6000_setup_board()
321 } while ((sc6000_wait_data(vport) < 0) && loop--); in sc6000_setup_board()
326 return -EIO; in sc6000_setup_board()
329 if (sc6000_cfg_write(vport, config)) in sc6000_setup_board()
330 return -ENODEV; in sc6000_setup_board()
335 static int sc6000_init_mss(char __iomem *vport, int config, in sc6000_init_mss() argument
341 return -EIO; in sc6000_init_mss()
346 if (sc6000_cfg_write(vport, config)) in sc6000_init_mss()
347 return -EIO; in sc6000_init_mss()
383 int config = mss_config | in sc6000_init_board() local
398 return -ENODEV; in sc6000_init_board()
401 * My SC-6000 card return "SC-6000" in DSPCopyright, so in sc6000_init_board()
404 if (strncmp("SC-6000", answer, 7)) in sc6000_init_board()
405 snd_printk(KERN_WARNING "Warning: non SC-6000 audio card!\n"); in sc6000_init_board()
409 return -ENODEV; in sc6000_init_board()
411 printk(KERN_INFO PFX "Detected model: %s, DSP version %d.%d\n", in sc6000_init_board()
425 return -EIO; in sc6000_init_board()
428 err = sc6000_setup_board(vport, config); in sc6000_init_board()
431 return -ENODEV; in sc6000_init_board()
442 err = sc6000_setup_board(vport, config); in sc6000_init_board()
445 return -ENODEV; in sc6000_init_board()
447 err = sc6000_init_mss(vport, config, vmss_port, mss_config); in sc6000_init_board()
451 return -ENODEV; in sc6000_init_board()
459 struct snd_card *card = chip->card; in snd_sc6000_mixer()
468 strcpy(id1.name, "Aux Playback Switch"); in snd_sc6000_mixer()
469 strcpy(id2.name, "FM Playback Switch"); in snd_sc6000_mixer()
473 strcpy(id1.name, "Aux Playback Volume"); in snd_sc6000_mixer()
474 strcpy(id2.name, "FM Playback Volume"); in snd_sc6000_mixer()
479 strcpy(id1.name, "Aux Playback Switch"); id1.index = 1; in snd_sc6000_mixer()
480 strcpy(id2.name, "CD Playback Switch"); in snd_sc6000_mixer()
484 strcpy(id1.name, "Aux Playback Volume"); in snd_sc6000_mixer()
485 strcpy(id2.name, "CD Playback Volume"); in snd_sc6000_mixer()
522 printk(KERN_ERR PFX "invalid MPU-401 port %lx\n", in snd_sc6000_match()
529 printk(KERN_ERR PFX "invalid MPU-401 IRQ %d\n", mpu_irq[dev]); in snd_sc6000_match()
537 static const int possible_irqs[] = { 5, 7, 9, 10, 11, -1 }; in snd_sc6000_probe()
538 static const int possible_dmas[] = { 1, 3, 0, -1 }; in snd_sc6000_probe()
554 vport = card->private_data; in snd_sc6000_probe()
559 err = -EBUSY; in snd_sc6000_probe()
568 err = -EBUSY; in snd_sc6000_probe()
576 err = -EBUSY; in snd_sc6000_probe()
583 err = -EBUSY; in snd_sc6000_probe()
590 "SC-6000 port I/O port region is already in use.\n"); in snd_sc6000_probe()
591 err = -EBUSY; in snd_sc6000_probe()
598 err = -EBUSY; in snd_sc6000_probe()
610 err = snd_wss_create(card, mss_port[dev] + 4, -1, xirq, xdma, -1, in snd_sc6000_probe()
634 snd_printk(KERN_ERR PFX "no OPL device at 0x%x-0x%x ?\n", in snd_sc6000_probe()
644 mpu_irq[dev] = -1; in snd_sc6000_probe()
649 snd_printk(KERN_ERR "no MPU-401 device at 0x%lx ?\n", in snd_sc6000_probe()
653 strcpy(card->driver, DRV_NAME); in snd_sc6000_probe()
654 strcpy(card->shortname, "SC-6000"); in snd_sc6000_probe()
655 sprintf(card->longname, "Gallant SC-6000 at 0x%lx, irq %d, dma %d", in snd_sc6000_probe()
678 char __iomem **vport = card->private_data; in snd_sc6000_remove()
696 .name = DRV_NAME,