2019-05-27 08:55:05 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
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
*/
# include <linux/init.h>
# include <linux/pci.h>
# include <linux/time.h>
2011-07-15 13:13:37 -04:00
# include <linux/module.h>
2005-04-16 15:20:36 -07:00
# include <sound/core.h>
2012-07-02 16:37:05 +02:00
# include "trident.h"
2005-04-16 15:20:36 -07:00
# 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 " ) ;
static int index [ SNDRV_CARDS ] = SNDRV_DEFAULT_IDX ; /* Index 0-MAX */
static char * id [ SNDRV_CARDS ] = SNDRV_DEFAULT_STR ; /* ID for this card */
2011-12-15 13:49:36 +10:30
static bool enable [ SNDRV_CARDS ] = SNDRV_DEFAULT_ENABLE_PNP ; /* Enable this card */
2005-04-16 15:20:36 -07:00
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. " ) ;
2014-08-08 15:56:03 +02:00
static const 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 ) ;
2012-12-06 12:35:10 -05:00
static int snd_trident_probe ( struct pci_dev * pci ,
const struct pci_device_id * pci_id )
2005-04-16 15:20:36 -07:00
{
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 ;
}
2021-07-15 09:59:10 +02:00
err = snd_devm_card_new ( & pci - > dev , index [ dev ] , id [ dev ] , THIS_MODULE ,
sizeof ( * trident ) , & card ) ;
2008-12-28 16:44:30 +01:00
if ( err < 0 )
return err ;
2021-07-15 09:59:10 +02:00
trident = card - > private_data ;
2005-04-16 15:20:36 -07:00
2021-06-08 16:05:24 +02:00
err = snd_trident_create ( card , pci ,
pcm_channels [ dev ] ,
( ( pci - > vendor < < 16 ) | pci - > device ) = = TRIDENT_DEVICE_ID_SI7018 ? 1 : 2 ,
2021-07-15 09:59:10 +02:00
wavetable_size [ dev ] ) ;
if ( err < 0 )
2005-04-16 15:20:36 -07:00
return err ;
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 " ) ;
}
2018-07-26 14:58:03 +02:00
strcat ( card - > shortname , str ) ;
2005-04-16 15:20:36 -07:00
sprintf ( card - > longname , " %s PCI Audio at 0x%lx, irq %d " ,
card - > shortname , trident - > port , trident - > irq ) ;
2021-06-08 16:05:24 +02:00
err = snd_trident_pcm ( trident , pcm_dev + + ) ;
2021-07-15 09:59:10 +02:00
if ( err < 0 )
2005-04-16 15:20:36 -07:00
return err ;
switch ( trident - > device ) {
case TRIDENT_DEVICE_ID_DX :
case TRIDENT_DEVICE_ID_NX :
2021-06-08 16:05:24 +02:00
err = snd_trident_foldback_pcm ( trident , pcm_dev + + ) ;
2021-07-15 09:59:10 +02:00
if ( err < 0 )
2005-04-16 15:20:36 -07:00
return err ;
break ;
}
if ( trident - > device = = TRIDENT_DEVICE_ID_NX | | trident - > device = = TRIDENT_DEVICE_ID_SI7018 ) {
2021-06-08 16:05:24 +02:00
err = snd_trident_spdif_pcm ( trident , pcm_dev + + ) ;
2021-07-15 09:59:10 +02:00
if ( err < 0 )
2005-04-16 15:20:36 -07:00
return err ;
}
2021-06-08 16:05:24 +02:00
if ( trident - > device ! = TRIDENT_DEVICE_ID_SI7018 ) {
err = snd_mpu401_uart_new ( card , 0 , MPU401_HW_TRID4DWAVE ,
trident - > midi_port ,
MPU401_INFO_INTEGRATED |
MPU401_INFO_IRQ_HOOK ,
- 1 , & trident - > rmidi ) ;
2021-07-15 09:59:10 +02:00
if ( err < 0 )
2021-06-08 16:05:24 +02:00
return err ;
2005-04-16 15:20:36 -07:00
}
snd_trident_create_gameport ( trident ) ;
2021-06-08 16:05:24 +02:00
err = snd_card_register ( card ) ;
2021-07-15 09:59:10 +02:00
if ( err < 0 )
2005-04-16 15:20:36 -07:00
return err ;
pci_set_drvdata ( pci , card ) ;
dev + + ;
return 0 ;
}
2012-04-24 12:25:00 +02:00
static struct pci_driver trident_driver = {
2011-06-10 16:20:20 +02:00
. name = KBUILD_MODNAME ,
2005-04-16 15:20:36 -07:00
. id_table = snd_trident_ids ,
. probe = snd_trident_probe ,
2012-08-14 18:12:04 +02:00
# ifdef CONFIG_PM_SLEEP
2012-07-02 15:20:37 +02:00
. driver = {
. pm = & snd_trident_pm ,
} ,
2005-11-17 16:09:25 +01:00
# endif
2005-04-16 15:20:36 -07:00
} ;
2012-04-24 12:25:00 +02:00
module_pci_driver ( trident_driver ) ;