~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/pci/mixart/mixart_core.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 <alsa@digigram.com>
  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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php