6 #include <linux/types.h>
7 #include <linux/ioctl.h>
8 #include <sound/asound.h>
9 #include <sound/asound_fm.h>
10 #include <sound/asequencer.h>
11 #include <sound/hdsp.h>
12 #include <sound/hdspm.h>
13 #include <sound/sb16_csp.h>
14 #include <sound/sfnt_info.h>
15 #ifdef USE_SNDDRV_COMPRESS_OFFLOAD
16 #include <sound/compress_offload.h>
19 /* would use this, but the header uses DECLARE_BITMAP() from the kernel */
20 /* #include <sound/emu10k1.h> */
25 /* include/sound/hda_hwdep.h */
26 struct hda_verb_ioctl
{
27 __u32 verb
; /* HDA_VERB() */
28 __u32 res
; /* response */
30 #define HDA_IOCTL_PVERSION _IOR('H', 0x10, int)
31 #define HDA_IOCTL_VERB_WRITE _IOWR('H', 0x11, struct hda_verb_ioctl)
32 #define HDA_IOCTL_GET_WCAP _IOWR('H', 0x12, struct hda_verb_ioctl)
34 static const struct ioctl sound_ioctls
[] = {
35 IOCTL(SNDRV_SEQ_IOCTL_PVERSION
),
36 IOCTL(SNDRV_SEQ_IOCTL_CLIENT_ID
),
37 IOCTL(SNDRV_SEQ_IOCTL_SYSTEM_INFO
),
38 IOCTL(SNDRV_SEQ_IOCTL_RUNNING_MODE
),
39 IOCTL(SNDRV_SEQ_IOCTL_GET_CLIENT_INFO
),
40 IOCTL(SNDRV_SEQ_IOCTL_SET_CLIENT_INFO
),
41 IOCTL(SNDRV_SEQ_IOCTL_CREATE_PORT
),
42 IOCTL(SNDRV_SEQ_IOCTL_DELETE_PORT
),
43 IOCTL(SNDRV_SEQ_IOCTL_GET_PORT_INFO
),
44 IOCTL(SNDRV_SEQ_IOCTL_SET_PORT_INFO
),
45 IOCTL(SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT
),
46 IOCTL(SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT
),
47 IOCTL(SNDRV_SEQ_IOCTL_CREATE_QUEUE
),
48 IOCTL(SNDRV_SEQ_IOCTL_DELETE_QUEUE
),
49 IOCTL(SNDRV_SEQ_IOCTL_GET_QUEUE_INFO
),
50 IOCTL(SNDRV_SEQ_IOCTL_SET_QUEUE_INFO
),
51 IOCTL(SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE
),
52 IOCTL(SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS
),
53 IOCTL(SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO
),
54 IOCTL(SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO
),
55 /* IOCTL(SNDRV_SEQ_IOCTL_GET_QUEUE_OWNER), */
56 /* IOCTL(SNDRV_SEQ_IOCTL_SET_QUEUE_OWNER), */
57 IOCTL(SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER
),
58 IOCTL(SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER
),
59 /* IOCTL(SNDRV_SEQ_IOCTL_GET_QUEUE_SYNC), */
60 /* IOCTL(SNDRV_SEQ_IOCTL_SET_QUEUE_SYNC), */
61 IOCTL(SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT
),
62 IOCTL(SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT
),
63 IOCTL(SNDRV_SEQ_IOCTL_GET_CLIENT_POOL
),
64 IOCTL(SNDRV_SEQ_IOCTL_SET_CLIENT_POOL
),
65 IOCTL(SNDRV_SEQ_IOCTL_REMOVE_EVENTS
),
66 IOCTL(SNDRV_SEQ_IOCTL_QUERY_SUBS
),
67 IOCTL(SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION
),
68 IOCTL(SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT
),
69 IOCTL(SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT
),
70 IOCTL(SNDRV_DM_FM_IOCTL_INFO
),
71 IOCTL(SNDRV_DM_FM_IOCTL_RESET
),
72 IOCTL(SNDRV_DM_FM_IOCTL_PLAY_NOTE
),
73 IOCTL(SNDRV_DM_FM_IOCTL_SET_VOICE
),
74 IOCTL(SNDRV_DM_FM_IOCTL_SET_PARAMS
),
75 IOCTL(SNDRV_DM_FM_IOCTL_SET_MODE
),
76 IOCTL(SNDRV_DM_FM_IOCTL_SET_CONNECTION
),
77 IOCTL(SNDRV_DM_FM_IOCTL_CLEAR_PATCHES
),
78 IOCTL(SNDRV_HWDEP_IOCTL_PVERSION
),
79 IOCTL(SNDRV_HWDEP_IOCTL_INFO
),
80 IOCTL(SNDRV_HWDEP_IOCTL_DSP_STATUS
),
81 IOCTL(SNDRV_HWDEP_IOCTL_DSP_LOAD
),
82 IOCTL(SNDRV_PCM_IOCTL_PVERSION
),
83 IOCTL(SNDRV_PCM_IOCTL_INFO
),
84 IOCTL(SNDRV_PCM_IOCTL_TSTAMP
),
85 IOCTL(SNDRV_PCM_IOCTL_TTSTAMP
),
86 IOCTL(SNDRV_PCM_IOCTL_HW_REFINE
),
87 IOCTL(SNDRV_PCM_IOCTL_HW_PARAMS
),
88 IOCTL(SNDRV_PCM_IOCTL_HW_FREE
),
89 IOCTL(SNDRV_PCM_IOCTL_SW_PARAMS
),
90 IOCTL(SNDRV_PCM_IOCTL_STATUS
),
91 IOCTL(SNDRV_PCM_IOCTL_DELAY
),
92 IOCTL(SNDRV_PCM_IOCTL_HWSYNC
),
93 IOCTL(SNDRV_PCM_IOCTL_SYNC_PTR
),
94 IOCTL(SNDRV_PCM_IOCTL_CHANNEL_INFO
),
95 IOCTL(SNDRV_PCM_IOCTL_PREPARE
),
96 IOCTL(SNDRV_PCM_IOCTL_RESET
),
97 IOCTL(SNDRV_PCM_IOCTL_START
),
98 IOCTL(SNDRV_PCM_IOCTL_DROP
),
99 IOCTL(SNDRV_PCM_IOCTL_DRAIN
),
100 IOCTL(SNDRV_PCM_IOCTL_PAUSE
),
101 IOCTL(SNDRV_PCM_IOCTL_REWIND
),
102 IOCTL(SNDRV_PCM_IOCTL_RESUME
),
103 IOCTL(SNDRV_PCM_IOCTL_XRUN
),
104 IOCTL(SNDRV_PCM_IOCTL_FORWARD
),
105 IOCTL(SNDRV_PCM_IOCTL_WRITEI_FRAMES
),
106 IOCTL(SNDRV_PCM_IOCTL_READI_FRAMES
),
107 IOCTL(SNDRV_PCM_IOCTL_WRITEN_FRAMES
),
108 IOCTL(SNDRV_PCM_IOCTL_READN_FRAMES
),
109 IOCTL(SNDRV_PCM_IOCTL_LINK
),
110 IOCTL(SNDRV_PCM_IOCTL_UNLINK
),
111 IOCTL(SNDRV_RAWMIDI_IOCTL_PVERSION
),
112 IOCTL(SNDRV_RAWMIDI_IOCTL_INFO
),
113 IOCTL(SNDRV_RAWMIDI_IOCTL_PARAMS
),
114 IOCTL(SNDRV_RAWMIDI_IOCTL_STATUS
),
115 IOCTL(SNDRV_RAWMIDI_IOCTL_DROP
),
116 IOCTL(SNDRV_RAWMIDI_IOCTL_DRAIN
),
117 IOCTL(SNDRV_TIMER_IOCTL_PVERSION
),
118 IOCTL(SNDRV_TIMER_IOCTL_NEXT_DEVICE
),
119 IOCTL(SNDRV_TIMER_IOCTL_TREAD
),
120 IOCTL(SNDRV_TIMER_IOCTL_GINFO
),
121 IOCTL(SNDRV_TIMER_IOCTL_GPARAMS
),
122 IOCTL(SNDRV_TIMER_IOCTL_GSTATUS
),
123 IOCTL(SNDRV_TIMER_IOCTL_SELECT
),
124 IOCTL(SNDRV_TIMER_IOCTL_INFO
),
125 IOCTL(SNDRV_TIMER_IOCTL_PARAMS
),
126 IOCTL(SNDRV_TIMER_IOCTL_STATUS
),
127 IOCTL(SNDRV_TIMER_IOCTL_START
),
128 IOCTL(SNDRV_TIMER_IOCTL_STOP
),
129 IOCTL(SNDRV_TIMER_IOCTL_CONTINUE
),
130 IOCTL(SNDRV_TIMER_IOCTL_PAUSE
),
131 IOCTL(SNDRV_CTL_IOCTL_PVERSION
),
132 IOCTL(SNDRV_CTL_IOCTL_CARD_INFO
),
133 IOCTL(SNDRV_CTL_IOCTL_ELEM_LIST
),
134 IOCTL(SNDRV_CTL_IOCTL_ELEM_INFO
),
135 IOCTL(SNDRV_CTL_IOCTL_ELEM_READ
),
136 IOCTL(SNDRV_CTL_IOCTL_ELEM_WRITE
),
137 IOCTL(SNDRV_CTL_IOCTL_ELEM_LOCK
),
138 IOCTL(SNDRV_CTL_IOCTL_ELEM_UNLOCK
),
139 IOCTL(SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS
),
140 IOCTL(SNDRV_CTL_IOCTL_ELEM_ADD
),
141 IOCTL(SNDRV_CTL_IOCTL_ELEM_REPLACE
),
142 IOCTL(SNDRV_CTL_IOCTL_ELEM_REMOVE
),
143 IOCTL(SNDRV_CTL_IOCTL_TLV_READ
),
144 IOCTL(SNDRV_CTL_IOCTL_TLV_WRITE
),
145 IOCTL(SNDRV_CTL_IOCTL_TLV_COMMAND
),
146 IOCTL(SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE
),
147 IOCTL(SNDRV_CTL_IOCTL_HWDEP_INFO
),
148 IOCTL(SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE
),
149 IOCTL(SNDRV_CTL_IOCTL_PCM_INFO
),
150 IOCTL(SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE
),
151 IOCTL(SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE
),
152 IOCTL(SNDRV_CTL_IOCTL_RAWMIDI_INFO
),
153 IOCTL(SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE
),
154 IOCTL(SNDRV_CTL_IOCTL_POWER
),
155 IOCTL(SNDRV_CTL_IOCTL_POWER_STATE
),
156 IOCTL(HDA_IOCTL_PVERSION
),
157 IOCTL(HDA_IOCTL_VERB_WRITE
),
158 IOCTL(HDA_IOCTL_GET_WCAP
),
159 IOCTL(SNDRV_HDSP_IOCTL_GET_PEAK_RMS
),
160 IOCTL(SNDRV_HDSP_IOCTL_GET_CONFIG_INFO
),
161 IOCTL(SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE
),
162 IOCTL(SNDRV_HDSP_IOCTL_GET_VERSION
),
163 IOCTL(SNDRV_HDSP_IOCTL_GET_MIXER
),
164 IOCTL(SNDRV_HDSP_IOCTL_GET_9632_AEB
),
165 IOCTL(SNDRV_HDSPM_IOCTL_GET_VERSION
),
166 IOCTL(SNDRV_HDSPM_IOCTL_GET_MIXER
),
167 IOCTL(SNDRV_SB_CSP_IOCTL_INFO
),
168 IOCTL(SNDRV_SB_CSP_IOCTL_LOAD_CODE
),
169 IOCTL(SNDRV_SB_CSP_IOCTL_UNLOAD_CODE
),
170 IOCTL(SNDRV_SB_CSP_IOCTL_START
),
171 IOCTL(SNDRV_SB_CSP_IOCTL_STOP
),
172 IOCTL(SNDRV_SB_CSP_IOCTL_PAUSE
),
173 IOCTL(SNDRV_SB_CSP_IOCTL_RESTART
),
174 IOCTL(SNDRV_EMUX_IOCTL_VERSION
),
175 IOCTL(SNDRV_EMUX_IOCTL_LOAD_PATCH
),
176 IOCTL(SNDRV_EMUX_IOCTL_RESET_SAMPLES
),
177 IOCTL(SNDRV_EMUX_IOCTL_REMOVE_LAST_SAMPLES
),
178 IOCTL(SNDRV_EMUX_IOCTL_MEM_AVAIL
),
179 IOCTL(SNDRV_EMUX_IOCTL_MISC_MODE
),
182 IOCTL(SNDRV_EMU10K1_IOCTL_INFO),
183 IOCTL(SNDRV_EMU10K1_IOCTL_CODE_POKE),
184 IOCTL(SNDRV_EMU10K1_IOCTL_CODE_PEEK),
185 IOCTL(SNDRV_EMU10K1_IOCTL_TRAM_SETUP),
186 IOCTL(SNDRV_EMU10K1_IOCTL_TRAM_POKE),
187 IOCTL(SNDRV_EMU10K1_IOCTL_TRAM_PEEK),
188 IOCTL(SNDRV_EMU10K1_IOCTL_PCM_POKE),
189 IOCTL(SNDRV_EMU10K1_IOCTL_PCM_PEEK),
190 IOCTL(SNDRV_EMU10K1_IOCTL_PVERSION),
191 IOCTL(SNDRV_EMU10K1_IOCTL_STOP),
192 IOCTL(SNDRV_EMU10K1_IOCTL_CONTINUE),
193 IOCTL(SNDRV_EMU10K1_IOCTL_ZERO_TRAM_COUNTER),
194 IOCTL(SNDRV_EMU10K1_IOCTL_SINGLE_STEP),
195 IOCTL(SNDRV_EMU10K1_IOCTL_DBG_READ),
197 { .name
= "SNDRV_EMU10K1_IOCTL_INFO", .request
= _IOC(_IOC_NONE
,'H',0x10,0), },
198 { .name
= "SNDRV_EMU10K1_IOCTL_CODE_POKE", .request
= _IOC(_IOC_NONE
,'H',0x11,0), },
199 { .name
= "SNDRV_EMU10K1_IOCTL_CODE_PEEK", .request
= _IOC(_IOC_NONE
,'H',0x12,0), },
200 { .name
= "SNDRV_EMU10K1_IOCTL_TRAM_SETUP", .request
= _IOC(_IOC_NONE
,'H',0x20,0), },
201 { .name
= "SNDRV_EMU10K1_IOCTL_TRAM_POKE", .request
= _IOC(_IOC_NONE
,'H',0x21,0), },
202 { .name
= "SNDRV_EMU10K1_IOCTL_TRAM_PEEK", .request
= _IOC(_IOC_NONE
,'H',0x22,0), },
203 { .name
= "SNDRV_EMU10K1_IOCTL_PCM_POKE", .request
= _IOC(_IOC_NONE
,'H',0x30,0), },
204 { .name
= "SNDRV_EMU10K1_IOCTL_PCM_PEEK", .request
= _IOC(_IOC_NONE
,'H',0x31,0), },
205 { .name
= "SNDRV_EMU10K1_IOCTL_PVERSION", .request
= _IOC(_IOC_NONE
,'H',0x40,0), },
206 { .name
= "SNDRV_EMU10K1_IOCTL_STOP", .request
= _IOC(_IOC_NONE
,'H',0x80,0), },
207 { .name
= "SNDRV_EMU10K1_IOCTL_CONTINUE", .request
= _IOC(_IOC_NONE
,'H',0x81,0), },
208 { .name
= "SNDRV_EMU10K1_IOCTL_ZERO_TRAM_COUNTER", .request
= _IOC(_IOC_NONE
,'H',0x82,0), },
209 { .name
= "SNDRV_EMU10K1_IOCTL_SINGLE_STEP", .request
= _IOC(_IOC_NONE
,'H',0x83,0), },
210 { .name
= "SNDRV_EMU10K1_IOCTL_DBG_READ", .request
= _IOC(_IOC_NONE
,'H',0x84,0), },
212 #ifdef USE_SNDDRV_COMPRESS_OFFLOAD
213 IOCTL(SNDRV_COMPRESS_IOCTL_VERSION
),
214 IOCTL(SNDRV_COMPRESS_GET_CAPS
),
215 IOCTL(SNDRV_COMPRESS_GET_CODEC_CAPS
),
216 IOCTL(SNDRV_COMPRESS_SET_PARAMS
),
217 IOCTL(SNDRV_COMPRESS_GET_PARAMS
),
218 #ifdef SNDRV_COMPRESS_SET_METADATA
219 IOCTL(SNDRV_COMPRESS_SET_METADATA
),
221 #ifdef SNDRV_COMPRESS_GET_METADATA
222 IOCTL(SNDRV_COMPRESS_GET_METADATA
),
224 IOCTL(SNDRV_COMPRESS_TSTAMP
),
225 IOCTL(SNDRV_COMPRESS_AVAIL
),
226 IOCTL(SNDRV_COMPRESS_PAUSE
),
227 IOCTL(SNDRV_COMPRESS_RESUME
),
228 IOCTL(SNDRV_COMPRESS_START
),
229 IOCTL(SNDRV_COMPRESS_STOP
),
230 IOCTL(SNDRV_COMPRESS_DRAIN
),
231 #ifdef SNDRV_COMPRESS_NEXT_TRACK
232 IOCTL(SNDRV_COMPRESS_NEXT_TRACK
),
234 #ifdef SNDRV_COMPRESS_PARTIAL_DRAIN
235 IOCTL(SNDRV_COMPRESS_PARTIAL_DRAIN
),
237 #endif /* USE_SNDDRV_COMPRESS_OFFLOAD */
240 static const char *const sound_devs
[] = {
245 static const struct ioctl_group sound_grp
= {
248 .devs_cnt
= ARRAY_SIZE(sound_devs
),
249 .sanitise
= pick_random_ioctl
,
250 .ioctls
= sound_ioctls
,
251 .ioctls_cnt
= ARRAY_SIZE(sound_ioctls
),
254 REG_IOCTL_GROUP(sound_grp
)