2005-04-16 15:20:36 -07:00
/*
* Driver for Trident 4 DWave DX / NX & SiS SI7018 Audio PCI soundcard
*
* Driver was originated by Trident < audio @ tridentmicro . com >
* Fri Feb 19 15 : 55 : 28 MST 1999
*
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*
*/
# include <linux/init.h>
# include <linux/pci.h>
# include <linux/time.h>
# include <linux/moduleparam.h>
# include <sound/core.h>
# include <sound/trident.h>
# include <sound/initval.h>
2007-10-15 09:50:19 +02:00
MODULE_AUTHOR ( " Jaroslav Kysela <perex@perex.cz>, <audio@tridentmicro.com> " ) ;
2005-04-16 15:20:36 -07:00
MODULE_DESCRIPTION ( " Trident 4D-WaveDX/NX & SiS SI7018 " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_SUPPORTED_DEVICE ( " {{Trident,4DWave DX}, "
" {Trident,4DWave NX}, "
" {SiS,SI7018 PCI Audio}, "
" {Best Union,Miss Melody 4DWave PCI}, "
" {HIS,4DWave PCI}, "
" {Warpspeed,ONSpeed 4DWave PCI}, "
" {Aztech Systems,PCI 64-Q3D}, "
" {Addonics,SV 750}, "
" {CHIC,True Sound 4Dwave}, "
" {Shark,Predator4D-PCI}, "
" {Jaton,SonicWave 4D}, "
" {Hoontech,SoundTrack Digital 4DWave NX}} " ) ;
static int index [ SNDRV_CARDS ] = SNDRV_DEFAULT_IDX ; /* Index 0-MAX */
static char * id [ SNDRV_CARDS ] = SNDRV_DEFAULT_STR ; /* ID for this card */
static int enable [ SNDRV_CARDS ] = SNDRV_DEFAULT_ENABLE_PNP ; /* Enable this card */
static int pcm_channels [ SNDRV_CARDS ] = { [ 0 . . . ( SNDRV_CARDS - 1 ) ] = 32 } ;
static int wavetable_size [ SNDRV_CARDS ] = { [ 0 . . . ( SNDRV_CARDS - 1 ) ] = 8192 } ;
module_param_array ( index , int , NULL , 0444 ) ;
MODULE_PARM_DESC ( index , " Index value for Trident 4DWave PCI soundcard. " ) ;
module_param_array ( id , charp , NULL , 0444 ) ;
MODULE_PARM_DESC ( id , " ID string for Trident 4DWave PCI soundcard. " ) ;
module_param_array ( enable , bool , NULL , 0444 ) ;
MODULE_PARM_DESC ( enable , " Enable Trident 4DWave PCI soundcard. " ) ;
module_param_array ( pcm_channels , int , NULL , 0444 ) ;
MODULE_PARM_DESC ( pcm_channels , " Number of hardware channels assigned for PCM. " ) ;
module_param_array ( wavetable_size , int , NULL , 0444 ) ;
MODULE_PARM_DESC ( wavetable_size , " Maximum memory size in kB for wavetable synth. " ) ;
2006-07-05 16:51:05 +02:00
static struct pci_device_id snd_trident_ids [ ] = {
2006-01-13 13:14:53 +01:00
{ PCI_DEVICE ( PCI_VENDOR_ID_TRIDENT , PCI_DEVICE_ID_TRIDENT_4DWAVE_DX ) ,
PCI_CLASS_MULTIMEDIA_AUDIO < < 8 , 0xffff00 , 0 } ,
{ PCI_DEVICE ( PCI_VENDOR_ID_TRIDENT , PCI_DEVICE_ID_TRIDENT_4DWAVE_NX ) ,
0 , 0 , 0 } ,
{ PCI_DEVICE ( PCI_VENDOR_ID_SI , PCI_DEVICE_ID_SI_7018 ) , 0 , 0 , 0 } ,
2005-04-16 15:20:36 -07:00
{ 0 , }
} ;
MODULE_DEVICE_TABLE ( pci , snd_trident_ids ) ;
static int __devinit snd_trident_probe ( struct pci_dev * pci ,
const struct pci_device_id * pci_id )
{
static int dev ;
2005-11-17 14:53:15 +01:00
struct snd_card * card ;
struct snd_trident * trident ;
2005-04-16 15:20:36 -07:00
const char * str ;
int err , pcm_dev = 0 ;
if ( dev > = SNDRV_CARDS )
return - ENODEV ;
if ( ! enable [ dev ] ) {
dev + + ;
return - ENOENT ;
}
card = snd_card_new ( index [ dev ] , id [ dev ] , THIS_MODULE , 0 ) ;
if ( card = = NULL )
return - ENOMEM ;
if ( ( err = snd_trident_create ( card , pci ,
pcm_channels [ dev ] ,
( ( pci - > vendor < < 16 ) | pci - > device ) = = TRIDENT_DEVICE_ID_SI7018 ? 1 : 2 ,
wavetable_size [ dev ] ,
& trident ) ) < 0 ) {
snd_card_free ( card ) ;
return err ;
}
2005-11-17 16:09:25 +01:00
card - > private_data = trident ;
2005-04-16 15:20:36 -07:00
switch ( trident - > device ) {
case TRIDENT_DEVICE_ID_DX :
str = " TRID4DWAVEDX " ;
break ;
case TRIDENT_DEVICE_ID_NX :
str = " TRID4DWAVENX " ;
break ;
case TRIDENT_DEVICE_ID_SI7018 :
str = " SI7018 " ;
break ;
default :
str = " Unknown " ;
}
strcpy ( card - > driver , str ) ;
if ( trident - > device = = TRIDENT_DEVICE_ID_SI7018 ) {
strcpy ( card - > shortname , " SiS " ) ;
} else {
strcpy ( card - > shortname , " Trident " ) ;
}
strcat ( card - > shortname , card - > driver ) ;
sprintf ( card - > longname , " %s PCI Audio at 0x%lx, irq %d " ,
card - > shortname , trident - > port , trident - > irq ) ;
if ( ( err = snd_trident_pcm ( trident , pcm_dev + + , NULL ) ) < 0 ) {
snd_card_free ( card ) ;
return err ;
}
switch ( trident - > device ) {
case TRIDENT_DEVICE_ID_DX :
case TRIDENT_DEVICE_ID_NX :
if ( ( err = snd_trident_foldback_pcm ( trident , pcm_dev + + , NULL ) ) < 0 ) {
snd_card_free ( card ) ;
return err ;
}
break ;
}
if ( trident - > device = = TRIDENT_DEVICE_ID_NX | | trident - > device = = TRIDENT_DEVICE_ID_SI7018 ) {
if ( ( err = snd_trident_spdif_pcm ( trident , pcm_dev + + , NULL ) ) < 0 ) {
snd_card_free ( card ) ;
return err ;
}
}
2005-06-08 14:49:31 +02:00
if ( trident - > device ! = TRIDENT_DEVICE_ID_SI7018 & &
( err = snd_mpu401_uart_new ( card , 0 , MPU401_HW_TRID4DWAVE ,
2006-05-23 13:24:30 +02:00
trident - > midi_port ,
MPU401_INFO_INTEGRATED ,
2005-04-16 15:20:36 -07:00
trident - > irq , 0 , & trident - > rmidi ) ) < 0 ) {
snd_card_free ( card ) ;
return err ;
}
snd_trident_create_gameport ( trident ) ;
if ( ( err = snd_card_register ( card ) ) < 0 ) {
snd_card_free ( card ) ;
return err ;
}
pci_set_drvdata ( pci , card ) ;
dev + + ;
return 0 ;
}
static void __devexit snd_trident_remove ( struct pci_dev * pci )
{
snd_card_free ( pci_get_drvdata ( pci ) ) ;
pci_set_drvdata ( pci , NULL ) ;
}
static struct pci_driver driver = {
. name = " Trident4DWaveAudio " ,
. id_table = snd_trident_ids ,
. probe = snd_trident_probe ,
. remove = __devexit_p ( snd_trident_remove ) ,
2005-11-17 16:09:25 +01:00
# ifdef CONFIG_PM
. suspend = snd_trident_suspend ,
. resume = snd_trident_resume ,
# endif
2005-04-16 15:20:36 -07:00
} ;
static int __init alsa_card_trident_init ( void )
{
[ALSA] Replace pci_module_init() with pci_register_driver()
Documentation,ALS4000 driver,ATIIXP driver,ATIIXP-modem driver
AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
RME96 driver,SonicVibes driver,VIA82xx driver,VIA82xx-modem driver
ALI5451 driver,au88x0 driver,CA0106 driver,CS46xx driver
EMU10K1/EMU10K2 driver,HDA Intel driver,ICE1712 driver,ICE1724 driver
KORG1212 driver,MIXART driver,NM256 driver,RME HDSP driver
RME9652 driver,Trident driver,Digigram VX222 driver,YMFPCI driver
Replace the obsolete pci_module_init() with pci_register_driver().
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2005-04-11 16:58:24 +02:00
return pci_register_driver ( & driver ) ;
2005-04-16 15:20:36 -07:00
}
static void __exit alsa_card_trident_exit ( void )
{
pci_unregister_driver ( & driver ) ;
}
module_init ( alsa_card_trident_init )
module_exit ( alsa_card_trident_exit )