xref: /openbmc/linux/sound/pci/mixart/mixart_core.h (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
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