1 /*********************************************************************
3 * Linux multisound pinnacle/fiji driver for ALSA.
5 * 2002/06/30 Karsten Wiese:
6 * for now this is only used to build a pinnacle / fiji driver.
7 * the OSS parent of this code is designed to also support
8 * the multisound classic via the file msnd_classic.c.
9 * to make it easier for some brave heart to implemt classic
10 * support in alsa, i left all the MSND_CLASSIC tokens in this file.
11 * but for now this untested & undone.
14 * ripped from linux kernel 2.4.18 by Karsten Wiese.
16 * the following is a copy of the 2.4.18 OSS FREE file-heading comment:
18 * Turtle Beach MultiSound Sound Card Driver for Linux
19 * msnd_pinnacle.c / msnd_classic.c
21 * -- If MSND_CLASSIC is defined:
23 * -> driver for Turtle Beach Classic/Monterey/Tahiti
27 * -> driver for Turtle Beach Pinnacle/Fiji
29 * 12-3-2000 Modified IO port validation Steve Sycamore
31 * Copyright (C) 1998 Andrew Veliath
33 * This program is free software; you can redistribute it and/or modify
34 * it under the terms of the GNU General Public License as published by
35 * the Free Software Foundation; either version 2 of the License, or
36 * (at your option) any later version.
38 * This program is distributed in the hope that it will be useful,
39 * but WITHOUT ANY WARRANTY; without even the implied warranty of
40 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
41 * GNU General Public License for more details.
43 * You should have received a copy of the GNU General Public License
44 * along with this program; if not, write to the Free Software
45 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
47 ********************************************************************/
49 #include <linux/kernel.h>
50 #include <linux/module.h>
51 #include <linux/interrupt.h>
52 #include <linux/types.h>
53 #include <linux/delay.h>
54 #include <linux/ioport.h>
55 #include <linux/firmware.h>
56 #include <linux/isa.h>
57 #include <linux/isapnp.h>
58 #include <linux/irq.h>
61 #include <sound/core.h>
62 #include <sound/initval.h>
63 #include <sound/asound.h>
64 #include <sound/pcm.h>
65 #include <sound/mpu401.h>
74 # include "msnd_classic.h"
75 # define LOGNAME "msnd_classic"
76 # define DEV_NAME "msnd-classic"
78 # include "msnd_pinnacle.h"
79 # define LOGNAME "snd_msnd_pinnacle"
80 # define DEV_NAME "msnd-pinnacle"
83 static void set_default_audio_parameters(struct snd_msnd
*chip
)
85 chip
->play_sample_size
= DEFSAMPLESIZE
;
86 chip
->play_sample_rate
= DEFSAMPLERATE
;
87 chip
->play_channels
= DEFCHANNELS
;
88 chip
->capture_sample_size
= DEFSAMPLESIZE
;
89 chip
->capture_sample_rate
= DEFSAMPLERATE
;
90 chip
->capture_channels
= DEFCHANNELS
;
93 static void snd_msnd_eval_dsp_msg(struct snd_msnd
*chip
, u16 wMessage
)
95 switch (HIBYTE(wMessage
)) {
96 case HIMT_PLAY_DONE
: {
97 if (chip
->banksPlayed
< 3)
98 snd_printdd("%08X: HIMT_PLAY_DONE: %i\n",
99 (unsigned)jiffies
, LOBYTE(wMessage
));
101 if (chip
->last_playbank
== LOBYTE(wMessage
)) {
102 snd_printdd("chip.last_playbank == LOBYTE(wMessage)\n");
107 if (test_bit(F_WRITING
, &chip
->flags
))
108 snd_msnd_DAPQ(chip
, 0);
110 chip
->last_playbank
= LOBYTE(wMessage
);
111 chip
->playDMAPos
+= chip
->play_period_bytes
;
112 if (chip
->playDMAPos
> chip
->playLimit
)
113 chip
->playDMAPos
= 0;
114 snd_pcm_period_elapsed(chip
->playback_substream
);
118 case HIMT_RECORD_DONE
:
119 if (chip
->last_recbank
== LOBYTE(wMessage
))
121 chip
->last_recbank
= LOBYTE(wMessage
);
122 chip
->captureDMAPos
+= chip
->capturePeriodBytes
;
123 if (chip
->captureDMAPos
> (chip
->captureLimit
))
124 chip
->captureDMAPos
= 0;
126 if (test_bit(F_READING
, &chip
->flags
))
127 snd_msnd_DARQ(chip
, chip
->last_recbank
);
129 snd_pcm_period_elapsed(chip
->capture_substream
);
133 switch (LOBYTE(wMessage
)) {
135 case HIDSP_PLAY_UNDER
:
137 case HIDSP_INT_PLAY_UNDER
:
138 snd_printd(KERN_WARNING LOGNAME
": Play underflow %i\n",
140 if (chip
->banksPlayed
> 2)
141 clear_bit(F_WRITING
, &chip
->flags
);
144 case HIDSP_INT_RECORD_OVER
:
145 snd_printd(KERN_WARNING LOGNAME
": Record overflow\n");
146 clear_bit(F_READING
, &chip
->flags
);
150 snd_printd(KERN_WARNING LOGNAME
151 ": DSP message %d 0x%02x\n",
152 LOBYTE(wMessage
), LOBYTE(wMessage
));
157 case HIMT_MIDI_IN_UCHAR
:
158 if (chip
->msndmidi_mpu
)
159 snd_msndmidi_input_read(chip
->msndmidi_mpu
);
163 snd_printd(KERN_WARNING LOGNAME
": HIMT message %d 0x%02x\n",
164 HIBYTE(wMessage
), HIBYTE(wMessage
));
169 static irqreturn_t
snd_msnd_interrupt(int irq
, void *dev_id
)
171 struct snd_msnd
*chip
= dev_id
;
172 void *pwDSPQData
= chip
->mappedbase
+ DSPQ_DATA_BUFF
;
173 u16 head
, tail
, size
;
175 /* Send ack to DSP */
176 /* inb(chip->io + HP_RXL); */
178 /* Evaluate queued DSP messages */
179 head
= readw(chip
->DSPQ
+ JQS_wHead
);
180 tail
= readw(chip
->DSPQ
+ JQS_wTail
);
181 size
= readw(chip
->DSPQ
+ JQS_wSize
);
182 if (head
> size
|| tail
> size
)
184 while (head
!= tail
) {
185 snd_msnd_eval_dsp_msg(chip
, readw(pwDSPQData
+ 2 * head
));
188 writew(head
, chip
->DSPQ
+ JQS_wHead
);
191 /* Send ack to DSP */
192 inb(chip
->io
+ HP_RXL
);
197 static int snd_msnd_reset_dsp(long io
, unsigned char *info
)
201 outb(HPDSPRESET_ON
, io
+ HP_DSPR
);
205 *info
= inb(io
+ HP_INFO
);
207 outb(HPDSPRESET_OFF
, io
+ HP_DSPR
);
209 while (timeout
-- > 0) {
210 if (inb(io
+ HP_CVR
) == HP_CVR_DEF
)
214 snd_printk(KERN_ERR LOGNAME
": Cannot reset DSP\n");
219 static int snd_msnd_probe(struct snd_card
*card
)
221 struct snd_msnd
*chip
= card
->private_data
;
224 char *xv
, *rev
= NULL
;
225 char *pin
= "TB Pinnacle", *fiji
= "TB Fiji";
226 char *pinfiji
= "TB Pinnacle/Fiji";
229 if (!request_region(chip
->io
, DSP_NUMIO
, "probing")) {
230 snd_printk(KERN_ERR LOGNAME
": I/O port conflict\n");
234 if (snd_msnd_reset_dsp(chip
->io
, &info
) < 0) {
235 release_region(chip
->io
, DSP_NUMIO
);
240 strcpy(card
->shortname
, "Classic/Tahiti/Monterey");
241 strcpy(card
->longname
, "Turtle Beach Multisound");
242 printk(KERN_INFO LOGNAME
": %s, "
243 "I/O 0x%lx-0x%lx, IRQ %d, memory mapped to 0x%lX-0x%lX\n",
245 chip
->io
, chip
->io
+ DSP_NUMIO
- 1,
247 chip
->base
, chip
->base
+ 0x7fff);
267 switch (info
& 0x7) {
270 strcpy(card
->shortname
, pin
);
274 strcpy(card
->shortname
, pin
);
278 strcpy(card
->shortname
, pin
);
282 strcpy(card
->shortname
, pin
);
286 strcpy(card
->shortname
, fiji
);
290 strcpy(card
->shortname
, fiji
);
294 strcpy(card
->shortname
, fiji
);
297 rev
= "A-B (Fiji) or A-E (Pinnacle)";
298 strcpy(card
->shortname
, pinfiji
);
301 strcpy(card
->longname
, "Turtle Beach Multisound Pinnacle");
302 printk(KERN_INFO LOGNAME
": %s revision %s, Xilinx version %s, "
303 "I/O 0x%lx-0x%lx, IRQ %d, memory mapped to 0x%lX-0x%lX\n",
306 chip
->io
, chip
->io
+ DSP_NUMIO
- 1,
308 chip
->base
, chip
->base
+ 0x7fff);
311 release_region(chip
->io
, DSP_NUMIO
);
315 static int snd_msnd_init_sma(struct snd_msnd
*chip
)
318 u16 mastVolLeft
, mastVolRight
;
322 outb(chip
->memid
, chip
->io
+ HP_MEMM
);
324 outb(HPBLKSEL_0
, chip
->io
+ HP_BLKS
);
325 /* Motorola 56k shared memory base */
326 chip
->SMA
= chip
->mappedbase
+ SMA_STRUCT_START
;
329 mastVolLeft
= readw(chip
->SMA
+ SMA_wCurrMastVolLeft
);
330 mastVolRight
= readw(chip
->SMA
+ SMA_wCurrMastVolRight
);
332 mastVolLeft
= mastVolRight
= 0;
333 memset_io(chip
->mappedbase
, 0, 0x8000);
335 /* Critical section: bank 1 access */
336 spin_lock_irqsave(&chip
->lock
, flags
);
337 outb(HPBLKSEL_1
, chip
->io
+ HP_BLKS
);
338 memset_io(chip
->mappedbase
, 0, 0x8000);
339 outb(HPBLKSEL_0
, chip
->io
+ HP_BLKS
);
340 spin_unlock_irqrestore(&chip
->lock
, flags
);
342 /* Digital audio play queue */
343 chip
->DAPQ
= chip
->mappedbase
+ DAPQ_OFFSET
;
344 snd_msnd_init_queue(chip
->DAPQ
, DAPQ_DATA_BUFF
, DAPQ_BUFF_SIZE
);
346 /* Digital audio record queue */
347 chip
->DARQ
= chip
->mappedbase
+ DARQ_OFFSET
;
348 snd_msnd_init_queue(chip
->DARQ
, DARQ_DATA_BUFF
, DARQ_BUFF_SIZE
);
351 chip
->MODQ
= chip
->mappedbase
+ MODQ_OFFSET
;
352 snd_msnd_init_queue(chip
->MODQ
, MODQ_DATA_BUFF
, MODQ_BUFF_SIZE
);
355 chip
->MIDQ
= chip
->mappedbase
+ MIDQ_OFFSET
;
356 snd_msnd_init_queue(chip
->MIDQ
, MIDQ_DATA_BUFF
, MIDQ_BUFF_SIZE
);
358 /* DSP -> host message queue */
359 chip
->DSPQ
= chip
->mappedbase
+ DSPQ_OFFSET
;
360 snd_msnd_init_queue(chip
->DSPQ
, DSPQ_DATA_BUFF
, DSPQ_BUFF_SIZE
);
362 /* Setup some DSP values */
364 writew(1, chip
->SMA
+ SMA_wCurrPlayFormat
);
365 writew(chip
->play_sample_size
, chip
->SMA
+ SMA_wCurrPlaySampleSize
);
366 writew(chip
->play_channels
, chip
->SMA
+ SMA_wCurrPlayChannels
);
367 writew(chip
->play_sample_rate
, chip
->SMA
+ SMA_wCurrPlaySampleRate
);
369 writew(chip
->play_sample_rate
, chip
->SMA
+ SMA_wCalFreqAtoD
);
370 writew(mastVolLeft
, chip
->SMA
+ SMA_wCurrMastVolLeft
);
371 writew(mastVolRight
, chip
->SMA
+ SMA_wCurrMastVolRight
);
373 writel(0x00010000, chip
->SMA
+ SMA_dwCurrPlayPitch
);
374 writel(0x00000001, chip
->SMA
+ SMA_dwCurrPlayRate
);
376 writew(0x303, chip
->SMA
+ SMA_wCurrInputTagBits
);
384 static int upload_dsp_code(struct snd_card
*card
)
386 struct snd_msnd
*chip
= card
->private_data
;
387 const struct firmware
*init_fw
= NULL
, *perm_fw
= NULL
;
390 outb(HPBLKSEL_0
, chip
->io
+ HP_BLKS
);
392 err
= request_firmware(&init_fw
, INITCODEFILE
, card
->dev
);
394 printk(KERN_ERR LOGNAME
": Error loading " INITCODEFILE
);
397 err
= request_firmware(&perm_fw
, PERMCODEFILE
, card
->dev
);
399 printk(KERN_ERR LOGNAME
": Error loading " PERMCODEFILE
);
403 memcpy_toio(chip
->mappedbase
, perm_fw
->data
, perm_fw
->size
);
404 if (snd_msnd_upload_host(chip
, init_fw
->data
, init_fw
->size
) < 0) {
405 printk(KERN_WARNING LOGNAME
": Error uploading to DSP\n");
409 printk(KERN_INFO LOGNAME
": DSP firmware uploaded\n");
413 release_firmware(perm_fw
);
415 release_firmware(init_fw
);
420 static void reset_proteus(struct snd_msnd
*chip
)
422 outb(HPPRORESET_ON
, chip
->io
+ HP_PROR
);
423 msleep(TIME_PRO_RESET
);
424 outb(HPPRORESET_OFF
, chip
->io
+ HP_PROR
);
425 msleep(TIME_PRO_RESET_DONE
);
429 static int snd_msnd_initialize(struct snd_card
*card
)
431 struct snd_msnd
*chip
= card
->private_data
;
435 outb(HPWAITSTATE_0
, chip
->io
+ HP_WAIT
);
436 outb(HPBITMODE_16
, chip
->io
+ HP_BITM
);
440 err
= snd_msnd_init_sma(chip
);
442 printk(KERN_WARNING LOGNAME
": Cannot initialize SMA\n");
446 err
= snd_msnd_reset_dsp(chip
->io
, NULL
);
450 err
= upload_dsp_code(card
);
452 printk(KERN_WARNING LOGNAME
": Cannot upload DSP code\n");
458 while (readw(chip
->mappedbase
)) {
461 snd_printd(KERN_ERR LOGNAME
": DSP reset timeout\n");
466 snd_msndmix_setup(chip
);
470 static int snd_msnd_dsp_full_reset(struct snd_card
*card
)
472 struct snd_msnd
*chip
= card
->private_data
;
475 if (test_bit(F_RESETTING
, &chip
->flags
) || ++chip
->nresets
> 10)
478 set_bit(F_RESETTING
, &chip
->flags
);
479 snd_msnd_dsp_halt(chip
, NULL
); /* Unconditionally halt */
481 rv
= snd_msnd_initialize(card
);
483 printk(KERN_WARNING LOGNAME
": DSP reset failed\n");
484 snd_msndmix_force_recsrc(chip
, 0);
485 clear_bit(F_RESETTING
, &chip
->flags
);
489 static int snd_msnd_dev_free(struct snd_device
*device
)
491 snd_printdd("snd_msnd_chip_free()\n");
495 static int snd_msnd_send_dsp_cmd_chk(struct snd_msnd
*chip
, u8 cmd
)
497 if (snd_msnd_send_dsp_cmd(chip
, cmd
) == 0)
499 snd_msnd_dsp_full_reset(chip
->card
);
500 return snd_msnd_send_dsp_cmd(chip
, cmd
);
503 static int snd_msnd_calibrate_adc(struct snd_msnd
*chip
, u16 srate
)
505 snd_printdd("snd_msnd_calibrate_adc(%i)\n", srate
);
506 writew(srate
, chip
->SMA
+ SMA_wCalFreqAtoD
);
507 if (chip
->calibrate_signal
== 0)
508 writew(readw(chip
->SMA
+ SMA_wCurrHostStatusFlags
)
509 | 0x0001, chip
->SMA
+ SMA_wCurrHostStatusFlags
);
511 writew(readw(chip
->SMA
+ SMA_wCurrHostStatusFlags
)
512 & ~0x0001, chip
->SMA
+ SMA_wCurrHostStatusFlags
);
513 if (snd_msnd_send_word(chip
, 0, 0, HDEXAR_CAL_A_TO_D
) == 0 &&
514 snd_msnd_send_dsp_cmd_chk(chip
, HDEX_AUX_REQ
) == 0) {
515 schedule_timeout_interruptible(msecs_to_jiffies(333));
518 printk(KERN_WARNING LOGNAME
": ADC calibration failed\n");
523 * ALSA callback function, called when attempting to open the MIDI device.
525 static int snd_msnd_mpu401_open(struct snd_mpu401
*mpu
)
527 snd_msnd_enable_irq(mpu
->private_data
);
528 snd_msnd_send_dsp_cmd(mpu
->private_data
, HDEX_MIDI_IN_START
);
532 static void snd_msnd_mpu401_close(struct snd_mpu401
*mpu
)
534 snd_msnd_send_dsp_cmd(mpu
->private_data
, HDEX_MIDI_IN_STOP
);
535 snd_msnd_disable_irq(mpu
->private_data
);
538 static long mpu_io
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
539 static int mpu_irq
[SNDRV_CARDS
] = SNDRV_DEFAULT_IRQ
;
541 static int snd_msnd_attach(struct snd_card
*card
)
543 struct snd_msnd
*chip
= card
->private_data
;
545 static struct snd_device_ops ops
= {
546 .dev_free
= snd_msnd_dev_free
,
549 err
= request_irq(chip
->irq
, snd_msnd_interrupt
, 0, card
->shortname
,
552 printk(KERN_ERR LOGNAME
": Couldn't grab IRQ %d\n", chip
->irq
);
555 if (request_region(chip
->io
, DSP_NUMIO
, card
->shortname
) == NULL
) {
556 free_irq(chip
->irq
, chip
);
560 if (!request_mem_region(chip
->base
, BUFFSIZE
, card
->shortname
)) {
561 printk(KERN_ERR LOGNAME
562 ": unable to grab memory region 0x%lx-0x%lx\n",
563 chip
->base
, chip
->base
+ BUFFSIZE
- 1);
564 release_region(chip
->io
, DSP_NUMIO
);
565 free_irq(chip
->irq
, chip
);
568 chip
->mappedbase
= ioremap_nocache(chip
->base
, 0x8000);
569 if (!chip
->mappedbase
) {
570 printk(KERN_ERR LOGNAME
571 ": unable to map memory region 0x%lx-0x%lx\n",
572 chip
->base
, chip
->base
+ BUFFSIZE
- 1);
574 goto err_release_region
;
577 err
= snd_msnd_dsp_full_reset(card
);
579 goto err_release_region
;
581 /* Register device */
582 err
= snd_device_new(card
, SNDRV_DEV_LOWLEVEL
, chip
, &ops
);
584 goto err_release_region
;
586 err
= snd_msnd_pcm(card
, 0);
588 printk(KERN_ERR LOGNAME
": error creating new PCM device\n");
589 goto err_release_region
;
592 err
= snd_msndmix_new(card
);
594 printk(KERN_ERR LOGNAME
": error creating new Mixer device\n");
595 goto err_release_region
;
599 if (mpu_io
[0] != SNDRV_AUTO_PORT
) {
600 struct snd_mpu401
*mpu
;
602 err
= snd_mpu401_uart_new(card
, 0, MPU401_HW_MPU401
,
609 printk(KERN_ERR LOGNAME
610 ": error creating new Midi device\n");
611 goto err_release_region
;
613 mpu
= chip
->rmidi
->private_data
;
615 mpu
->open_input
= snd_msnd_mpu401_open
;
616 mpu
->close_input
= snd_msnd_mpu401_close
;
617 mpu
->private_data
= chip
;
620 disable_irq(chip
->irq
);
621 snd_msnd_calibrate_adc(chip
, chip
->play_sample_rate
);
622 snd_msndmix_force_recsrc(chip
, 0);
624 err
= snd_card_register(card
);
626 goto err_release_region
;
631 iounmap(chip
->mappedbase
);
632 release_mem_region(chip
->base
, BUFFSIZE
);
633 release_region(chip
->io
, DSP_NUMIO
);
634 free_irq(chip
->irq
, chip
);
639 static void snd_msnd_unload(struct snd_card
*card
)
641 struct snd_msnd
*chip
= card
->private_data
;
643 iounmap(chip
->mappedbase
);
644 release_mem_region(chip
->base
, BUFFSIZE
);
645 release_region(chip
->io
, DSP_NUMIO
);
646 free_irq(chip
->irq
, chip
);
652 /* Pinnacle/Fiji Logical Device Configuration */
654 static int snd_msnd_write_cfg(int cfg
, int reg
, int value
)
657 outb(value
, cfg
+ 1);
658 if (value
!= inb(cfg
+ 1)) {
659 printk(KERN_ERR LOGNAME
": snd_msnd_write_cfg: I/O error\n");
665 static int snd_msnd_write_cfg_io0(int cfg
, int num
, u16 io
)
667 if (snd_msnd_write_cfg(cfg
, IREG_LOGDEVICE
, num
))
669 if (snd_msnd_write_cfg(cfg
, IREG_IO0_BASEHI
, HIBYTE(io
)))
671 if (snd_msnd_write_cfg(cfg
, IREG_IO0_BASELO
, LOBYTE(io
)))
676 static int snd_msnd_write_cfg_io1(int cfg
, int num
, u16 io
)
678 if (snd_msnd_write_cfg(cfg
, IREG_LOGDEVICE
, num
))
680 if (snd_msnd_write_cfg(cfg
, IREG_IO1_BASEHI
, HIBYTE(io
)))
682 if (snd_msnd_write_cfg(cfg
, IREG_IO1_BASELO
, LOBYTE(io
)))
687 static int snd_msnd_write_cfg_irq(int cfg
, int num
, u16 irq
)
689 if (snd_msnd_write_cfg(cfg
, IREG_LOGDEVICE
, num
))
691 if (snd_msnd_write_cfg(cfg
, IREG_IRQ_NUMBER
, LOBYTE(irq
)))
693 if (snd_msnd_write_cfg(cfg
, IREG_IRQ_TYPE
, IRQTYPE_EDGE
))
698 static int snd_msnd_write_cfg_mem(int cfg
, int num
, int mem
)
703 wmem
= (u16
)(mem
& 0xfff);
704 if (snd_msnd_write_cfg(cfg
, IREG_LOGDEVICE
, num
))
706 if (snd_msnd_write_cfg(cfg
, IREG_MEMBASEHI
, HIBYTE(wmem
)))
708 if (snd_msnd_write_cfg(cfg
, IREG_MEMBASELO
, LOBYTE(wmem
)))
710 if (wmem
&& snd_msnd_write_cfg(cfg
, IREG_MEMCONTROL
,
711 MEMTYPE_HIADDR
| MEMTYPE_16BIT
))
716 static int snd_msnd_activate_logical(int cfg
, int num
)
718 if (snd_msnd_write_cfg(cfg
, IREG_LOGDEVICE
, num
))
720 if (snd_msnd_write_cfg(cfg
, IREG_ACTIVATE
, LD_ACTIVATE
))
725 static int snd_msnd_write_cfg_logical(int cfg
, int num
, u16 io0
,
726 u16 io1
, u16 irq
, int mem
)
728 if (snd_msnd_write_cfg(cfg
, IREG_LOGDEVICE
, num
))
730 if (snd_msnd_write_cfg_io0(cfg
, num
, io0
))
732 if (snd_msnd_write_cfg_io1(cfg
, num
, io1
))
734 if (snd_msnd_write_cfg_irq(cfg
, num
, irq
))
736 if (snd_msnd_write_cfg_mem(cfg
, num
, mem
))
738 if (snd_msnd_activate_logical(cfg
, num
))
743 static int snd_msnd_pinnacle_cfg_reset(int cfg
)
747 /* Reset devices if told to */
748 printk(KERN_INFO LOGNAME
": Resetting all devices\n");
749 for (i
= 0; i
< 4; ++i
)
750 if (snd_msnd_write_cfg_logical(cfg
, i
, 0, 0, 0, 0))
757 static int index
[SNDRV_CARDS
] = SNDRV_DEFAULT_IDX
; /* Index 0-MAX */
758 static char *id
[SNDRV_CARDS
] = SNDRV_DEFAULT_STR
; /* ID for this card */
760 module_param_array(index
, int, NULL
, S_IRUGO
);
761 MODULE_PARM_DESC(index
, "Index value for msnd_pinnacle soundcard.");
762 module_param_array(id
, charp
, NULL
, S_IRUGO
);
763 MODULE_PARM_DESC(id
, "ID string for msnd_pinnacle soundcard.");
765 static long io
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
766 static int irq
[SNDRV_CARDS
] = SNDRV_DEFAULT_IRQ
;
767 static long mem
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
770 static long cfg
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
772 /* Extra Peripheral Configuration (Default: Disable) */
773 static long ide_io0
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
774 static long ide_io1
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
775 static int ide_irq
[SNDRV_CARDS
] = SNDRV_DEFAULT_IRQ
;
777 static long joystick_io
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
778 /* If we have the digital daugherboard... */
779 static int digital
[SNDRV_CARDS
];
781 /* Extra Peripheral Configuration */
782 static int reset
[SNDRV_CARDS
];
785 static int write_ndelay
[SNDRV_CARDS
] = { [0 ... (SNDRV_CARDS
-1)] = 1 };
787 static int calibrate_signal
;
790 static bool isapnp
[SNDRV_CARDS
] = SNDRV_DEFAULT_ENABLE_PNP
;
791 module_param_array(isapnp
, bool, NULL
, 0444);
792 MODULE_PARM_DESC(isapnp
, "ISA PnP detection for specified soundcard.");
793 #define has_isapnp(x) isapnp[x]
795 #define has_isapnp(x) 0
798 MODULE_AUTHOR("Karsten Wiese <annabellesgarden@yahoo.de>");
799 MODULE_DESCRIPTION("Turtle Beach " LONGNAME
" Linux Driver");
800 MODULE_LICENSE("GPL");
801 MODULE_FIRMWARE(INITCODEFILE
);
802 MODULE_FIRMWARE(PERMCODEFILE
);
804 module_param_hw_array(io
, long, ioport
, NULL
, S_IRUGO
);
805 MODULE_PARM_DESC(io
, "IO port #");
806 module_param_hw_array(irq
, int, irq
, NULL
, S_IRUGO
);
807 module_param_hw_array(mem
, long, iomem
, NULL
, S_IRUGO
);
808 module_param_array(write_ndelay
, int, NULL
, S_IRUGO
);
809 module_param(calibrate_signal
, int, S_IRUGO
);
811 module_param_array(digital
, int, NULL
, S_IRUGO
);
812 module_param_hw_array(cfg
, long, ioport
, NULL
, S_IRUGO
);
813 module_param_array(reset
, int, 0, S_IRUGO
);
814 module_param_hw_array(mpu_io
, long, ioport
, NULL
, S_IRUGO
);
815 module_param_hw_array(mpu_irq
, int, irq
, NULL
, S_IRUGO
);
816 module_param_hw_array(ide_io0
, long, ioport
, NULL
, S_IRUGO
);
817 module_param_hw_array(ide_io1
, long, ioport
, NULL
, S_IRUGO
);
818 module_param_hw_array(ide_irq
, int, irq
, NULL
, S_IRUGO
);
819 module_param_hw_array(joystick_io
, long, ioport
, NULL
, S_IRUGO
);
823 static int snd_msnd_isa_match(struct device
*pdev
, unsigned int i
)
825 if (io
[i
] == SNDRV_AUTO_PORT
)
828 if (irq
[i
] == SNDRV_AUTO_PORT
|| mem
[i
] == SNDRV_AUTO_PORT
) {
829 printk(KERN_WARNING LOGNAME
": io, irq and mem must be set\n");
834 if (!(io
[i
] == 0x290 ||
842 printk(KERN_ERR LOGNAME
": \"io\" - DSP I/O base must be set "
843 " to 0x210, 0x220, 0x230, 0x240, 0x250, 0x260, 0x290, "
848 if (io
[i
] < 0x100 || io
[i
] > 0x3e0 || (io
[i
] % 0x10) != 0) {
849 printk(KERN_ERR LOGNAME
850 ": \"io\" - DSP I/O base must within the range 0x100 "
851 "to 0x3E0 and must be evenly divisible by 0x10\n");
854 #endif /* MSND_CLASSIC */
862 printk(KERN_ERR LOGNAME
863 ": \"irq\" - must be set to 5, 7, 9, 10, 11 or 12\n");
867 if (!(mem
[i
] == 0xb0000 ||
872 mem
[i
] == 0xe8000)) {
873 printk(KERN_ERR LOGNAME
": \"mem\" - must be set to "
874 "0xb0000, 0xc8000, 0xd0000, 0xd8000, 0xe0000 or "
880 if (cfg
[i
] == SNDRV_AUTO_PORT
) {
881 printk(KERN_INFO LOGNAME
": Assuming PnP mode\n");
882 } else if (cfg
[i
] != 0x250 && cfg
[i
] != 0x260 && cfg
[i
] != 0x270) {
883 printk(KERN_INFO LOGNAME
884 ": Config port must be 0x250, 0x260 or 0x270 "
885 "(or unspecified for PnP mode)\n");
888 #endif /* MSND_CLASSIC */
893 static int snd_msnd_isa_probe(struct device
*pdev
, unsigned int idx
)
896 struct snd_card
*card
;
897 struct snd_msnd
*chip
;
901 || cfg
[idx
] == SNDRV_AUTO_PORT
904 printk(KERN_INFO LOGNAME
": Assuming PnP mode\n");
908 err
= snd_card_new(pdev
, index
[idx
], id
[idx
], THIS_MODULE
,
909 sizeof(struct snd_msnd
), &card
);
913 chip
= card
->private_data
;
919 chip
->irqid
= HPIRQ_5
; break;
921 chip
->irqid
= HPIRQ_7
; break;
923 chip
->irqid
= HPIRQ_9
; break;
925 chip
->irqid
= HPIRQ_10
; break;
927 chip
->irqid
= HPIRQ_11
; break;
929 chip
->irqid
= HPIRQ_12
; break;
934 chip
->memid
= HPMEM_B000
; break;
936 chip
->memid
= HPMEM_C800
; break;
938 chip
->memid
= HPMEM_D000
; break;
940 chip
->memid
= HPMEM_D800
; break;
942 chip
->memid
= HPMEM_E000
; break;
944 chip
->memid
= HPMEM_E800
; break;
947 printk(KERN_INFO LOGNAME
": Non-PnP mode: configuring at port 0x%lx\n",
950 if (!request_region(cfg
[idx
], 2, "Pinnacle/Fiji Config")) {
951 printk(KERN_ERR LOGNAME
": Config port 0x%lx conflict\n",
957 if (snd_msnd_pinnacle_cfg_reset(cfg
[idx
])) {
963 err
= snd_msnd_write_cfg_logical(cfg
[idx
], 0,
970 /* The following are Pinnacle specific */
973 if (mpu_io
[idx
] != SNDRV_AUTO_PORT
974 && mpu_irq
[idx
] != SNDRV_AUTO_IRQ
) {
975 printk(KERN_INFO LOGNAME
976 ": Configuring MPU to I/O 0x%lx IRQ %d\n",
977 mpu_io
[idx
], mpu_irq
[idx
]);
978 err
= snd_msnd_write_cfg_logical(cfg
[idx
], 1,
987 if (ide_io0
[idx
] != SNDRV_AUTO_PORT
988 && ide_io1
[idx
] != SNDRV_AUTO_PORT
989 && ide_irq
[idx
] != SNDRV_AUTO_IRQ
) {
990 printk(KERN_INFO LOGNAME
991 ": Configuring IDE to I/O 0x%lx, 0x%lx IRQ %d\n",
992 ide_io0
[idx
], ide_io1
[idx
], ide_irq
[idx
]);
993 err
= snd_msnd_write_cfg_logical(cfg
[idx
], 2,
994 ide_io0
[idx
], ide_io1
[idx
],
1002 if (joystick_io
[idx
] != SNDRV_AUTO_PORT
) {
1003 printk(KERN_INFO LOGNAME
1004 ": Configuring joystick to I/O 0x%lx\n",
1006 err
= snd_msnd_write_cfg_logical(cfg
[idx
], 3,
1007 joystick_io
[idx
], 0,
1013 release_region(cfg
[idx
], 2);
1015 #endif /* MSND_CLASSIC */
1017 set_default_audio_parameters(chip
);
1019 chip
->type
= msndClassic
;
1021 chip
->type
= msndPinnacle
;
1024 chip
->irq
= irq
[idx
];
1025 chip
->base
= mem
[idx
];
1027 chip
->calibrate_signal
= calibrate_signal
? 1 : 0;
1029 chip
->dspq_data_buff
= DSPQ_DATA_BUFF
;
1030 chip
->dspq_buff_size
= DSPQ_BUFF_SIZE
;
1031 if (write_ndelay
[idx
])
1032 clear_bit(F_DISABLE_WRITE_NDELAY
, &chip
->flags
);
1034 set_bit(F_DISABLE_WRITE_NDELAY
, &chip
->flags
);
1035 #ifndef MSND_CLASSIC
1037 set_bit(F_HAVEDIGITAL
, &chip
->flags
);
1039 spin_lock_init(&chip
->lock
);
1040 err
= snd_msnd_probe(card
);
1042 printk(KERN_ERR LOGNAME
": Probe failed\n");
1043 snd_card_free(card
);
1047 err
= snd_msnd_attach(card
);
1049 printk(KERN_ERR LOGNAME
": Attach failed\n");
1050 snd_card_free(card
);
1053 dev_set_drvdata(pdev
, card
);
1057 #ifndef MSND_CLASSIC
1059 release_region(cfg
[idx
], 2);
1060 snd_card_free(card
);
1065 static int snd_msnd_isa_remove(struct device
*pdev
, unsigned int dev
)
1067 snd_msnd_unload(dev_get_drvdata(pdev
));
1071 static struct isa_driver snd_msnd_driver
= {
1072 .match
= snd_msnd_isa_match
,
1073 .probe
= snd_msnd_isa_probe
,
1074 .remove
= snd_msnd_isa_remove
,
1075 /* FIXME: suspend, resume */
1082 static int snd_msnd_pnp_detect(struct pnp_card_link
*pcard
,
1083 const struct pnp_card_device_id
*pid
)
1086 struct pnp_dev
*pnp_dev
;
1087 struct pnp_dev
*mpu_dev
;
1088 struct snd_card
*card
;
1089 struct snd_msnd
*chip
;
1092 for ( ; idx
< SNDRV_CARDS
; idx
++) {
1093 if (has_isapnp(idx
))
1096 if (idx
>= SNDRV_CARDS
)
1100 * Check that we still have room for another sound card ...
1102 pnp_dev
= pnp_request_card_device(pcard
, pid
->devs
[0].id
, NULL
);
1106 mpu_dev
= pnp_request_card_device(pcard
, pid
->devs
[1].id
, NULL
);
1110 if (!pnp_is_active(pnp_dev
) && pnp_activate_dev(pnp_dev
) < 0) {
1111 printk(KERN_INFO
"msnd_pinnacle: device is inactive\n");
1115 if (!pnp_is_active(mpu_dev
) && pnp_activate_dev(mpu_dev
) < 0) {
1116 printk(KERN_INFO
"msnd_pinnacle: MPU device is inactive\n");
1121 * Create a new ALSA sound card entry, in anticipation
1122 * of detecting our hardware ...
1124 ret
= snd_card_new(&pcard
->card
->dev
,
1125 index
[idx
], id
[idx
], THIS_MODULE
,
1126 sizeof(struct snd_msnd
), &card
);
1130 chip
= card
->private_data
;
1134 * Read the correct parameters off the ISA PnP bus ...
1136 io
[idx
] = pnp_port_start(pnp_dev
, 0);
1137 irq
[idx
] = pnp_irq(pnp_dev
, 0);
1138 mem
[idx
] = pnp_mem_start(pnp_dev
, 0);
1139 mpu_io
[idx
] = pnp_port_start(mpu_dev
, 0);
1140 mpu_irq
[idx
] = pnp_irq(mpu_dev
, 0);
1142 set_default_audio_parameters(chip
);
1144 chip
->type
= msndClassic
;
1146 chip
->type
= msndPinnacle
;
1149 chip
->irq
= irq
[idx
];
1150 chip
->base
= mem
[idx
];
1152 chip
->calibrate_signal
= calibrate_signal
? 1 : 0;
1154 chip
->dspq_data_buff
= DSPQ_DATA_BUFF
;
1155 chip
->dspq_buff_size
= DSPQ_BUFF_SIZE
;
1156 if (write_ndelay
[idx
])
1157 clear_bit(F_DISABLE_WRITE_NDELAY
, &chip
->flags
);
1159 set_bit(F_DISABLE_WRITE_NDELAY
, &chip
->flags
);
1160 #ifndef MSND_CLASSIC
1162 set_bit(F_HAVEDIGITAL
, &chip
->flags
);
1164 spin_lock_init(&chip
->lock
);
1165 ret
= snd_msnd_probe(card
);
1167 printk(KERN_ERR LOGNAME
": Probe failed\n");
1171 ret
= snd_msnd_attach(card
);
1173 printk(KERN_ERR LOGNAME
": Attach failed\n");
1177 pnp_set_card_drvdata(pcard
, card
);
1182 snd_card_free(card
);
1186 static void snd_msnd_pnp_remove(struct pnp_card_link
*pcard
)
1188 snd_msnd_unload(pnp_get_card_drvdata(pcard
));
1189 pnp_set_card_drvdata(pcard
, NULL
);
1192 static int isa_registered
;
1193 static int pnp_registered
;
1195 static struct pnp_card_device_id msnd_pnpids
[] = {
1197 { .id
= "BVJ0440", .devs
= { { "TBS0000" }, { "TBS0001" } } },
1198 { .id
= "" } /* end */
1201 MODULE_DEVICE_TABLE(pnp_card
, msnd_pnpids
);
1203 static struct pnp_card_driver msnd_pnpc_driver
= {
1204 .flags
= PNP_DRIVER_RES_DO_NOT_CHANGE
,
1205 .name
= "msnd_pinnacle",
1206 .id_table
= msnd_pnpids
,
1207 .probe
= snd_msnd_pnp_detect
,
1208 .remove
= snd_msnd_pnp_remove
,
1210 #endif /* CONFIG_PNP */
1212 static int __init
snd_msnd_init(void)
1216 err
= isa_register_driver(&snd_msnd_driver
, SNDRV_CARDS
);
1221 err
= pnp_register_card_driver(&msnd_pnpc_driver
);
1231 static void __exit
snd_msnd_exit(void)
1235 pnp_unregister_card_driver(&msnd_pnpc_driver
);
1238 isa_unregister_driver(&snd_msnd_driver
);
1241 module_init(snd_msnd_init
);
1242 module_exit(snd_msnd_exit
);