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
;
174 /* Send ack to DSP */
175 /* inb(chip->io + HP_RXL); */
177 /* Evaluate queued DSP messages */
178 while (readw(chip
->DSPQ
+ JQS_wTail
) != readw(chip
->DSPQ
+ JQS_wHead
)) {
181 snd_msnd_eval_dsp_msg(chip
,
182 readw(pwDSPQData
+ 2 * readw(chip
->DSPQ
+ JQS_wHead
)));
184 wTmp
= readw(chip
->DSPQ
+ JQS_wHead
) + 1;
185 if (wTmp
> readw(chip
->DSPQ
+ JQS_wSize
))
186 writew(0, chip
->DSPQ
+ JQS_wHead
);
188 writew(wTmp
, chip
->DSPQ
+ JQS_wHead
);
190 /* Send ack to DSP */
191 inb(chip
->io
+ HP_RXL
);
196 static int snd_msnd_reset_dsp(long io
, unsigned char *info
)
200 outb(HPDSPRESET_ON
, io
+ HP_DSPR
);
204 *info
= inb(io
+ HP_INFO
);
206 outb(HPDSPRESET_OFF
, io
+ HP_DSPR
);
208 while (timeout
-- > 0) {
209 if (inb(io
+ HP_CVR
) == HP_CVR_DEF
)
213 snd_printk(KERN_ERR LOGNAME
": Cannot reset DSP\n");
218 static int snd_msnd_probe(struct snd_card
*card
)
220 struct snd_msnd
*chip
= card
->private_data
;
223 char *xv
, *rev
= NULL
;
224 char *pin
= "TB Pinnacle", *fiji
= "TB Fiji";
225 char *pinfiji
= "TB Pinnacle/Fiji";
228 if (!request_region(chip
->io
, DSP_NUMIO
, "probing")) {
229 snd_printk(KERN_ERR LOGNAME
": I/O port conflict\n");
233 if (snd_msnd_reset_dsp(chip
->io
, &info
) < 0) {
234 release_region(chip
->io
, DSP_NUMIO
);
239 strcpy(card
->shortname
, "Classic/Tahiti/Monterey");
240 strcpy(card
->longname
, "Turtle Beach Multisound");
241 printk(KERN_INFO LOGNAME
": %s, "
242 "I/O 0x%lx-0x%lx, IRQ %d, memory mapped to 0x%lX-0x%lX\n",
244 chip
->io
, chip
->io
+ DSP_NUMIO
- 1,
246 chip
->base
, chip
->base
+ 0x7fff);
266 switch (info
& 0x7) {
269 strcpy(card
->shortname
, pin
);
273 strcpy(card
->shortname
, pin
);
277 strcpy(card
->shortname
, pin
);
281 strcpy(card
->shortname
, pin
);
285 strcpy(card
->shortname
, fiji
);
289 strcpy(card
->shortname
, fiji
);
293 strcpy(card
->shortname
, fiji
);
296 rev
= "A-B (Fiji) or A-E (Pinnacle)";
297 strcpy(card
->shortname
, pinfiji
);
300 strcpy(card
->longname
, "Turtle Beach Multisound Pinnacle");
301 printk(KERN_INFO LOGNAME
": %s revision %s, Xilinx version %s, "
302 "I/O 0x%lx-0x%lx, IRQ %d, memory mapped to 0x%lX-0x%lX\n",
305 chip
->io
, chip
->io
+ DSP_NUMIO
- 1,
307 chip
->base
, chip
->base
+ 0x7fff);
310 release_region(chip
->io
, DSP_NUMIO
);
314 static int snd_msnd_init_sma(struct snd_msnd
*chip
)
317 u16 mastVolLeft
, mastVolRight
;
321 outb(chip
->memid
, chip
->io
+ HP_MEMM
);
323 outb(HPBLKSEL_0
, chip
->io
+ HP_BLKS
);
324 /* Motorola 56k shared memory base */
325 chip
->SMA
= chip
->mappedbase
+ SMA_STRUCT_START
;
328 mastVolLeft
= readw(chip
->SMA
+ SMA_wCurrMastVolLeft
);
329 mastVolRight
= readw(chip
->SMA
+ SMA_wCurrMastVolRight
);
331 mastVolLeft
= mastVolRight
= 0;
332 memset_io(chip
->mappedbase
, 0, 0x8000);
334 /* Critical section: bank 1 access */
335 spin_lock_irqsave(&chip
->lock
, flags
);
336 outb(HPBLKSEL_1
, chip
->io
+ HP_BLKS
);
337 memset_io(chip
->mappedbase
, 0, 0x8000);
338 outb(HPBLKSEL_0
, chip
->io
+ HP_BLKS
);
339 spin_unlock_irqrestore(&chip
->lock
, flags
);
341 /* Digital audio play queue */
342 chip
->DAPQ
= chip
->mappedbase
+ DAPQ_OFFSET
;
343 snd_msnd_init_queue(chip
->DAPQ
, DAPQ_DATA_BUFF
, DAPQ_BUFF_SIZE
);
345 /* Digital audio record queue */
346 chip
->DARQ
= chip
->mappedbase
+ DARQ_OFFSET
;
347 snd_msnd_init_queue(chip
->DARQ
, DARQ_DATA_BUFF
, DARQ_BUFF_SIZE
);
350 chip
->MODQ
= chip
->mappedbase
+ MODQ_OFFSET
;
351 snd_msnd_init_queue(chip
->MODQ
, MODQ_DATA_BUFF
, MODQ_BUFF_SIZE
);
354 chip
->MIDQ
= chip
->mappedbase
+ MIDQ_OFFSET
;
355 snd_msnd_init_queue(chip
->MIDQ
, MIDQ_DATA_BUFF
, MIDQ_BUFF_SIZE
);
357 /* DSP -> host message queue */
358 chip
->DSPQ
= chip
->mappedbase
+ DSPQ_OFFSET
;
359 snd_msnd_init_queue(chip
->DSPQ
, DSPQ_DATA_BUFF
, DSPQ_BUFF_SIZE
);
361 /* Setup some DSP values */
363 writew(1, chip
->SMA
+ SMA_wCurrPlayFormat
);
364 writew(chip
->play_sample_size
, chip
->SMA
+ SMA_wCurrPlaySampleSize
);
365 writew(chip
->play_channels
, chip
->SMA
+ SMA_wCurrPlayChannels
);
366 writew(chip
->play_sample_rate
, chip
->SMA
+ SMA_wCurrPlaySampleRate
);
368 writew(chip
->play_sample_rate
, chip
->SMA
+ SMA_wCalFreqAtoD
);
369 writew(mastVolLeft
, chip
->SMA
+ SMA_wCurrMastVolLeft
);
370 writew(mastVolRight
, chip
->SMA
+ SMA_wCurrMastVolRight
);
372 writel(0x00010000, chip
->SMA
+ SMA_dwCurrPlayPitch
);
373 writel(0x00000001, chip
->SMA
+ SMA_dwCurrPlayRate
);
375 writew(0x303, chip
->SMA
+ SMA_wCurrInputTagBits
);
383 static int upload_dsp_code(struct snd_card
*card
)
385 struct snd_msnd
*chip
= card
->private_data
;
386 const struct firmware
*init_fw
= NULL
, *perm_fw
= NULL
;
389 outb(HPBLKSEL_0
, chip
->io
+ HP_BLKS
);
391 err
= request_firmware(&init_fw
, INITCODEFILE
, card
->dev
);
393 printk(KERN_ERR LOGNAME
": Error loading " INITCODEFILE
);
396 err
= request_firmware(&perm_fw
, PERMCODEFILE
, card
->dev
);
398 printk(KERN_ERR LOGNAME
": Error loading " PERMCODEFILE
);
402 memcpy_toio(chip
->mappedbase
, perm_fw
->data
, perm_fw
->size
);
403 if (snd_msnd_upload_host(chip
, init_fw
->data
, init_fw
->size
) < 0) {
404 printk(KERN_WARNING LOGNAME
": Error uploading to DSP\n");
408 printk(KERN_INFO LOGNAME
": DSP firmware uploaded\n");
412 release_firmware(perm_fw
);
414 release_firmware(init_fw
);
419 static void reset_proteus(struct snd_msnd
*chip
)
421 outb(HPPRORESET_ON
, chip
->io
+ HP_PROR
);
422 msleep(TIME_PRO_RESET
);
423 outb(HPPRORESET_OFF
, chip
->io
+ HP_PROR
);
424 msleep(TIME_PRO_RESET_DONE
);
428 static int snd_msnd_initialize(struct snd_card
*card
)
430 struct snd_msnd
*chip
= card
->private_data
;
434 outb(HPWAITSTATE_0
, chip
->io
+ HP_WAIT
);
435 outb(HPBITMODE_16
, chip
->io
+ HP_BITM
);
439 err
= snd_msnd_init_sma(chip
);
441 printk(KERN_WARNING LOGNAME
": Cannot initialize SMA\n");
445 err
= snd_msnd_reset_dsp(chip
->io
, NULL
);
449 err
= upload_dsp_code(card
);
451 printk(KERN_WARNING LOGNAME
": Cannot upload DSP code\n");
457 while (readw(chip
->mappedbase
)) {
460 snd_printd(KERN_ERR LOGNAME
": DSP reset timeout\n");
465 snd_msndmix_setup(chip
);
469 static int snd_msnd_dsp_full_reset(struct snd_card
*card
)
471 struct snd_msnd
*chip
= card
->private_data
;
474 if (test_bit(F_RESETTING
, &chip
->flags
) || ++chip
->nresets
> 10)
477 set_bit(F_RESETTING
, &chip
->flags
);
478 snd_msnd_dsp_halt(chip
, NULL
); /* Unconditionally halt */
480 rv
= snd_msnd_initialize(card
);
482 printk(KERN_WARNING LOGNAME
": DSP reset failed\n");
483 snd_msndmix_force_recsrc(chip
, 0);
484 clear_bit(F_RESETTING
, &chip
->flags
);
488 static int snd_msnd_dev_free(struct snd_device
*device
)
490 snd_printdd("snd_msnd_chip_free()\n");
494 static int snd_msnd_send_dsp_cmd_chk(struct snd_msnd
*chip
, u8 cmd
)
496 if (snd_msnd_send_dsp_cmd(chip
, cmd
) == 0)
498 snd_msnd_dsp_full_reset(chip
->card
);
499 return snd_msnd_send_dsp_cmd(chip
, cmd
);
502 static int snd_msnd_calibrate_adc(struct snd_msnd
*chip
, u16 srate
)
504 snd_printdd("snd_msnd_calibrate_adc(%i)\n", srate
);
505 writew(srate
, chip
->SMA
+ SMA_wCalFreqAtoD
);
506 if (chip
->calibrate_signal
== 0)
507 writew(readw(chip
->SMA
+ SMA_wCurrHostStatusFlags
)
508 | 0x0001, chip
->SMA
+ SMA_wCurrHostStatusFlags
);
510 writew(readw(chip
->SMA
+ SMA_wCurrHostStatusFlags
)
511 & ~0x0001, chip
->SMA
+ SMA_wCurrHostStatusFlags
);
512 if (snd_msnd_send_word(chip
, 0, 0, HDEXAR_CAL_A_TO_D
) == 0 &&
513 snd_msnd_send_dsp_cmd_chk(chip
, HDEX_AUX_REQ
) == 0) {
514 schedule_timeout_interruptible(msecs_to_jiffies(333));
517 printk(KERN_WARNING LOGNAME
": ADC calibration failed\n");
522 * ALSA callback function, called when attempting to open the MIDI device.
524 static int snd_msnd_mpu401_open(struct snd_mpu401
*mpu
)
526 snd_msnd_enable_irq(mpu
->private_data
);
527 snd_msnd_send_dsp_cmd(mpu
->private_data
, HDEX_MIDI_IN_START
);
531 static void snd_msnd_mpu401_close(struct snd_mpu401
*mpu
)
533 snd_msnd_send_dsp_cmd(mpu
->private_data
, HDEX_MIDI_IN_STOP
);
534 snd_msnd_disable_irq(mpu
->private_data
);
537 static long mpu_io
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
538 static int mpu_irq
[SNDRV_CARDS
] = SNDRV_DEFAULT_IRQ
;
540 static int snd_msnd_attach(struct snd_card
*card
)
542 struct snd_msnd
*chip
= card
->private_data
;
544 static struct snd_device_ops ops
= {
545 .dev_free
= snd_msnd_dev_free
,
548 err
= request_irq(chip
->irq
, snd_msnd_interrupt
, 0, card
->shortname
,
551 printk(KERN_ERR LOGNAME
": Couldn't grab IRQ %d\n", chip
->irq
);
554 if (request_region(chip
->io
, DSP_NUMIO
, card
->shortname
) == NULL
) {
555 free_irq(chip
->irq
, chip
);
559 if (!request_mem_region(chip
->base
, BUFFSIZE
, card
->shortname
)) {
560 printk(KERN_ERR LOGNAME
561 ": unable to grab memory region 0x%lx-0x%lx\n",
562 chip
->base
, chip
->base
+ BUFFSIZE
- 1);
563 release_region(chip
->io
, DSP_NUMIO
);
564 free_irq(chip
->irq
, chip
);
567 chip
->mappedbase
= ioremap_nocache(chip
->base
, 0x8000);
568 if (!chip
->mappedbase
) {
569 printk(KERN_ERR LOGNAME
570 ": unable to map memory region 0x%lx-0x%lx\n",
571 chip
->base
, chip
->base
+ BUFFSIZE
- 1);
573 goto err_release_region
;
576 err
= snd_msnd_dsp_full_reset(card
);
578 goto err_release_region
;
580 /* Register device */
581 err
= snd_device_new(card
, SNDRV_DEV_LOWLEVEL
, chip
, &ops
);
583 goto err_release_region
;
585 err
= snd_msnd_pcm(card
, 0);
587 printk(KERN_ERR LOGNAME
": error creating new PCM device\n");
588 goto err_release_region
;
591 err
= snd_msndmix_new(card
);
593 printk(KERN_ERR LOGNAME
": error creating new Mixer device\n");
594 goto err_release_region
;
598 if (mpu_io
[0] != SNDRV_AUTO_PORT
) {
599 struct snd_mpu401
*mpu
;
601 err
= snd_mpu401_uart_new(card
, 0, MPU401_HW_MPU401
,
608 printk(KERN_ERR LOGNAME
609 ": error creating new Midi device\n");
610 goto err_release_region
;
612 mpu
= chip
->rmidi
->private_data
;
614 mpu
->open_input
= snd_msnd_mpu401_open
;
615 mpu
->close_input
= snd_msnd_mpu401_close
;
616 mpu
->private_data
= chip
;
619 disable_irq(chip
->irq
);
620 snd_msnd_calibrate_adc(chip
, chip
->play_sample_rate
);
621 snd_msndmix_force_recsrc(chip
, 0);
623 err
= snd_card_register(card
);
625 goto err_release_region
;
630 iounmap(chip
->mappedbase
);
631 release_mem_region(chip
->base
, BUFFSIZE
);
632 release_region(chip
->io
, DSP_NUMIO
);
633 free_irq(chip
->irq
, chip
);
638 static void snd_msnd_unload(struct snd_card
*card
)
640 struct snd_msnd
*chip
= card
->private_data
;
642 iounmap(chip
->mappedbase
);
643 release_mem_region(chip
->base
, BUFFSIZE
);
644 release_region(chip
->io
, DSP_NUMIO
);
645 free_irq(chip
->irq
, chip
);
651 /* Pinnacle/Fiji Logical Device Configuration */
653 static int snd_msnd_write_cfg(int cfg
, int reg
, int value
)
656 outb(value
, cfg
+ 1);
657 if (value
!= inb(cfg
+ 1)) {
658 printk(KERN_ERR LOGNAME
": snd_msnd_write_cfg: I/O error\n");
664 static int snd_msnd_write_cfg_io0(int cfg
, int num
, u16 io
)
666 if (snd_msnd_write_cfg(cfg
, IREG_LOGDEVICE
, num
))
668 if (snd_msnd_write_cfg(cfg
, IREG_IO0_BASEHI
, HIBYTE(io
)))
670 if (snd_msnd_write_cfg(cfg
, IREG_IO0_BASELO
, LOBYTE(io
)))
675 static int snd_msnd_write_cfg_io1(int cfg
, int num
, u16 io
)
677 if (snd_msnd_write_cfg(cfg
, IREG_LOGDEVICE
, num
))
679 if (snd_msnd_write_cfg(cfg
, IREG_IO1_BASEHI
, HIBYTE(io
)))
681 if (snd_msnd_write_cfg(cfg
, IREG_IO1_BASELO
, LOBYTE(io
)))
686 static int snd_msnd_write_cfg_irq(int cfg
, int num
, u16 irq
)
688 if (snd_msnd_write_cfg(cfg
, IREG_LOGDEVICE
, num
))
690 if (snd_msnd_write_cfg(cfg
, IREG_IRQ_NUMBER
, LOBYTE(irq
)))
692 if (snd_msnd_write_cfg(cfg
, IREG_IRQ_TYPE
, IRQTYPE_EDGE
))
697 static int snd_msnd_write_cfg_mem(int cfg
, int num
, int mem
)
702 wmem
= (u16
)(mem
& 0xfff);
703 if (snd_msnd_write_cfg(cfg
, IREG_LOGDEVICE
, num
))
705 if (snd_msnd_write_cfg(cfg
, IREG_MEMBASEHI
, HIBYTE(wmem
)))
707 if (snd_msnd_write_cfg(cfg
, IREG_MEMBASELO
, LOBYTE(wmem
)))
709 if (wmem
&& snd_msnd_write_cfg(cfg
, IREG_MEMCONTROL
,
710 MEMTYPE_HIADDR
| MEMTYPE_16BIT
))
715 static int snd_msnd_activate_logical(int cfg
, int num
)
717 if (snd_msnd_write_cfg(cfg
, IREG_LOGDEVICE
, num
))
719 if (snd_msnd_write_cfg(cfg
, IREG_ACTIVATE
, LD_ACTIVATE
))
724 static int snd_msnd_write_cfg_logical(int cfg
, int num
, u16 io0
,
725 u16 io1
, u16 irq
, int mem
)
727 if (snd_msnd_write_cfg(cfg
, IREG_LOGDEVICE
, num
))
729 if (snd_msnd_write_cfg_io0(cfg
, num
, io0
))
731 if (snd_msnd_write_cfg_io1(cfg
, num
, io1
))
733 if (snd_msnd_write_cfg_irq(cfg
, num
, irq
))
735 if (snd_msnd_write_cfg_mem(cfg
, num
, mem
))
737 if (snd_msnd_activate_logical(cfg
, num
))
742 static int snd_msnd_pinnacle_cfg_reset(int cfg
)
746 /* Reset devices if told to */
747 printk(KERN_INFO LOGNAME
": Resetting all devices\n");
748 for (i
= 0; i
< 4; ++i
)
749 if (snd_msnd_write_cfg_logical(cfg
, i
, 0, 0, 0, 0))
756 static int index
[SNDRV_CARDS
] = SNDRV_DEFAULT_IDX
; /* Index 0-MAX */
757 static char *id
[SNDRV_CARDS
] = SNDRV_DEFAULT_STR
; /* ID for this card */
759 module_param_array(index
, int, NULL
, S_IRUGO
);
760 MODULE_PARM_DESC(index
, "Index value for msnd_pinnacle soundcard.");
761 module_param_array(id
, charp
, NULL
, S_IRUGO
);
762 MODULE_PARM_DESC(id
, "ID string for msnd_pinnacle soundcard.");
764 static long io
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
765 static int irq
[SNDRV_CARDS
] = SNDRV_DEFAULT_IRQ
;
766 static long mem
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
769 static long cfg
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
771 /* Extra Peripheral Configuration (Default: Disable) */
772 static long ide_io0
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
773 static long ide_io1
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
774 static int ide_irq
[SNDRV_CARDS
] = SNDRV_DEFAULT_IRQ
;
776 static long joystick_io
[SNDRV_CARDS
] = SNDRV_DEFAULT_PORT
;
777 /* If we have the digital daugherboard... */
778 static int digital
[SNDRV_CARDS
];
780 /* Extra Peripheral Configuration */
781 static int reset
[SNDRV_CARDS
];
784 static int write_ndelay
[SNDRV_CARDS
] = { [0 ... (SNDRV_CARDS
-1)] = 1 };
786 static int calibrate_signal
;
789 static bool isapnp
[SNDRV_CARDS
] = SNDRV_DEFAULT_ENABLE_PNP
;
790 module_param_array(isapnp
, bool, NULL
, 0444);
791 MODULE_PARM_DESC(isapnp
, "ISA PnP detection for specified soundcard.");
792 #define has_isapnp(x) isapnp[x]
794 #define has_isapnp(x) 0
797 MODULE_AUTHOR("Karsten Wiese <annabellesgarden@yahoo.de>");
798 MODULE_DESCRIPTION("Turtle Beach " LONGNAME
" Linux Driver");
799 MODULE_LICENSE("GPL");
800 MODULE_FIRMWARE(INITCODEFILE
);
801 MODULE_FIRMWARE(PERMCODEFILE
);
803 module_param_array(io
, long, NULL
, S_IRUGO
);
804 MODULE_PARM_DESC(io
, "IO port #");
805 module_param_array(irq
, int, NULL
, S_IRUGO
);
806 module_param_array(mem
, long, NULL
, S_IRUGO
);
807 module_param_array(write_ndelay
, int, NULL
, S_IRUGO
);
808 module_param(calibrate_signal
, int, S_IRUGO
);
810 module_param_array(digital
, int, NULL
, S_IRUGO
);
811 module_param_array(cfg
, long, NULL
, S_IRUGO
);
812 module_param_array(reset
, int, 0, S_IRUGO
);
813 module_param_array(mpu_io
, long, NULL
, S_IRUGO
);
814 module_param_array(mpu_irq
, int, NULL
, S_IRUGO
);
815 module_param_array(ide_io0
, long, NULL
, S_IRUGO
);
816 module_param_array(ide_io1
, long, NULL
, S_IRUGO
);
817 module_param_array(ide_irq
, int, NULL
, S_IRUGO
);
818 module_param_array(joystick_io
, long, NULL
, S_IRUGO
);
822 static int snd_msnd_isa_match(struct device
*pdev
, unsigned int i
)
824 if (io
[i
] == SNDRV_AUTO_PORT
)
827 if (irq
[i
] == SNDRV_AUTO_PORT
|| mem
[i
] == SNDRV_AUTO_PORT
) {
828 printk(KERN_WARNING LOGNAME
": io, irq and mem must be set\n");
833 if (!(io
[i
] == 0x290 ||
841 printk(KERN_ERR LOGNAME
": \"io\" - DSP I/O base must be set "
842 " to 0x210, 0x220, 0x230, 0x240, 0x250, 0x260, 0x290, "
847 if (io
[i
] < 0x100 || io
[i
] > 0x3e0 || (io
[i
] % 0x10) != 0) {
848 printk(KERN_ERR LOGNAME
849 ": \"io\" - DSP I/O base must within the range 0x100 "
850 "to 0x3E0 and must be evenly divisible by 0x10\n");
853 #endif /* MSND_CLASSIC */
861 printk(KERN_ERR LOGNAME
862 ": \"irq\" - must be set to 5, 7, 9, 10, 11 or 12\n");
866 if (!(mem
[i
] == 0xb0000 ||
871 mem
[i
] == 0xe8000)) {
872 printk(KERN_ERR LOGNAME
": \"mem\" - must be set to "
873 "0xb0000, 0xc8000, 0xd0000, 0xd8000, 0xe0000 or "
879 if (cfg
[i
] == SNDRV_AUTO_PORT
) {
880 printk(KERN_INFO LOGNAME
": Assuming PnP mode\n");
881 } else if (cfg
[i
] != 0x250 && cfg
[i
] != 0x260 && cfg
[i
] != 0x270) {
882 printk(KERN_INFO LOGNAME
883 ": Config port must be 0x250, 0x260 or 0x270 "
884 "(or unspecified for PnP mode)\n");
887 #endif /* MSND_CLASSIC */
892 static int snd_msnd_isa_probe(struct device
*pdev
, unsigned int idx
)
895 struct snd_card
*card
;
896 struct snd_msnd
*chip
;
900 || cfg
[idx
] == SNDRV_AUTO_PORT
903 printk(KERN_INFO LOGNAME
": Assuming PnP mode\n");
907 err
= snd_card_new(pdev
, index
[idx
], id
[idx
], THIS_MODULE
,
908 sizeof(struct snd_msnd
), &card
);
912 chip
= card
->private_data
;
918 chip
->irqid
= HPIRQ_5
; break;
920 chip
->irqid
= HPIRQ_7
; break;
922 chip
->irqid
= HPIRQ_9
; break;
924 chip
->irqid
= HPIRQ_10
; break;
926 chip
->irqid
= HPIRQ_11
; break;
928 chip
->irqid
= HPIRQ_12
; break;
933 chip
->memid
= HPMEM_B000
; break;
935 chip
->memid
= HPMEM_C800
; break;
937 chip
->memid
= HPMEM_D000
; break;
939 chip
->memid
= HPMEM_D800
; break;
941 chip
->memid
= HPMEM_E000
; break;
943 chip
->memid
= HPMEM_E800
; break;
946 printk(KERN_INFO LOGNAME
": Non-PnP mode: configuring at port 0x%lx\n",
949 if (!request_region(cfg
[idx
], 2, "Pinnacle/Fiji Config")) {
950 printk(KERN_ERR LOGNAME
": Config port 0x%lx conflict\n",
956 if (snd_msnd_pinnacle_cfg_reset(cfg
[idx
])) {
962 err
= snd_msnd_write_cfg_logical(cfg
[idx
], 0,
969 /* The following are Pinnacle specific */
972 if (mpu_io
[idx
] != SNDRV_AUTO_PORT
973 && mpu_irq
[idx
] != SNDRV_AUTO_IRQ
) {
974 printk(KERN_INFO LOGNAME
975 ": Configuring MPU to I/O 0x%lx IRQ %d\n",
976 mpu_io
[idx
], mpu_irq
[idx
]);
977 err
= snd_msnd_write_cfg_logical(cfg
[idx
], 1,
986 if (ide_io0
[idx
] != SNDRV_AUTO_PORT
987 && ide_io1
[idx
] != SNDRV_AUTO_PORT
988 && ide_irq
[idx
] != SNDRV_AUTO_IRQ
) {
989 printk(KERN_INFO LOGNAME
990 ": Configuring IDE to I/O 0x%lx, 0x%lx IRQ %d\n",
991 ide_io0
[idx
], ide_io1
[idx
], ide_irq
[idx
]);
992 err
= snd_msnd_write_cfg_logical(cfg
[idx
], 2,
993 ide_io0
[idx
], ide_io1
[idx
],
1001 if (joystick_io
[idx
] != SNDRV_AUTO_PORT
) {
1002 printk(KERN_INFO LOGNAME
1003 ": Configuring joystick to I/O 0x%lx\n",
1005 err
= snd_msnd_write_cfg_logical(cfg
[idx
], 3,
1006 joystick_io
[idx
], 0,
1012 release_region(cfg
[idx
], 2);
1014 #endif /* MSND_CLASSIC */
1016 set_default_audio_parameters(chip
);
1018 chip
->type
= msndClassic
;
1020 chip
->type
= msndPinnacle
;
1023 chip
->irq
= irq
[idx
];
1024 chip
->base
= mem
[idx
];
1026 chip
->calibrate_signal
= calibrate_signal
? 1 : 0;
1028 chip
->dspq_data_buff
= DSPQ_DATA_BUFF
;
1029 chip
->dspq_buff_size
= DSPQ_BUFF_SIZE
;
1030 if (write_ndelay
[idx
])
1031 clear_bit(F_DISABLE_WRITE_NDELAY
, &chip
->flags
);
1033 set_bit(F_DISABLE_WRITE_NDELAY
, &chip
->flags
);
1034 #ifndef MSND_CLASSIC
1036 set_bit(F_HAVEDIGITAL
, &chip
->flags
);
1038 spin_lock_init(&chip
->lock
);
1039 err
= snd_msnd_probe(card
);
1041 printk(KERN_ERR LOGNAME
": Probe failed\n");
1042 snd_card_free(card
);
1046 err
= snd_msnd_attach(card
);
1048 printk(KERN_ERR LOGNAME
": Attach failed\n");
1049 snd_card_free(card
);
1052 dev_set_drvdata(pdev
, card
);
1056 #ifndef MSND_CLASSIC
1058 release_region(cfg
[idx
], 2);
1059 snd_card_free(card
);
1064 static int snd_msnd_isa_remove(struct device
*pdev
, unsigned int dev
)
1066 snd_msnd_unload(dev_get_drvdata(pdev
));
1070 static struct isa_driver snd_msnd_driver
= {
1071 .match
= snd_msnd_isa_match
,
1072 .probe
= snd_msnd_isa_probe
,
1073 .remove
= snd_msnd_isa_remove
,
1074 /* FIXME: suspend, resume */
1081 static int snd_msnd_pnp_detect(struct pnp_card_link
*pcard
,
1082 const struct pnp_card_device_id
*pid
)
1085 struct pnp_dev
*pnp_dev
;
1086 struct pnp_dev
*mpu_dev
;
1087 struct snd_card
*card
;
1088 struct snd_msnd
*chip
;
1091 for ( ; idx
< SNDRV_CARDS
; idx
++) {
1092 if (has_isapnp(idx
))
1095 if (idx
>= SNDRV_CARDS
)
1099 * Check that we still have room for another sound card ...
1101 pnp_dev
= pnp_request_card_device(pcard
, pid
->devs
[0].id
, NULL
);
1105 mpu_dev
= pnp_request_card_device(pcard
, pid
->devs
[1].id
, NULL
);
1109 if (!pnp_is_active(pnp_dev
) && pnp_activate_dev(pnp_dev
) < 0) {
1110 printk(KERN_INFO
"msnd_pinnacle: device is inactive\n");
1114 if (!pnp_is_active(mpu_dev
) && pnp_activate_dev(mpu_dev
) < 0) {
1115 printk(KERN_INFO
"msnd_pinnacle: MPU device is inactive\n");
1120 * Create a new ALSA sound card entry, in anticipation
1121 * of detecting our hardware ...
1123 ret
= snd_card_new(&pcard
->card
->dev
,
1124 index
[idx
], id
[idx
], THIS_MODULE
,
1125 sizeof(struct snd_msnd
), &card
);
1129 chip
= card
->private_data
;
1133 * Read the correct parameters off the ISA PnP bus ...
1135 io
[idx
] = pnp_port_start(pnp_dev
, 0);
1136 irq
[idx
] = pnp_irq(pnp_dev
, 0);
1137 mem
[idx
] = pnp_mem_start(pnp_dev
, 0);
1138 mpu_io
[idx
] = pnp_port_start(mpu_dev
, 0);
1139 mpu_irq
[idx
] = pnp_irq(mpu_dev
, 0);
1141 set_default_audio_parameters(chip
);
1143 chip
->type
= msndClassic
;
1145 chip
->type
= msndPinnacle
;
1148 chip
->irq
= irq
[idx
];
1149 chip
->base
= mem
[idx
];
1151 chip
->calibrate_signal
= calibrate_signal
? 1 : 0;
1153 chip
->dspq_data_buff
= DSPQ_DATA_BUFF
;
1154 chip
->dspq_buff_size
= DSPQ_BUFF_SIZE
;
1155 if (write_ndelay
[idx
])
1156 clear_bit(F_DISABLE_WRITE_NDELAY
, &chip
->flags
);
1158 set_bit(F_DISABLE_WRITE_NDELAY
, &chip
->flags
);
1159 #ifndef MSND_CLASSIC
1161 set_bit(F_HAVEDIGITAL
, &chip
->flags
);
1163 spin_lock_init(&chip
->lock
);
1164 ret
= snd_msnd_probe(card
);
1166 printk(KERN_ERR LOGNAME
": Probe failed\n");
1170 ret
= snd_msnd_attach(card
);
1172 printk(KERN_ERR LOGNAME
": Attach failed\n");
1176 pnp_set_card_drvdata(pcard
, card
);
1181 snd_card_free(card
);
1185 static void snd_msnd_pnp_remove(struct pnp_card_link
*pcard
)
1187 snd_msnd_unload(pnp_get_card_drvdata(pcard
));
1188 pnp_set_card_drvdata(pcard
, NULL
);
1191 static int isa_registered
;
1192 static int pnp_registered
;
1194 static struct pnp_card_device_id msnd_pnpids
[] = {
1196 { .id
= "BVJ0440", .devs
= { { "TBS0000" }, { "TBS0001" } } },
1197 { .id
= "" } /* end */
1200 MODULE_DEVICE_TABLE(pnp_card
, msnd_pnpids
);
1202 static struct pnp_card_driver msnd_pnpc_driver
= {
1203 .flags
= PNP_DRIVER_RES_DO_NOT_CHANGE
,
1204 .name
= "msnd_pinnacle",
1205 .id_table
= msnd_pnpids
,
1206 .probe
= snd_msnd_pnp_detect
,
1207 .remove
= snd_msnd_pnp_remove
,
1209 #endif /* CONFIG_PNP */
1211 static int __init
snd_msnd_init(void)
1215 err
= isa_register_driver(&snd_msnd_driver
, SNDRV_CARDS
);
1220 err
= pnp_register_card_driver(&msnd_pnpc_driver
);
1230 static void __exit
snd_msnd_exit(void)
1234 pnp_unregister_card_driver(&msnd_pnpc_driver
);
1237 isa_unregister_driver(&snd_msnd_driver
);
1240 module_init(snd_msnd_init
);
1241 module_exit(snd_msnd_exit
);