11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * Driver for Digigram miXart soundcards 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * low level interface with interrupt handling and mail box implementation 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds * Copyright (c) 2003 by Digigram <alsa@digigram.com> 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds #ifndef __SOUND_MIXART_CORE_H 111da177e4SLinus Torvalds #define __SOUND_MIXART_CORE_H 121da177e4SLinus Torvalds 131da177e4SLinus Torvalds 141da177e4SLinus Torvalds enum mixart_message_id { 151da177e4SLinus Torvalds MSG_CONNECTOR_GET_AUDIO_INFO = 0x050008, 161da177e4SLinus Torvalds MSG_CONNECTOR_GET_OUT_AUDIO_LEVEL = 0x050009, 171da177e4SLinus Torvalds MSG_CONNECTOR_SET_OUT_AUDIO_LEVEL = 0x05000A, 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds MSG_CONSOLE_MANAGER = 0x070000, 201da177e4SLinus Torvalds MSG_CONSOLE_GET_CLOCK_UID = 0x070003, 211da177e4SLinus Torvalds 221da177e4SLinus Torvalds MSG_PHYSICALIO_SET_LEVEL = 0x0F0008, 231da177e4SLinus Torvalds 241da177e4SLinus Torvalds MSG_STREAM_ADD_INPUT_GROUP = 0x130000, 251da177e4SLinus Torvalds MSG_STREAM_ADD_OUTPUT_GROUP = 0x130001, 261da177e4SLinus Torvalds MSG_STREAM_DELETE_GROUP = 0x130004, 271da177e4SLinus Torvalds MSG_STREAM_START_STREAM_GRP_PACKET = 0x130006, 281da177e4SLinus Torvalds MSG_STREAM_START_INPUT_STAGE_PACKET = 0x130007, 291da177e4SLinus Torvalds MSG_STREAM_START_OUTPUT_STAGE_PACKET = 0x130008, 301da177e4SLinus Torvalds MSG_STREAM_STOP_STREAM_GRP_PACKET = 0x130009, 311da177e4SLinus Torvalds MSG_STREAM_STOP_INPUT_STAGE_PACKET = 0x13000A, 321da177e4SLinus Torvalds MSG_STREAM_STOP_OUTPUT_STAGE_PACKET = 0x13000B, 331da177e4SLinus Torvalds MSG_STREAM_SET_INPUT_STAGE_PARAM = 0x13000F, 341da177e4SLinus Torvalds MSG_STREAM_SET_OUTPUT_STAGE_PARAM = 0x130010, 351da177e4SLinus Torvalds MSG_STREAM_SET_IN_AUDIO_LEVEL = 0x130015, 361da177e4SLinus Torvalds MSG_STREAM_SET_OUT_STREAM_LEVEL = 0x130017, 371da177e4SLinus Torvalds 381da177e4SLinus Torvalds MSG_SYSTEM_FIRST_ID = 0x160000, 391da177e4SLinus Torvalds MSG_SYSTEM_ENUM_PHYSICAL_IO = 0x16000E, 401da177e4SLinus Torvalds MSG_SYSTEM_ENUM_PLAY_CONNECTOR = 0x160017, 411da177e4SLinus Torvalds MSG_SYSTEM_ENUM_RECORD_CONNECTOR = 0x160018, 421da177e4SLinus Torvalds MSG_SYSTEM_WAIT_SYNCHRO_CMD = 0x16002C, 431da177e4SLinus Torvalds MSG_SYSTEM_SEND_SYNCHRO_CMD = 0x16002D, 441da177e4SLinus Torvalds 451da177e4SLinus Torvalds MSG_SERVICES_TIMER_NOTIFY = 0x1D0404, 461da177e4SLinus Torvalds MSG_SERVICES_REPORT_TRACES = 0x1D0700, 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds MSG_CLOCK_CHECK_PROPERTIES = 0x200001, 491da177e4SLinus Torvalds MSG_CLOCK_SET_PROPERTIES = 0x200002, 501da177e4SLinus Torvalds }; 511da177e4SLinus Torvalds 52c7d58971SKees Cook #define MSG_DEFAULT_SIZE 512 531da177e4SLinus Torvalds 541da177e4SLinus Torvalds struct mixart_msg 551da177e4SLinus Torvalds { 561da177e4SLinus Torvalds u32 message_id; 5767b48b88STakashi Iwai struct mixart_uid uid; 581da177e4SLinus Torvalds void* data; 591da177e4SLinus Torvalds size_t size; 601da177e4SLinus Torvalds }; 611da177e4SLinus Torvalds 621da177e4SLinus Torvalds /* structs used to communicate with miXart */ 631da177e4SLinus Torvalds 641da177e4SLinus Torvalds struct mixart_enum_connector_resp 651da177e4SLinus Torvalds { 661da177e4SLinus Torvalds u32 error_code; 671da177e4SLinus Torvalds u32 first_uid_offset; 681da177e4SLinus Torvalds u32 uid_count; 691da177e4SLinus Torvalds u32 current_uid_index; 7067b48b88STakashi Iwai struct mixart_uid uid[MIXART_MAX_PHYS_CONNECTORS]; 711da177e4SLinus Torvalds } __attribute__((packed)); 721da177e4SLinus Torvalds 731da177e4SLinus Torvalds 741da177e4SLinus Torvalds /* used for following struct */ 751da177e4SLinus Torvalds #define MIXART_FLOAT_P_22_0_TO_HEX 0x41b00000 /* 22.0f */ 761da177e4SLinus Torvalds #define MIXART_FLOAT_M_20_0_TO_HEX 0xc1a00000 /* -20.0f */ 771da177e4SLinus Torvalds #define MIXART_FLOAT____0_0_TO_HEX 0x00000000 /* 0.0f */ 781da177e4SLinus Torvalds 791da177e4SLinus Torvalds struct mixart_audio_info_req 801da177e4SLinus Torvalds { 811da177e4SLinus Torvalds u32 line_max_level; /* float */ 821da177e4SLinus Torvalds u32 micro_max_level; /* float */ 831da177e4SLinus Torvalds u32 cd_max_level; /* float */ 841da177e4SLinus Torvalds } __attribute__((packed)); 851da177e4SLinus Torvalds 861da177e4SLinus Torvalds struct mixart_analog_hw_info 871da177e4SLinus Torvalds { 881da177e4SLinus Torvalds u32 is_present; 891da177e4SLinus Torvalds u32 hw_connection_type; 901da177e4SLinus Torvalds u32 max_level; /* float */ 911da177e4SLinus Torvalds u32 min_var_level; /* float */ 921da177e4SLinus Torvalds u32 max_var_level; /* float */ 931da177e4SLinus Torvalds u32 step_var_level; /* float */ 941da177e4SLinus Torvalds u32 fix_gain; /* float */ 951da177e4SLinus Torvalds u32 zero_var; /* float */ 961da177e4SLinus Torvalds } __attribute__((packed)); 971da177e4SLinus Torvalds 981da177e4SLinus Torvalds struct mixart_digital_hw_info 991da177e4SLinus Torvalds { 1001da177e4SLinus Torvalds u32 hw_connection_type; 1011da177e4SLinus Torvalds u32 presence; 1021da177e4SLinus Torvalds u32 clock; 1031da177e4SLinus Torvalds u32 reserved; 1041da177e4SLinus Torvalds } __attribute__((packed)); 1051da177e4SLinus Torvalds 1061da177e4SLinus Torvalds struct mixart_analog_info 1071da177e4SLinus Torvalds { 1081da177e4SLinus Torvalds u32 type_mask; 10967b48b88STakashi Iwai struct mixart_analog_hw_info micro_info; 11067b48b88STakashi Iwai struct mixart_analog_hw_info line_info; 11167b48b88STakashi Iwai struct mixart_analog_hw_info cd_info; 1121da177e4SLinus Torvalds u32 analog_level_present; 1131da177e4SLinus Torvalds } __attribute__((packed)); 1141da177e4SLinus Torvalds 1151da177e4SLinus Torvalds struct mixart_digital_info 1161da177e4SLinus Torvalds { 1171da177e4SLinus Torvalds u32 type_mask; 11867b48b88STakashi Iwai struct mixart_digital_hw_info aes_info; 11967b48b88STakashi Iwai struct mixart_digital_hw_info adat_info; 1201da177e4SLinus Torvalds } __attribute__((packed)); 1211da177e4SLinus Torvalds 1221da177e4SLinus Torvalds struct mixart_audio_info 1231da177e4SLinus Torvalds { 1241da177e4SLinus Torvalds u32 clock_type_mask; 12567b48b88STakashi Iwai struct mixart_analog_info analog_info; 12667b48b88STakashi Iwai struct mixart_digital_info digital_info; 1271da177e4SLinus Torvalds } __attribute__((packed)); 1281da177e4SLinus Torvalds 1291da177e4SLinus Torvalds struct mixart_audio_info_resp 1301da177e4SLinus Torvalds { 1311da177e4SLinus Torvalds u32 txx_status; 13267b48b88STakashi Iwai struct mixart_audio_info info; 1331da177e4SLinus Torvalds } __attribute__((packed)); 1341da177e4SLinus Torvalds 1351da177e4SLinus Torvalds 1361da177e4SLinus Torvalds /* used for nb_bytes_max_per_sample */ 1371da177e4SLinus Torvalds #define MIXART_FLOAT_P__4_0_TO_HEX 0x40800000 /* +4.0f */ 1381da177e4SLinus Torvalds #define MIXART_FLOAT_P__8_0_TO_HEX 0x41000000 /* +8.0f */ 1391da177e4SLinus Torvalds 1401da177e4SLinus Torvalds struct mixart_stream_info 1411da177e4SLinus Torvalds { 1421da177e4SLinus Torvalds u32 size_max_byte_frame; 1431da177e4SLinus Torvalds u32 size_max_sample_frame; 1441da177e4SLinus Torvalds u32 nb_bytes_max_per_sample; /* float */ 1451da177e4SLinus Torvalds } __attribute__((packed)); 1461da177e4SLinus Torvalds 1471da177e4SLinus Torvalds /* MSG_STREAM_ADD_INPUT_GROUP */ 1481da177e4SLinus Torvalds /* MSG_STREAM_ADD_OUTPUT_GROUP */ 1491da177e4SLinus Torvalds 1501da177e4SLinus Torvalds struct mixart_streaming_group_req 1511da177e4SLinus Torvalds { 1521da177e4SLinus Torvalds u32 stream_count; 1531da177e4SLinus Torvalds u32 channel_count; 1541da177e4SLinus Torvalds u32 user_grp_number; 1551da177e4SLinus Torvalds u32 first_phys_audio; 1561da177e4SLinus Torvalds u32 latency; 15767b48b88STakashi Iwai struct mixart_stream_info stream_info[32]; 15867b48b88STakashi Iwai struct mixart_uid connector; 1591da177e4SLinus Torvalds u32 flow_entry[32]; 1601da177e4SLinus Torvalds } __attribute__((packed)); 1611da177e4SLinus Torvalds 1621da177e4SLinus Torvalds struct mixart_stream_desc 1631da177e4SLinus Torvalds { 16467b48b88STakashi Iwai struct mixart_uid stream_uid; 1651da177e4SLinus Torvalds u32 stream_desc; 1661da177e4SLinus Torvalds } __attribute__((packed)); 1671da177e4SLinus Torvalds 1681da177e4SLinus Torvalds struct mixart_streaming_group 1691da177e4SLinus Torvalds { 1701da177e4SLinus Torvalds u32 status; 17167b48b88STakashi Iwai struct mixart_uid group; 1721da177e4SLinus Torvalds u32 pipe_desc; 1731da177e4SLinus Torvalds u32 stream_count; 17467b48b88STakashi Iwai struct mixart_stream_desc stream[32]; 1751da177e4SLinus Torvalds } __attribute__((packed)); 1761da177e4SLinus Torvalds 1771da177e4SLinus Torvalds /* MSG_STREAM_DELETE_GROUP */ 1781da177e4SLinus Torvalds 1791da177e4SLinus Torvalds /* request : mixart_uid_t group */ 1801da177e4SLinus Torvalds 1811da177e4SLinus Torvalds struct mixart_delete_group_resp 1821da177e4SLinus Torvalds { 1831da177e4SLinus Torvalds u32 status; 1841da177e4SLinus Torvalds u32 unused[2]; 1851da177e4SLinus Torvalds } __attribute__((packed)); 1861da177e4SLinus Torvalds 1871da177e4SLinus Torvalds 1881da177e4SLinus Torvalds /* MSG_STREAM_START_INPUT_STAGE_PACKET = 0x130000 + 7, 1891da177e4SLinus Torvalds MSG_STREAM_START_OUTPUT_STAGE_PACKET = 0x130000 + 8, 1901da177e4SLinus Torvalds MSG_STREAM_STOP_INPUT_STAGE_PACKET = 0x130000 + 10, 1911da177e4SLinus Torvalds MSG_STREAM_STOP_OUTPUT_STAGE_PACKET = 0x130000 + 11, 1921da177e4SLinus Torvalds */ 1931da177e4SLinus Torvalds 1941da177e4SLinus Torvalds struct mixart_fx_couple_uid 1951da177e4SLinus Torvalds { 19667b48b88STakashi Iwai struct mixart_uid uid_fx_code; 19767b48b88STakashi Iwai struct mixart_uid uid_fx_data; 1981da177e4SLinus Torvalds } __attribute__((packed)); 1991da177e4SLinus Torvalds 2001da177e4SLinus Torvalds struct mixart_txx_stream_desc 2011da177e4SLinus Torvalds { 20267b48b88STakashi Iwai struct mixart_uid uid_pipe; 2031da177e4SLinus Torvalds u32 stream_idx; 2041da177e4SLinus Torvalds u32 fx_number; 20567b48b88STakashi Iwai struct mixart_fx_couple_uid uid_fx[4]; 2061da177e4SLinus Torvalds } __attribute__((packed)); 2071da177e4SLinus Torvalds 2081da177e4SLinus Torvalds struct mixart_flow_info 2091da177e4SLinus Torvalds { 21067b48b88STakashi Iwai struct mixart_txx_stream_desc stream_desc; 2111da177e4SLinus Torvalds u32 flow_entry; 2121da177e4SLinus Torvalds u32 flow_phy_addr; 2131da177e4SLinus Torvalds } __attribute__((packed)); 2141da177e4SLinus Torvalds 2151da177e4SLinus Torvalds struct mixart_stream_state_req 2161da177e4SLinus Torvalds { 2171da177e4SLinus Torvalds u32 delayed; 2181da177e4SLinus Torvalds u64 scheduler; 2191da177e4SLinus Torvalds u32 reserved4np[3]; 2201da177e4SLinus Torvalds u32 stream_count; /* set to 1 for instance */ 22167b48b88STakashi Iwai struct mixart_flow_info stream_info; /* could be an array[stream_count] */ 2221da177e4SLinus Torvalds } __attribute__((packed)); 2231da177e4SLinus Torvalds 2241da177e4SLinus Torvalds /* MSG_STREAM_START_STREAM_GRP_PACKET = 0x130000 + 6 2251da177e4SLinus Torvalds MSG_STREAM_STOP_STREAM_GRP_PACKET = 0x130000 + 9 2261da177e4SLinus Torvalds */ 2271da177e4SLinus Torvalds 2281da177e4SLinus Torvalds struct mixart_group_state_req 2291da177e4SLinus Torvalds { 2301da177e4SLinus Torvalds u32 delayed; 2311da177e4SLinus Torvalds u64 scheduler; 2321da177e4SLinus Torvalds u32 reserved4np[2]; 2331da177e4SLinus Torvalds u32 pipe_count; /* set to 1 for instance */ 234*4040fc51SGustavo A. R. Silva struct mixart_uid pipe_uid; /* could be an array[pipe_count], in theory */ 2351da177e4SLinus Torvalds } __attribute__((packed)); 2361da177e4SLinus Torvalds 2371da177e4SLinus Torvalds struct mixart_group_state_resp 2381da177e4SLinus Torvalds { 2391da177e4SLinus Torvalds u32 txx_status; 2401da177e4SLinus Torvalds u64 scheduler; 2411da177e4SLinus Torvalds } __attribute__((packed)); 2421da177e4SLinus Torvalds 2431da177e4SLinus Torvalds 2441da177e4SLinus Torvalds 2451da177e4SLinus Torvalds /* Structures used by the MSG_SERVICES_TIMER_NOTIFY command */ 2461da177e4SLinus Torvalds 2471da177e4SLinus Torvalds struct mixart_sample_pos 2481da177e4SLinus Torvalds { 2491da177e4SLinus Torvalds u32 buffer_id; 2501da177e4SLinus Torvalds u32 validity; 2511da177e4SLinus Torvalds u32 sample_pos_high_part; 2521da177e4SLinus Torvalds u32 sample_pos_low_part; 2531da177e4SLinus Torvalds } __attribute__((packed)); 2541da177e4SLinus Torvalds 255c7d58971SKees Cook /* 256c7d58971SKees Cook * This structure is limited by the size of MSG_DEFAULT_SIZE. Instead of 257c7d58971SKees Cook * having MIXART_MAX_STREAM_PER_CARD * MIXART_MAX_CARDS many streams, 258c7d58971SKees Cook * this is capped to have a total size below MSG_DEFAULT_SIZE. 259c7d58971SKees Cook */ 260c7d58971SKees Cook #define MIXART_MAX_TIMER_NOTIFY_STREAMS \ 261c7d58971SKees Cook ((MSG_DEFAULT_SIZE - sizeof(u32)) / sizeof(struct mixart_sample_pos)) 2621da177e4SLinus Torvalds struct mixart_timer_notify 2631da177e4SLinus Torvalds { 2641da177e4SLinus Torvalds u32 stream_count; 265c7d58971SKees Cook struct mixart_sample_pos streams[MIXART_MAX_TIMER_NOTIFY_STREAMS]; 2661da177e4SLinus Torvalds } __attribute__((packed)); 2671da177e4SLinus Torvalds 2681da177e4SLinus Torvalds 2691da177e4SLinus Torvalds /* MSG_CONSOLE_GET_CLOCK_UID = 0x070003, 2701da177e4SLinus Torvalds */ 2711da177e4SLinus Torvalds 2721da177e4SLinus Torvalds /* request is a uid with desc = MSG_CONSOLE_MANAGER | cardindex */ 2731da177e4SLinus Torvalds 2741da177e4SLinus Torvalds struct mixart_return_uid 2751da177e4SLinus Torvalds { 2761da177e4SLinus Torvalds u32 error_code; 27767b48b88STakashi Iwai struct mixart_uid uid; 2781da177e4SLinus Torvalds } __attribute__((packed)); 2791da177e4SLinus Torvalds 2801da177e4SLinus Torvalds /* MSG_CLOCK_CHECK_PROPERTIES = 0x200001, 2811da177e4SLinus Torvalds MSG_CLOCK_SET_PROPERTIES = 0x200002, 2821da177e4SLinus Torvalds */ 2831da177e4SLinus Torvalds 2841da177e4SLinus Torvalds enum mixart_clock_generic_type { 2851da177e4SLinus Torvalds CGT_NO_CLOCK, 2861da177e4SLinus Torvalds CGT_INTERNAL_CLOCK, 2871da177e4SLinus Torvalds CGT_PROGRAMMABLE_CLOCK, 2881da177e4SLinus Torvalds CGT_INTERNAL_ENSLAVED_CLOCK, 2891da177e4SLinus Torvalds CGT_EXTERNAL_CLOCK, 2901da177e4SLinus Torvalds CGT_CURRENT_CLOCK 2911da177e4SLinus Torvalds }; 2921da177e4SLinus Torvalds 2931da177e4SLinus Torvalds enum mixart_clock_mode { 2941da177e4SLinus Torvalds CM_UNDEFINED, 2951da177e4SLinus Torvalds CM_MASTER, 2961da177e4SLinus Torvalds CM_SLAVE, 2971da177e4SLinus Torvalds CM_STANDALONE, 2981da177e4SLinus Torvalds CM_NOT_CONCERNED 2991da177e4SLinus Torvalds }; 3001da177e4SLinus Torvalds 3011da177e4SLinus Torvalds 3021da177e4SLinus Torvalds struct mixart_clock_properties 3031da177e4SLinus Torvalds { 3041da177e4SLinus Torvalds u32 error_code; 3051da177e4SLinus Torvalds u32 validation_mask; 3061da177e4SLinus Torvalds u32 frequency; 3071da177e4SLinus Torvalds u32 reference_frequency; 3081da177e4SLinus Torvalds u32 clock_generic_type; 3091da177e4SLinus Torvalds u32 clock_mode; 31067b48b88STakashi Iwai struct mixart_uid uid_clock_source; 31167b48b88STakashi Iwai struct mixart_uid uid_event_source; 3121da177e4SLinus Torvalds u32 event_mode; 3131da177e4SLinus Torvalds u32 synchro_signal_presence; 3141da177e4SLinus Torvalds u32 format; 3151da177e4SLinus Torvalds u32 board_mask; 3161da177e4SLinus Torvalds u32 nb_callers; /* set to 1 (see below) */ 317*4040fc51SGustavo A. R. Silva struct mixart_uid uid_caller; 3181da177e4SLinus Torvalds } __attribute__((packed)); 3191da177e4SLinus Torvalds 3201da177e4SLinus Torvalds struct mixart_clock_properties_resp 3211da177e4SLinus Torvalds { 3221da177e4SLinus Torvalds u32 status; 3231da177e4SLinus Torvalds u32 clock_mode; 3241da177e4SLinus Torvalds } __attribute__((packed)); 3251da177e4SLinus Torvalds 3261da177e4SLinus Torvalds 3271da177e4SLinus Torvalds /* MSG_STREAM_SET_INPUT_STAGE_PARAM = 0x13000F */ 3281da177e4SLinus Torvalds /* MSG_STREAM_SET_OUTPUT_STAGE_PARAM = 0x130010 */ 3291da177e4SLinus Torvalds 3301da177e4SLinus Torvalds enum mixart_coding_type { 3311da177e4SLinus Torvalds CT_NOT_DEFINED, 3321da177e4SLinus Torvalds CT_LINEAR, 3331da177e4SLinus Torvalds CT_MPEG_L1, 3341da177e4SLinus Torvalds CT_MPEG_L2, 3351da177e4SLinus Torvalds CT_MPEG_L3, 3361da177e4SLinus Torvalds CT_MPEG_L3_LSF, 3371da177e4SLinus Torvalds CT_GSM 3381da177e4SLinus Torvalds }; 3391da177e4SLinus Torvalds enum mixart_sample_type { 3401da177e4SLinus Torvalds ST_NOT_DEFINED, 3411da177e4SLinus Torvalds ST_FLOATING_POINT_32BE, 3421da177e4SLinus Torvalds ST_FLOATING_POINT_32LE, 3431da177e4SLinus Torvalds ST_FLOATING_POINT_64BE, 3441da177e4SLinus Torvalds ST_FLOATING_POINT_64LE, 3451da177e4SLinus Torvalds ST_FIXED_POINT_8, 3461da177e4SLinus Torvalds ST_FIXED_POINT_16BE, 3471da177e4SLinus Torvalds ST_FIXED_POINT_16LE, 3481da177e4SLinus Torvalds ST_FIXED_POINT_24BE, 3491da177e4SLinus Torvalds ST_FIXED_POINT_24LE, 3501da177e4SLinus Torvalds ST_FIXED_POINT_32BE, 3511da177e4SLinus Torvalds ST_FIXED_POINT_32LE, 3521da177e4SLinus Torvalds ST_INTEGER_8, 3531da177e4SLinus Torvalds ST_INTEGER_16BE, 3541da177e4SLinus Torvalds ST_INTEGER_16LE, 3551da177e4SLinus Torvalds ST_INTEGER_24BE, 3561da177e4SLinus Torvalds ST_INTEGER_24LE, 3571da177e4SLinus Torvalds ST_INTEGER_32BE, 3581da177e4SLinus Torvalds ST_INTEGER_32LE 3591da177e4SLinus Torvalds }; 3601da177e4SLinus Torvalds 3611da177e4SLinus Torvalds struct mixart_stream_param_desc 3621da177e4SLinus Torvalds { 3631da177e4SLinus Torvalds u32 coding_type; /* use enum mixart_coding_type */ 3641da177e4SLinus Torvalds u32 sample_type; /* use enum mixart_sample_type */ 3651da177e4SLinus Torvalds 3661da177e4SLinus Torvalds union { 3671da177e4SLinus Torvalds struct { 3681da177e4SLinus Torvalds u32 linear_endian_ness; 3691da177e4SLinus Torvalds u32 linear_bits; 3701da177e4SLinus Torvalds u32 is_signed; 3711da177e4SLinus Torvalds u32 is_float; 3721da177e4SLinus Torvalds } linear_format_info; 3731da177e4SLinus Torvalds 3741da177e4SLinus Torvalds struct { 3751da177e4SLinus Torvalds u32 mpeg_layer; 3761da177e4SLinus Torvalds u32 mpeg_mode; 3771da177e4SLinus Torvalds u32 mpeg_mode_extension; 3781da177e4SLinus Torvalds u32 mpeg_pre_emphasis; 3791da177e4SLinus Torvalds u32 mpeg_has_padding_bit; 3801da177e4SLinus Torvalds u32 mpeg_has_crc; 3811da177e4SLinus Torvalds u32 mpeg_has_extension; 3821da177e4SLinus Torvalds u32 mpeg_is_original; 3831da177e4SLinus Torvalds u32 mpeg_has_copyright; 3841da177e4SLinus Torvalds } mpeg_format_info; 3851da177e4SLinus Torvalds } format_info; 3861da177e4SLinus Torvalds 3871da177e4SLinus Torvalds u32 delayed; 3881da177e4SLinus Torvalds u64 scheduler; 3891da177e4SLinus Torvalds u32 sample_size; 3901da177e4SLinus Torvalds u32 has_header; 3911da177e4SLinus Torvalds u32 has_suffix; 3921da177e4SLinus Torvalds u32 has_bitrate; 3931da177e4SLinus Torvalds u32 samples_per_frame; 3941da177e4SLinus Torvalds u32 bytes_per_frame; 3951da177e4SLinus Torvalds u32 bytes_per_sample; 3961da177e4SLinus Torvalds u32 sampling_freq; 3971da177e4SLinus Torvalds u32 number_of_channel; 3981da177e4SLinus Torvalds u32 stream_number; 3991da177e4SLinus Torvalds u32 buffer_size; 4001da177e4SLinus Torvalds u32 differed_time; 4011da177e4SLinus Torvalds u32 reserved4np[3]; 4021da177e4SLinus Torvalds u32 pipe_count; /* set to 1 (array size !) */ 4031da177e4SLinus Torvalds u32 stream_count; /* set to 1 (array size !) */ 404*4040fc51SGustavo A. R. Silva struct mixart_txx_stream_desc stream_desc; /* only one stream per command, but this could be an array, in theory */ 4051da177e4SLinus Torvalds } __attribute__((packed)); 4061da177e4SLinus Torvalds 4071da177e4SLinus Torvalds 4081da177e4SLinus Torvalds /* MSG_CONNECTOR_GET_OUT_AUDIO_LEVEL = 0x050009, 4091da177e4SLinus Torvalds */ 4101da177e4SLinus Torvalds 4111da177e4SLinus Torvalds 4121da177e4SLinus Torvalds struct mixart_get_out_audio_level 4131da177e4SLinus Torvalds { 4141da177e4SLinus Torvalds u32 txx_status; 4151da177e4SLinus Torvalds u32 digital_level; /* float */ 4161da177e4SLinus Torvalds u32 analog_level; /* float */ 4171da177e4SLinus Torvalds u32 monitor_level; /* float */ 4181da177e4SLinus Torvalds u32 mute; 4191da177e4SLinus Torvalds u32 monitor_mute1; 4201da177e4SLinus Torvalds u32 monitor_mute2; 4211da177e4SLinus Torvalds } __attribute__((packed)); 4221da177e4SLinus Torvalds 4231da177e4SLinus Torvalds 4241da177e4SLinus Torvalds /* MSG_CONNECTOR_SET_OUT_AUDIO_LEVEL = 0x05000A, 4251da177e4SLinus Torvalds */ 4261da177e4SLinus Torvalds 4271da177e4SLinus Torvalds /* used for valid_mask below */ 4281da177e4SLinus Torvalds #define MIXART_AUDIO_LEVEL_ANALOG_MASK 0x01 4291da177e4SLinus Torvalds #define MIXART_AUDIO_LEVEL_DIGITAL_MASK 0x02 4301da177e4SLinus Torvalds #define MIXART_AUDIO_LEVEL_MONITOR_MASK 0x04 4311da177e4SLinus Torvalds #define MIXART_AUDIO_LEVEL_MUTE_MASK 0x08 4321da177e4SLinus Torvalds #define MIXART_AUDIO_LEVEL_MUTE_M1_MASK 0x10 4331da177e4SLinus Torvalds #define MIXART_AUDIO_LEVEL_MUTE_M2_MASK 0x20 4341da177e4SLinus Torvalds 4351da177e4SLinus Torvalds struct mixart_set_out_audio_level 4361da177e4SLinus Torvalds { 4371da177e4SLinus Torvalds u32 delayed; 4381da177e4SLinus Torvalds u64 scheduler; 4391da177e4SLinus Torvalds u32 valid_mask1; 4401da177e4SLinus Torvalds u32 valid_mask2; 4411da177e4SLinus Torvalds u32 digital_level; /* float */ 4421da177e4SLinus Torvalds u32 analog_level; /* float */ 4431da177e4SLinus Torvalds u32 monitor_level; /* float */ 4441da177e4SLinus Torvalds u32 mute; 4451da177e4SLinus Torvalds u32 monitor_mute1; 4461da177e4SLinus Torvalds u32 monitor_mute2; 4471da177e4SLinus Torvalds u32 reserved4np; 4481da177e4SLinus Torvalds } __attribute__((packed)); 4491da177e4SLinus Torvalds 4501da177e4SLinus Torvalds 4511da177e4SLinus Torvalds /* MSG_SYSTEM_ENUM_PHYSICAL_IO = 0x16000E, 4521da177e4SLinus Torvalds */ 4531da177e4SLinus Torvalds 4541da177e4SLinus Torvalds #define MIXART_MAX_PHYS_IO (MIXART_MAX_CARDS * 2 * 2) /* 4 * (analog+digital) * (playback+capture) */ 4551da177e4SLinus Torvalds 4561da177e4SLinus Torvalds struct mixart_uid_enumeration 4571da177e4SLinus Torvalds { 4581da177e4SLinus Torvalds u32 error_code; 4591da177e4SLinus Torvalds u32 first_uid_offset; 4601da177e4SLinus Torvalds u32 nb_uid; 4611da177e4SLinus Torvalds u32 current_uid_index; 46267b48b88STakashi Iwai struct mixart_uid uid[MIXART_MAX_PHYS_IO]; 4631da177e4SLinus Torvalds } __attribute__((packed)); 4641da177e4SLinus Torvalds 4651da177e4SLinus Torvalds 4661da177e4SLinus Torvalds /* MSG_PHYSICALIO_SET_LEVEL = 0x0F0008, 4671da177e4SLinus Torvalds MSG_PHYSICALIO_GET_LEVEL = 0x0F000C, 4681da177e4SLinus Torvalds */ 4691da177e4SLinus Torvalds 4701da177e4SLinus Torvalds struct mixart_io_channel_level 4711da177e4SLinus Torvalds { 4721da177e4SLinus Torvalds u32 analog_level; /* float */ 4731da177e4SLinus Torvalds u32 unused[2]; 4741da177e4SLinus Torvalds } __attribute__((packed)); 4751da177e4SLinus Torvalds 4761da177e4SLinus Torvalds struct mixart_io_level 4771da177e4SLinus Torvalds { 4781da177e4SLinus Torvalds s32 channel; /* 0=left, 1=right, -1=both, -2=both same */ 47967b48b88STakashi Iwai struct mixart_io_channel_level level[2]; 4801da177e4SLinus Torvalds } __attribute__((packed)); 4811da177e4SLinus Torvalds 4821da177e4SLinus Torvalds 4831da177e4SLinus Torvalds /* MSG_STREAM_SET_IN_AUDIO_LEVEL = 0x130015, 4841da177e4SLinus Torvalds */ 4851da177e4SLinus Torvalds 4861da177e4SLinus Torvalds struct mixart_in_audio_level_info 4871da177e4SLinus Torvalds { 48867b48b88STakashi Iwai struct mixart_uid connector; 4891da177e4SLinus Torvalds u32 valid_mask1; 4901da177e4SLinus Torvalds u32 valid_mask2; 4911da177e4SLinus Torvalds u32 digital_level; 4921da177e4SLinus Torvalds u32 analog_level; 4931da177e4SLinus Torvalds } __attribute__((packed)); 4941da177e4SLinus Torvalds 4951da177e4SLinus Torvalds struct mixart_set_in_audio_level_req 4961da177e4SLinus Torvalds { 4971da177e4SLinus Torvalds u32 delayed; 4981da177e4SLinus Torvalds u64 scheduler; 4991da177e4SLinus Torvalds u32 audio_count; /* set to <= 2 */ 5001da177e4SLinus Torvalds u32 reserved4np; 50167b48b88STakashi Iwai struct mixart_in_audio_level_info level[2]; 5021da177e4SLinus Torvalds } __attribute__((packed)); 5031da177e4SLinus Torvalds 5041da177e4SLinus Torvalds /* response is a 32 bit status */ 5051da177e4SLinus Torvalds 5061da177e4SLinus Torvalds 5071da177e4SLinus Torvalds /* MSG_STREAM_SET_OUT_STREAM_LEVEL = 0x130017, 5081da177e4SLinus Torvalds */ 5091da177e4SLinus Torvalds 5101da177e4SLinus Torvalds /* defines used for valid_mask1 */ 5111da177e4SLinus Torvalds #define MIXART_OUT_STREAM_SET_LEVEL_LEFT_AUDIO1 0x01 5121da177e4SLinus Torvalds #define MIXART_OUT_STREAM_SET_LEVEL_LEFT_AUDIO2 0x02 5131da177e4SLinus Torvalds #define MIXART_OUT_STREAM_SET_LEVEL_RIGHT_AUDIO1 0x04 5141da177e4SLinus Torvalds #define MIXART_OUT_STREAM_SET_LEVEL_RIGHT_AUDIO2 0x08 5151da177e4SLinus Torvalds #define MIXART_OUT_STREAM_SET_LEVEL_STREAM_1 0x10 5161da177e4SLinus Torvalds #define MIXART_OUT_STREAM_SET_LEVEL_STREAM_2 0x20 5171da177e4SLinus Torvalds #define MIXART_OUT_STREAM_SET_LEVEL_MUTE_1 0x40 5181da177e4SLinus Torvalds #define MIXART_OUT_STREAM_SET_LEVEL_MUTE_2 0x80 5191da177e4SLinus Torvalds 5201da177e4SLinus Torvalds struct mixart_out_stream_level_info 5211da177e4SLinus Torvalds { 5221da177e4SLinus Torvalds u32 valid_mask1; 5231da177e4SLinus Torvalds u32 valid_mask2; 5241da177e4SLinus Torvalds u32 left_to_out1_level; 5251da177e4SLinus Torvalds u32 left_to_out2_level; 5261da177e4SLinus Torvalds u32 right_to_out1_level; 5271da177e4SLinus Torvalds u32 right_to_out2_level; 5281da177e4SLinus Torvalds u32 digital_level1; 5291da177e4SLinus Torvalds u32 digital_level2; 5301da177e4SLinus Torvalds u32 mute1; 5311da177e4SLinus Torvalds u32 mute2; 5321da177e4SLinus Torvalds } __attribute__((packed)); 5331da177e4SLinus Torvalds 5341da177e4SLinus Torvalds struct mixart_set_out_stream_level 5351da177e4SLinus Torvalds { 53667b48b88STakashi Iwai struct mixart_txx_stream_desc desc; 53767b48b88STakashi Iwai struct mixart_out_stream_level_info out_level; 5381da177e4SLinus Torvalds } __attribute__((packed)); 5391da177e4SLinus Torvalds 5401da177e4SLinus Torvalds struct mixart_set_out_stream_level_req 5411da177e4SLinus Torvalds { 5421da177e4SLinus Torvalds u32 delayed; 5431da177e4SLinus Torvalds u64 scheduler; 5441da177e4SLinus Torvalds u32 reserved4np[2]; 5451da177e4SLinus Torvalds u32 nb_of_stream; /* set to 1 */ 54667b48b88STakashi Iwai struct mixart_set_out_stream_level stream_level; /* could be an array */ 5471da177e4SLinus Torvalds } __attribute__((packed)); 5481da177e4SLinus Torvalds 5491da177e4SLinus Torvalds /* response to this request is a u32 status value */ 5501da177e4SLinus Torvalds 5511da177e4SLinus Torvalds 5521da177e4SLinus Torvalds /* exported */ 55367b48b88STakashi Iwai void snd_mixart_init_mailbox(struct mixart_mgr *mgr); 55467b48b88STakashi Iwai void snd_mixart_exit_mailbox(struct mixart_mgr *mgr); 5551da177e4SLinus Torvalds 55667b48b88STakashi Iwai int snd_mixart_send_msg(struct mixart_mgr *mgr, struct mixart_msg *request, int max_resp_size, void *resp_data); 55767b48b88STakashi Iwai int snd_mixart_send_msg_wait_notif(struct mixart_mgr *mgr, struct mixart_msg *request, u32 notif_event); 55867b48b88STakashi Iwai int snd_mixart_send_msg_nonblock(struct mixart_mgr *mgr, struct mixart_msg *request); 5591da177e4SLinus Torvalds 5607d12e780SDavid Howells irqreturn_t snd_mixart_interrupt(int irq, void *dev_id); 5618d3a8b5cSTakashi Iwai irqreturn_t snd_mixart_threaded_irq(int irq, void *dev_id); 5621da177e4SLinus Torvalds 56367b48b88STakashi Iwai void snd_mixart_reset_board(struct mixart_mgr *mgr); 5641da177e4SLinus Torvalds 5651da177e4SLinus Torvalds #endif /* __SOUND_MIXART_CORE_H */ 566