Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
sound
pci
trident
trident.c
Go to the documentation of this file.
1
/*
2
* Driver for Trident 4DWave DX/NX & SiS SI7018 Audio PCI soundcard
3
*
4
* Driver was originated by Trident <audio@tridentmicro.com>
5
* Fri Feb 19 15:55:28 MST 1999
6
*
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version.
12
*
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
17
*
18
* You should have received a copy of the GNU General Public License
19
* along with this program; if not, write to the Free Software
20
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
*
22
*/
23
24
#include <
linux/init.h
>
25
#include <linux/pci.h>
26
#include <linux/time.h>
27
#include <linux/module.h>
28
#include <
sound/core.h
>
29
#include "
trident.h
"
30
#include <
sound/initval.h
>
31
32
MODULE_AUTHOR
(
"Jaroslav Kysela <perex@perex.cz>, <audio@tridentmicro.com>"
);
33
MODULE_DESCRIPTION
(
"Trident 4D-WaveDX/NX & SiS SI7018"
);
34
MODULE_LICENSE
(
"GPL"
);
35
MODULE_SUPPORTED_DEVICE
(
"{{Trident,4DWave DX},"
36
"{Trident,4DWave NX},"
37
"{SiS,SI7018 PCI Audio},"
38
"{Best Union,Miss Melody 4DWave PCI},"
39
"{HIS,4DWave PCI},"
40
"{Warpspeed,ONSpeed 4DWave PCI},"
41
"{Aztech Systems,PCI 64-Q3D},"
42
"{Addonics,SV 750},"
43
"{CHIC,True Sound 4Dwave},"
44
"{Shark,Predator4D-PCI},"
45
"{Jaton,SonicWave 4D},"
46
"{Hoontech,SoundTrack Digital 4DWave NX}}"
);
47
48
static
int
index
[
SNDRV_CARDS
] =
SNDRV_DEFAULT_IDX
;
/* Index 0-MAX */
49
static
char
*
id
[
SNDRV_CARDS
] =
SNDRV_DEFAULT_STR
;
/* ID for this card */
50
static
bool
enable
[
SNDRV_CARDS
] =
SNDRV_DEFAULT_ENABLE_PNP
;
/* Enable this card */
51
static
int
pcm_channels[
SNDRV_CARDS
] = {[0 ... (
SNDRV_CARDS
- 1)] = 32};
52
static
int
wavetable_size[
SNDRV_CARDS
] = {[0 ... (
SNDRV_CARDS
- 1)] = 8192};
53
54
module_param_array
(
index
,
int
,
NULL
, 0444);
55
MODULE_PARM_DESC
(
index
,
"Index value for Trident 4DWave PCI soundcard."
);
56
module_param_array
(
id
, charp,
NULL
, 0444);
57
MODULE_PARM_DESC
(
id
,
"ID string for Trident 4DWave PCI soundcard."
);
58
module_param_array
(
enable
,
bool
,
NULL
, 0444);
59
MODULE_PARM_DESC
(
enable
,
"Enable Trident 4DWave PCI soundcard."
);
60
module_param_array
(pcm_channels,
int
,
NULL
, 0444);
61
MODULE_PARM_DESC
(pcm_channels,
"Number of hardware channels assigned for PCM."
);
62
module_param_array
(wavetable_size,
int
,
NULL
, 0444);
63
MODULE_PARM_DESC
(wavetable_size,
"Maximum memory size in kB for wavetable synth."
);
64
65
static
DEFINE_PCI_DEVICE_TABLE
(snd_trident_ids) = {
66
{
PCI_DEVICE
(
PCI_VENDOR_ID_TRIDENT
,
PCI_DEVICE_ID_TRIDENT_4DWAVE_DX
),
67
PCI_CLASS_MULTIMEDIA_AUDIO
<< 8, 0xffff00, 0},
68
{
PCI_DEVICE
(
PCI_VENDOR_ID_TRIDENT
,
PCI_DEVICE_ID_TRIDENT_4DWAVE_NX
),
69
0, 0, 0},
70
{
PCI_DEVICE
(
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_7018
), 0, 0, 0},
71
{ 0, }
72
};
73
74
MODULE_DEVICE_TABLE
(pci, snd_trident_ids);
75
76
static
int
__devinit
snd_trident_probe(
struct
pci_dev
*pci,
77
const
struct
pci_device_id
*
pci_id
)
78
{
79
static
int
dev
;
80
struct
snd_card
*
card
;
81
struct
snd_trident
*trident;
82
const
char
*
str
;
83
int
err
,
pcm_dev
= 0;
84
85
if
(dev >=
SNDRV_CARDS
)
86
return
-
ENODEV
;
87
if
(!
enable
[dev]) {
88
dev++;
89
return
-
ENOENT
;
90
}
91
92
err =
snd_card_create
(
index
[dev],
id
[dev],
THIS_MODULE
, 0, &card);
93
if
(err < 0)
94
return
err
;
95
96
if
((err =
snd_trident_create
(card, pci,
97
pcm_channels[dev],
98
((pci->
vendor
<< 16) | pci->
device
) ==
TRIDENT_DEVICE_ID_SI7018
? 1 : 2,
99
wavetable_size[dev],
100
&trident)) < 0) {
101
snd_card_free
(card);
102
return
err
;
103
}
104
card->
private_data
= trident;
105
106
switch
(trident->
device
) {
107
case
TRIDENT_DEVICE_ID_DX
:
108
str =
"TRID4DWAVEDX"
;
109
break
;
110
case
TRIDENT_DEVICE_ID_NX
:
111
str =
"TRID4DWAVENX"
;
112
break
;
113
case
TRIDENT_DEVICE_ID_SI7018
:
114
str =
"SI7018"
;
115
break
;
116
default
:
117
str =
"Unknown"
;
118
}
119
strcpy
(card->
driver
, str);
120
if
(trident->
device
==
TRIDENT_DEVICE_ID_SI7018
) {
121
strcpy
(card->
shortname
,
"SiS "
);
122
}
else
{
123
strcpy
(card->
shortname
,
"Trident "
);
124
}
125
strcat
(card->
shortname
, card->
driver
);
126
sprintf
(card->
longname
,
"%s PCI Audio at 0x%lx, irq %d"
,
127
card->
shortname
, trident->
port
, trident->
irq
);
128
129
if
((err =
snd_trident_pcm
(trident, pcm_dev++,
NULL
)) < 0) {
130
snd_card_free
(card);
131
return
err
;
132
}
133
switch
(trident->
device
) {
134
case
TRIDENT_DEVICE_ID_DX
:
135
case
TRIDENT_DEVICE_ID_NX
:
136
if
((err =
snd_trident_foldback_pcm
(trident, pcm_dev++,
NULL
)) < 0) {
137
snd_card_free
(card);
138
return
err
;
139
}
140
break
;
141
}
142
if
(trident->
device
==
TRIDENT_DEVICE_ID_NX
|| trident->
device
==
TRIDENT_DEVICE_ID_SI7018
) {
143
if
((err =
snd_trident_spdif_pcm
(trident, pcm_dev++,
NULL
)) < 0) {
144
snd_card_free
(card);
145
return
err
;
146
}
147
}
148
if
(trident->
device
!=
TRIDENT_DEVICE_ID_SI7018
&&
149
(err =
snd_mpu401_uart_new
(card, 0,
MPU401_HW_TRID4DWAVE
,
150
trident->
midi_port
,
151
MPU401_INFO_INTEGRATED
|
152
MPU401_INFO_IRQ_HOOK
,
153
-1, &trident->
rmidi
)) < 0) {
154
snd_card_free
(card);
155
return
err
;
156
}
157
158
snd_trident_create_gameport
(trident);
159
160
if
((err =
snd_card_register
(card)) < 0) {
161
snd_card_free
(card);
162
return
err
;
163
}
164
pci_set_drvdata(pci, card);
165
dev++;
166
return
0;
167
}
168
169
static
void
__devexit
snd_trident_remove(
struct
pci_dev
*pci)
170
{
171
snd_card_free
(pci_get_drvdata(pci));
172
pci_set_drvdata(pci,
NULL
);
173
}
174
175
static
struct
pci_driver
trident_driver = {
176
.name = KBUILD_MODNAME,
177
.id_table = snd_trident_ids,
178
.probe = snd_trident_probe,
179
.remove =
__devexit_p
(snd_trident_remove),
180
#ifdef CONFIG_PM_SLEEP
181
.driver = {
182
.pm = &
snd_trident_pm
,
183
},
184
#endif
185
};
186
187
module_pci_driver
(trident_driver);
Generated on Thu Jan 10 2013 15:07:10 for Linux Kernel by
1.8.2