Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/pci/mixart/mixart_core.h
26424 views
1
/* SPDX-License-Identifier: GPL-2.0-or-later */
2
/*
3
* Driver for Digigram miXart soundcards
4
*
5
* low level interface with interrupt handling and mail box implementation
6
*
7
* Copyright (c) 2003 by Digigram <[email protected]>
8
*/
9
10
#ifndef __SOUND_MIXART_CORE_H
11
#define __SOUND_MIXART_CORE_H
12
13
14
enum mixart_message_id {
15
MSG_CONNECTOR_GET_AUDIO_INFO = 0x050008,
16
MSG_CONNECTOR_GET_OUT_AUDIO_LEVEL = 0x050009,
17
MSG_CONNECTOR_SET_OUT_AUDIO_LEVEL = 0x05000A,
18
19
MSG_CONSOLE_MANAGER = 0x070000,
20
MSG_CONSOLE_GET_CLOCK_UID = 0x070003,
21
22
MSG_PHYSICALIO_SET_LEVEL = 0x0F0008,
23
24
MSG_STREAM_ADD_INPUT_GROUP = 0x130000,
25
MSG_STREAM_ADD_OUTPUT_GROUP = 0x130001,
26
MSG_STREAM_DELETE_GROUP = 0x130004,
27
MSG_STREAM_START_STREAM_GRP_PACKET = 0x130006,
28
MSG_STREAM_START_INPUT_STAGE_PACKET = 0x130007,
29
MSG_STREAM_START_OUTPUT_STAGE_PACKET = 0x130008,
30
MSG_STREAM_STOP_STREAM_GRP_PACKET = 0x130009,
31
MSG_STREAM_STOP_INPUT_STAGE_PACKET = 0x13000A,
32
MSG_STREAM_STOP_OUTPUT_STAGE_PACKET = 0x13000B,
33
MSG_STREAM_SET_INPUT_STAGE_PARAM = 0x13000F,
34
MSG_STREAM_SET_OUTPUT_STAGE_PARAM = 0x130010,
35
MSG_STREAM_SET_IN_AUDIO_LEVEL = 0x130015,
36
MSG_STREAM_SET_OUT_STREAM_LEVEL = 0x130017,
37
38
MSG_SYSTEM_FIRST_ID = 0x160000,
39
MSG_SYSTEM_ENUM_PHYSICAL_IO = 0x16000E,
40
MSG_SYSTEM_ENUM_PLAY_CONNECTOR = 0x160017,
41
MSG_SYSTEM_ENUM_RECORD_CONNECTOR = 0x160018,
42
MSG_SYSTEM_WAIT_SYNCHRO_CMD = 0x16002C,
43
MSG_SYSTEM_SEND_SYNCHRO_CMD = 0x16002D,
44
45
MSG_SERVICES_TIMER_NOTIFY = 0x1D0404,
46
MSG_SERVICES_REPORT_TRACES = 0x1D0700,
47
48
MSG_CLOCK_CHECK_PROPERTIES = 0x200001,
49
MSG_CLOCK_SET_PROPERTIES = 0x200002,
50
};
51
52
#define MSG_DEFAULT_SIZE 512
53
54
struct mixart_msg
55
{
56
u32 message_id;
57
struct mixart_uid uid;
58
void* data;
59
size_t size;
60
};
61
62
/* structs used to communicate with miXart */
63
64
struct mixart_enum_connector_resp
65
{
66
u32 error_code;
67
u32 first_uid_offset;
68
u32 uid_count;
69
u32 current_uid_index;
70
struct mixart_uid uid[MIXART_MAX_PHYS_CONNECTORS];
71
} __packed;
72
73
74
/* used for following struct */
75
#define MIXART_FLOAT_P_22_0_TO_HEX 0x41b00000 /* 22.0f */
76
#define MIXART_FLOAT_M_20_0_TO_HEX 0xc1a00000 /* -20.0f */
77
#define MIXART_FLOAT____0_0_TO_HEX 0x00000000 /* 0.0f */
78
79
struct mixart_audio_info_req
80
{
81
u32 line_max_level; /* float */
82
u32 micro_max_level; /* float */
83
u32 cd_max_level; /* float */
84
} __packed;
85
86
struct mixart_analog_hw_info
87
{
88
u32 is_present;
89
u32 hw_connection_type;
90
u32 max_level; /* float */
91
u32 min_var_level; /* float */
92
u32 max_var_level; /* float */
93
u32 step_var_level; /* float */
94
u32 fix_gain; /* float */
95
u32 zero_var; /* float */
96
} __packed;
97
98
struct mixart_digital_hw_info
99
{
100
u32 hw_connection_type;
101
u32 presence;
102
u32 clock;
103
u32 reserved;
104
} __packed;
105
106
struct mixart_analog_info
107
{
108
u32 type_mask;
109
struct mixart_analog_hw_info micro_info;
110
struct mixart_analog_hw_info line_info;
111
struct mixart_analog_hw_info cd_info;
112
u32 analog_level_present;
113
} __packed;
114
115
struct mixart_digital_info
116
{
117
u32 type_mask;
118
struct mixart_digital_hw_info aes_info;
119
struct mixart_digital_hw_info adat_info;
120
} __packed;
121
122
struct mixart_audio_info
123
{
124
u32 clock_type_mask;
125
struct mixart_analog_info analog_info;
126
struct mixart_digital_info digital_info;
127
} __packed;
128
129
struct mixart_audio_info_resp
130
{
131
u32 txx_status;
132
struct mixart_audio_info info;
133
} __packed;
134
135
136
/* used for nb_bytes_max_per_sample */
137
#define MIXART_FLOAT_P__4_0_TO_HEX 0x40800000 /* +4.0f */
138
#define MIXART_FLOAT_P__8_0_TO_HEX 0x41000000 /* +8.0f */
139
140
struct mixart_stream_info
141
{
142
u32 size_max_byte_frame;
143
u32 size_max_sample_frame;
144
u32 nb_bytes_max_per_sample; /* float */
145
} __packed;
146
147
/* MSG_STREAM_ADD_INPUT_GROUP */
148
/* MSG_STREAM_ADD_OUTPUT_GROUP */
149
150
struct mixart_streaming_group_req
151
{
152
u32 stream_count;
153
u32 channel_count;
154
u32 user_grp_number;
155
u32 first_phys_audio;
156
u32 latency;
157
struct mixart_stream_info stream_info[32];
158
struct mixart_uid connector;
159
u32 flow_entry[32];
160
} __packed;
161
162
struct mixart_stream_desc
163
{
164
struct mixart_uid stream_uid;
165
u32 stream_desc;
166
} __packed;
167
168
struct mixart_streaming_group
169
{
170
u32 status;
171
struct mixart_uid group;
172
u32 pipe_desc;
173
u32 stream_count;
174
struct mixart_stream_desc stream[32];
175
} __packed;
176
177
/* MSG_STREAM_DELETE_GROUP */
178
179
/* request : mixart_uid_t group */
180
181
struct mixart_delete_group_resp
182
{
183
u32 status;
184
u32 unused[2];
185
} __packed;
186
187
188
/* MSG_STREAM_START_INPUT_STAGE_PACKET = 0x130000 + 7,
189
MSG_STREAM_START_OUTPUT_STAGE_PACKET = 0x130000 + 8,
190
MSG_STREAM_STOP_INPUT_STAGE_PACKET = 0x130000 + 10,
191
MSG_STREAM_STOP_OUTPUT_STAGE_PACKET = 0x130000 + 11,
192
*/
193
194
struct mixart_fx_couple_uid
195
{
196
struct mixart_uid uid_fx_code;
197
struct mixart_uid uid_fx_data;
198
} __packed;
199
200
struct mixart_txx_stream_desc
201
{
202
struct mixart_uid uid_pipe;
203
u32 stream_idx;
204
u32 fx_number;
205
struct mixart_fx_couple_uid uid_fx[4];
206
} __packed;
207
208
struct mixart_flow_info
209
{
210
struct mixart_txx_stream_desc stream_desc;
211
u32 flow_entry;
212
u32 flow_phy_addr;
213
} __packed;
214
215
struct mixart_stream_state_req
216
{
217
u32 delayed;
218
u64 scheduler;
219
u32 reserved4np[3];
220
u32 stream_count; /* set to 1 for instance */
221
struct mixart_flow_info stream_info; /* could be an array[stream_count] */
222
} __packed;
223
224
/* MSG_STREAM_START_STREAM_GRP_PACKET = 0x130000 + 6
225
MSG_STREAM_STOP_STREAM_GRP_PACKET = 0x130000 + 9
226
*/
227
228
struct mixart_group_state_req
229
{
230
u32 delayed;
231
u64 scheduler;
232
u32 reserved4np[2];
233
u32 pipe_count; /* set to 1 for instance */
234
struct mixart_uid pipe_uid; /* could be an array[pipe_count], in theory */
235
} __packed;
236
237
struct mixart_group_state_resp
238
{
239
u32 txx_status;
240
u64 scheduler;
241
} __packed;
242
243
244
245
/* Structures used by the MSG_SERVICES_TIMER_NOTIFY command */
246
247
struct mixart_sample_pos
248
{
249
u32 buffer_id;
250
u32 validity;
251
u32 sample_pos_high_part;
252
u32 sample_pos_low_part;
253
} __packed;
254
255
/*
256
* This structure is limited by the size of MSG_DEFAULT_SIZE. Instead of
257
* having MIXART_MAX_STREAM_PER_CARD * MIXART_MAX_CARDS many streams,
258
* this is capped to have a total size below MSG_DEFAULT_SIZE.
259
*/
260
#define MIXART_MAX_TIMER_NOTIFY_STREAMS \
261
((MSG_DEFAULT_SIZE - sizeof(u32)) / sizeof(struct mixart_sample_pos))
262
struct mixart_timer_notify
263
{
264
u32 stream_count;
265
struct mixart_sample_pos streams[MIXART_MAX_TIMER_NOTIFY_STREAMS];
266
} __packed;
267
268
269
/* MSG_CONSOLE_GET_CLOCK_UID = 0x070003,
270
*/
271
272
/* request is a uid with desc = MSG_CONSOLE_MANAGER | cardindex */
273
274
struct mixart_return_uid
275
{
276
u32 error_code;
277
struct mixart_uid uid;
278
} __packed;
279
280
/* MSG_CLOCK_CHECK_PROPERTIES = 0x200001,
281
MSG_CLOCK_SET_PROPERTIES = 0x200002,
282
*/
283
284
enum mixart_clock_generic_type {
285
CGT_NO_CLOCK,
286
CGT_INTERNAL_CLOCK,
287
CGT_PROGRAMMABLE_CLOCK,
288
CGT_INTERNAL_ENSLAVED_CLOCK,
289
CGT_EXTERNAL_CLOCK,
290
CGT_CURRENT_CLOCK
291
};
292
293
enum mixart_clock_mode {
294
CM_UNDEFINED,
295
CM_MASTER,
296
CM_SLAVE,
297
CM_STANDALONE,
298
CM_NOT_CONCERNED
299
};
300
301
302
struct mixart_clock_properties
303
{
304
u32 error_code;
305
u32 validation_mask;
306
u32 frequency;
307
u32 reference_frequency;
308
u32 clock_generic_type;
309
u32 clock_mode;
310
struct mixart_uid uid_clock_source;
311
struct mixart_uid uid_event_source;
312
u32 event_mode;
313
u32 synchro_signal_presence;
314
u32 format;
315
u32 board_mask;
316
u32 nb_callers; /* set to 1 (see below) */
317
struct mixart_uid uid_caller;
318
} __packed;
319
320
struct mixart_clock_properties_resp
321
{
322
u32 status;
323
u32 clock_mode;
324
} __packed;
325
326
327
/* MSG_STREAM_SET_INPUT_STAGE_PARAM = 0x13000F */
328
/* MSG_STREAM_SET_OUTPUT_STAGE_PARAM = 0x130010 */
329
330
enum mixart_coding_type {
331
CT_NOT_DEFINED,
332
CT_LINEAR,
333
CT_MPEG_L1,
334
CT_MPEG_L2,
335
CT_MPEG_L3,
336
CT_MPEG_L3_LSF,
337
CT_GSM
338
};
339
enum mixart_sample_type {
340
ST_NOT_DEFINED,
341
ST_FLOATING_POINT_32BE,
342
ST_FLOATING_POINT_32LE,
343
ST_FLOATING_POINT_64BE,
344
ST_FLOATING_POINT_64LE,
345
ST_FIXED_POINT_8,
346
ST_FIXED_POINT_16BE,
347
ST_FIXED_POINT_16LE,
348
ST_FIXED_POINT_24BE,
349
ST_FIXED_POINT_24LE,
350
ST_FIXED_POINT_32BE,
351
ST_FIXED_POINT_32LE,
352
ST_INTEGER_8,
353
ST_INTEGER_16BE,
354
ST_INTEGER_16LE,
355
ST_INTEGER_24BE,
356
ST_INTEGER_24LE,
357
ST_INTEGER_32BE,
358
ST_INTEGER_32LE
359
};
360
361
struct mixart_stream_param_desc
362
{
363
u32 coding_type; /* use enum mixart_coding_type */
364
u32 sample_type; /* use enum mixart_sample_type */
365
366
union {
367
struct {
368
u32 linear_endian_ness;
369
u32 linear_bits;
370
u32 is_signed;
371
u32 is_float;
372
} linear_format_info;
373
374
struct {
375
u32 mpeg_layer;
376
u32 mpeg_mode;
377
u32 mpeg_mode_extension;
378
u32 mpeg_pre_emphasis;
379
u32 mpeg_has_padding_bit;
380
u32 mpeg_has_crc;
381
u32 mpeg_has_extension;
382
u32 mpeg_is_original;
383
u32 mpeg_has_copyright;
384
} mpeg_format_info;
385
} format_info;
386
387
u32 delayed;
388
u64 scheduler;
389
u32 sample_size;
390
u32 has_header;
391
u32 has_suffix;
392
u32 has_bitrate;
393
u32 samples_per_frame;
394
u32 bytes_per_frame;
395
u32 bytes_per_sample;
396
u32 sampling_freq;
397
u32 number_of_channel;
398
u32 stream_number;
399
u32 buffer_size;
400
u32 differed_time;
401
u32 reserved4np[3];
402
u32 pipe_count; /* set to 1 (array size !) */
403
u32 stream_count; /* set to 1 (array size !) */
404
struct mixart_txx_stream_desc stream_desc; /* only one stream per command, but this could be an array, in theory */
405
} __packed;
406
407
408
/* MSG_CONNECTOR_GET_OUT_AUDIO_LEVEL = 0x050009,
409
*/
410
411
412
struct mixart_get_out_audio_level
413
{
414
u32 txx_status;
415
u32 digital_level; /* float */
416
u32 analog_level; /* float */
417
u32 monitor_level; /* float */
418
u32 mute;
419
u32 monitor_mute1;
420
u32 monitor_mute2;
421
} __packed;
422
423
424
/* MSG_CONNECTOR_SET_OUT_AUDIO_LEVEL = 0x05000A,
425
*/
426
427
/* used for valid_mask below */
428
#define MIXART_AUDIO_LEVEL_ANALOG_MASK 0x01
429
#define MIXART_AUDIO_LEVEL_DIGITAL_MASK 0x02
430
#define MIXART_AUDIO_LEVEL_MONITOR_MASK 0x04
431
#define MIXART_AUDIO_LEVEL_MUTE_MASK 0x08
432
#define MIXART_AUDIO_LEVEL_MUTE_M1_MASK 0x10
433
#define MIXART_AUDIO_LEVEL_MUTE_M2_MASK 0x20
434
435
struct mixart_set_out_audio_level
436
{
437
u32 delayed;
438
u64 scheduler;
439
u32 valid_mask1;
440
u32 valid_mask2;
441
u32 digital_level; /* float */
442
u32 analog_level; /* float */
443
u32 monitor_level; /* float */
444
u32 mute;
445
u32 monitor_mute1;
446
u32 monitor_mute2;
447
u32 reserved4np;
448
} __packed;
449
450
451
/* MSG_SYSTEM_ENUM_PHYSICAL_IO = 0x16000E,
452
*/
453
454
#define MIXART_MAX_PHYS_IO (MIXART_MAX_CARDS * 2 * 2) /* 4 * (analog+digital) * (playback+capture) */
455
456
struct mixart_uid_enumeration
457
{
458
u32 error_code;
459
u32 first_uid_offset;
460
u32 nb_uid;
461
u32 current_uid_index;
462
struct mixart_uid uid[MIXART_MAX_PHYS_IO];
463
} __packed;
464
465
466
/* MSG_PHYSICALIO_SET_LEVEL = 0x0F0008,
467
MSG_PHYSICALIO_GET_LEVEL = 0x0F000C,
468
*/
469
470
struct mixart_io_channel_level
471
{
472
u32 analog_level; /* float */
473
u32 unused[2];
474
} __packed;
475
476
struct mixart_io_level
477
{
478
s32 channel; /* 0=left, 1=right, -1=both, -2=both same */
479
struct mixart_io_channel_level level[2];
480
} __packed;
481
482
483
/* MSG_STREAM_SET_IN_AUDIO_LEVEL = 0x130015,
484
*/
485
486
struct mixart_in_audio_level_info
487
{
488
struct mixart_uid connector;
489
u32 valid_mask1;
490
u32 valid_mask2;
491
u32 digital_level;
492
u32 analog_level;
493
} __packed;
494
495
struct mixart_set_in_audio_level_req
496
{
497
u32 delayed;
498
u64 scheduler;
499
u32 audio_count; /* set to <= 2 */
500
u32 reserved4np;
501
struct mixart_in_audio_level_info level[2];
502
} __packed;
503
504
/* response is a 32 bit status */
505
506
507
/* MSG_STREAM_SET_OUT_STREAM_LEVEL = 0x130017,
508
*/
509
510
/* defines used for valid_mask1 */
511
#define MIXART_OUT_STREAM_SET_LEVEL_LEFT_AUDIO1 0x01
512
#define MIXART_OUT_STREAM_SET_LEVEL_LEFT_AUDIO2 0x02
513
#define MIXART_OUT_STREAM_SET_LEVEL_RIGHT_AUDIO1 0x04
514
#define MIXART_OUT_STREAM_SET_LEVEL_RIGHT_AUDIO2 0x08
515
#define MIXART_OUT_STREAM_SET_LEVEL_STREAM_1 0x10
516
#define MIXART_OUT_STREAM_SET_LEVEL_STREAM_2 0x20
517
#define MIXART_OUT_STREAM_SET_LEVEL_MUTE_1 0x40
518
#define MIXART_OUT_STREAM_SET_LEVEL_MUTE_2 0x80
519
520
struct mixart_out_stream_level_info
521
{
522
u32 valid_mask1;
523
u32 valid_mask2;
524
u32 left_to_out1_level;
525
u32 left_to_out2_level;
526
u32 right_to_out1_level;
527
u32 right_to_out2_level;
528
u32 digital_level1;
529
u32 digital_level2;
530
u32 mute1;
531
u32 mute2;
532
} __packed;
533
534
struct mixart_set_out_stream_level
535
{
536
struct mixart_txx_stream_desc desc;
537
struct mixart_out_stream_level_info out_level;
538
} __packed;
539
540
struct mixart_set_out_stream_level_req
541
{
542
u32 delayed;
543
u64 scheduler;
544
u32 reserved4np[2];
545
u32 nb_of_stream; /* set to 1 */
546
struct mixart_set_out_stream_level stream_level; /* could be an array */
547
} __packed;
548
549
/* response to this request is a u32 status value */
550
551
552
/* exported */
553
void snd_mixart_init_mailbox(struct mixart_mgr *mgr);
554
void snd_mixart_exit_mailbox(struct mixart_mgr *mgr);
555
556
int snd_mixart_send_msg(struct mixart_mgr *mgr, struct mixart_msg *request, int max_resp_size, void *resp_data);
557
int snd_mixart_send_msg_wait_notif(struct mixart_mgr *mgr, struct mixart_msg *request, u32 notif_event);
558
int snd_mixart_send_msg_nonblock(struct mixart_mgr *mgr, struct mixart_msg *request);
559
560
irqreturn_t snd_mixart_interrupt(int irq, void *dev_id);
561
irqreturn_t snd_mixart_threaded_irq(int irq, void *dev_id);
562
563
void snd_mixart_reset_board(struct mixart_mgr *mgr);
564
565
#endif /* __SOUND_MIXART_CORE_H */
566
567