16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 23b098eb4SChen Gang #ifndef _UAPI_SOUND_FIREWIRE_H_INCLUDED 33b098eb4SChen Gang #define _UAPI_SOUND_FIREWIRE_H_INCLUDED 482fbb4f7SClemens Ladisch 582fbb4f7SClemens Ladisch #include <linux/ioctl.h> 6555e8a8fSTakashi Sakamoto #include <linux/types.h> 782fbb4f7SClemens Ladisch 882fbb4f7SClemens Ladisch /* events can be read() from the hwdep device */ 982fbb4f7SClemens Ladisch 1082fbb4f7SClemens Ladisch #define SNDRV_FIREWIRE_EVENT_LOCK_STATUS 0x000010cc 1182fbb4f7SClemens Ladisch #define SNDRV_FIREWIRE_EVENT_DICE_NOTIFICATION 0xd1ce004e 12555e8a8fSTakashi Sakamoto #define SNDRV_FIREWIRE_EVENT_EFW_RESPONSE 0x4e617475 1344b73088STakashi Sakamoto #define SNDRV_FIREWIRE_EVENT_DIGI00X_MESSAGE 0x746e736c 145aaab1bfSTakashi Sakamoto #define SNDRV_FIREWIRE_EVENT_MOTU_NOTIFICATION 0x64776479 15a8c0d132STakashi Sakamoto #define SNDRV_FIREWIRE_EVENT_TASCAM_CONTROL 0x7473636d 16634ec0b2STakashi Sakamoto #define SNDRV_FIREWIRE_EVENT_MOTU_REGISTER_DSP_CHANGE 0x4d545244 17ab811cffSTakashi Sakamoto #define SNDRV_FIREWIRE_EVENT_FF400_MESSAGE 0x4f6c6761 1882fbb4f7SClemens Ladisch 1982fbb4f7SClemens Ladisch struct snd_firewire_event_common { 2082fbb4f7SClemens Ladisch unsigned int type; /* SNDRV_FIREWIRE_EVENT_xxx */ 2182fbb4f7SClemens Ladisch }; 2282fbb4f7SClemens Ladisch 2382fbb4f7SClemens Ladisch struct snd_firewire_event_lock_status { 2482fbb4f7SClemens Ladisch unsigned int type; 2582fbb4f7SClemens Ladisch unsigned int status; /* 0/1 = unlocked/locked */ 2682fbb4f7SClemens Ladisch }; 2782fbb4f7SClemens Ladisch 2882fbb4f7SClemens Ladisch struct snd_firewire_event_dice_notification { 2982fbb4f7SClemens Ladisch unsigned int type; 3082fbb4f7SClemens Ladisch unsigned int notification; /* DICE-specific bits */ 3182fbb4f7SClemens Ladisch }; 3282fbb4f7SClemens Ladisch 33555e8a8fSTakashi Sakamoto #define SND_EFW_TRANSACTION_USER_SEQNUM_MAX ((__u32)((__u16)~0) - 1) 34555e8a8fSTakashi Sakamoto /* each field should be in big endian */ 35555e8a8fSTakashi Sakamoto struct snd_efw_transaction { 36555e8a8fSTakashi Sakamoto __be32 length; 37555e8a8fSTakashi Sakamoto __be32 version; 38555e8a8fSTakashi Sakamoto __be32 seqnum; 39555e8a8fSTakashi Sakamoto __be32 category; 40555e8a8fSTakashi Sakamoto __be32 command; 41555e8a8fSTakashi Sakamoto __be32 status; 4294dfc73eSGustavo A. R. Silva __be32 params[]; 43555e8a8fSTakashi Sakamoto }; 44555e8a8fSTakashi Sakamoto struct snd_firewire_event_efw_response { 45555e8a8fSTakashi Sakamoto unsigned int type; 4694dfc73eSGustavo A. R. Silva __be32 response[]; /* some responses */ 47555e8a8fSTakashi Sakamoto }; 48555e8a8fSTakashi Sakamoto 4944b73088STakashi Sakamoto struct snd_firewire_event_digi00x_message { 5044b73088STakashi Sakamoto unsigned int type; 5144b73088STakashi Sakamoto __u32 message; /* Digi00x-specific message */ 5244b73088STakashi Sakamoto }; 5344b73088STakashi Sakamoto 545aaab1bfSTakashi Sakamoto struct snd_firewire_event_motu_notification { 555aaab1bfSTakashi Sakamoto unsigned int type; 565aaab1bfSTakashi Sakamoto __u32 message; /* MOTU-specific bits. */ 575aaab1bfSTakashi Sakamoto }; 585aaab1bfSTakashi Sakamoto 59d7167422STakashi Sakamoto struct snd_firewire_tascam_change { 60d7167422STakashi Sakamoto unsigned int index; 61d7167422STakashi Sakamoto __be32 before; 62d7167422STakashi Sakamoto __be32 after; 63d7167422STakashi Sakamoto }; 64d7167422STakashi Sakamoto 65a8c0d132STakashi Sakamoto struct snd_firewire_event_tascam_control { 66a8c0d132STakashi Sakamoto unsigned int type; 6794dfc73eSGustavo A. R. Silva struct snd_firewire_tascam_change changes[]; 68a8c0d132STakashi Sakamoto }; 69a8c0d132STakashi Sakamoto 70634ec0b2STakashi Sakamoto struct snd_firewire_event_motu_register_dsp_change { 71634ec0b2STakashi Sakamoto unsigned int type; 72b1570647STakashi Iwai __u32 count; /* The number of changes. */ 73b1570647STakashi Iwai __u32 changes[]; /* Encoded event for change of register DSP. */ 74634ec0b2STakashi Sakamoto }; 75634ec0b2STakashi Sakamoto 76ab811cffSTakashi Sakamoto /** 77ab811cffSTakashi Sakamoto * struct snd_firewire_event_ff400_message - the container for message from Fireface 400 when 78ab811cffSTakashi Sakamoto * operating hardware knob. 79ab811cffSTakashi Sakamoto * 80ab811cffSTakashi Sakamoto * @type: Fixed to SNDRV_FIREWIRE_EVENT_FF400_MESSAGE. 81*0d9eb7edSTakashi Sakamoto * @message_count: The number of messages. 82ab811cffSTakashi Sakamoto * @messages.message: The messages expressing hardware knob operation. 83ab811cffSTakashi Sakamoto * @messages.tstamp: The isochronous cycle at which the request subaction of asynchronous 84ab811cffSTakashi Sakamoto * transaction was sent to deliver the message. It has 16 bit unsigned integer 85ab811cffSTakashi Sakamoto * value. The higher 3 bits of value expresses the lower three bits of second 86ab811cffSTakashi Sakamoto * field in the format of CYCLE_TIME, up to 7. The rest 13 bits expresses cycle 87ab811cffSTakashi Sakamoto * field up to 7999. 88ab811cffSTakashi Sakamoto * 89ab811cffSTakashi Sakamoto * The structure expresses message transmitted by Fireface 400 when operating hardware knob. 90ab811cffSTakashi Sakamoto */ 91ab811cffSTakashi Sakamoto struct snd_firewire_event_ff400_message { 92ab811cffSTakashi Sakamoto unsigned int type; 93*0d9eb7edSTakashi Sakamoto unsigned int message_count; 94ab811cffSTakashi Sakamoto struct { 95ab811cffSTakashi Sakamoto __u32 message; 96ab811cffSTakashi Sakamoto __u32 tstamp; 97ab811cffSTakashi Sakamoto } messages[]; 98ab811cffSTakashi Sakamoto }; 99ab811cffSTakashi Sakamoto 10082fbb4f7SClemens Ladisch union snd_firewire_event { 10182fbb4f7SClemens Ladisch struct snd_firewire_event_common common; 10282fbb4f7SClemens Ladisch struct snd_firewire_event_lock_status lock_status; 10382fbb4f7SClemens Ladisch struct snd_firewire_event_dice_notification dice_notification; 104555e8a8fSTakashi Sakamoto struct snd_firewire_event_efw_response efw_response; 10544b73088STakashi Sakamoto struct snd_firewire_event_digi00x_message digi00x_message; 106a8c0d132STakashi Sakamoto struct snd_firewire_event_tascam_control tascam_control; 1075aaab1bfSTakashi Sakamoto struct snd_firewire_event_motu_notification motu_notification; 108634ec0b2STakashi Sakamoto struct snd_firewire_event_motu_register_dsp_change motu_register_dsp_change; 109ab811cffSTakashi Sakamoto struct snd_firewire_event_ff400_message ff400_message; 11082fbb4f7SClemens Ladisch }; 11182fbb4f7SClemens Ladisch 11282fbb4f7SClemens Ladisch 11382fbb4f7SClemens Ladisch #define SNDRV_FIREWIRE_IOCTL_GET_INFO _IOR('H', 0xf8, struct snd_firewire_get_info) 11482fbb4f7SClemens Ladisch #define SNDRV_FIREWIRE_IOCTL_LOCK _IO('H', 0xf9) 11582fbb4f7SClemens Ladisch #define SNDRV_FIREWIRE_IOCTL_UNLOCK _IO('H', 0xfa) 11690e8ac5cSTakashi Sakamoto #define SNDRV_FIREWIRE_IOCTL_TASCAM_STATE _IOR('H', 0xfb, struct snd_firewire_tascam_state) 11758b62ab7STakashi Sakamoto #define SNDRV_FIREWIRE_IOCTL_MOTU_REGISTER_DSP_METER _IOR('H', 0xfc, struct snd_firewire_motu_register_dsp_meter) 11858b62ab7STakashi Sakamoto #define SNDRV_FIREWIRE_IOCTL_MOTU_COMMAND_DSP_METER _IOR('H', 0xfd, struct snd_firewire_motu_command_dsp_meter) 119ca15a09cSTakashi Sakamoto #define SNDRV_FIREWIRE_IOCTL_MOTU_REGISTER_DSP_PARAMETER _IOR('H', 0xfe, struct snd_firewire_motu_register_dsp_parameter) 12082fbb4f7SClemens Ladisch 12182fbb4f7SClemens Ladisch #define SNDRV_FIREWIRE_TYPE_DICE 1 122594ddcedSTakashi Sakamoto #define SNDRV_FIREWIRE_TYPE_FIREWORKS 2 123618eabeaSTakashi Sakamoto #define SNDRV_FIREWIRE_TYPE_BEBOB 3 1248985f4acSTakashi Sakamoto #define SNDRV_FIREWIRE_TYPE_OXFW 4 125660dd3d5STakashi Sakamoto #define SNDRV_FIREWIRE_TYPE_DIGI00X 5 126e5e0c3ddSTakashi Sakamoto #define SNDRV_FIREWIRE_TYPE_TASCAM 6 12771c37977STakashi Sakamoto #define SNDRV_FIREWIRE_TYPE_MOTU 7 128f656edd5STakashi Sakamoto #define SNDRV_FIREWIRE_TYPE_FIREFACE 8 12982fbb4f7SClemens Ladisch 13082fbb4f7SClemens Ladisch struct snd_firewire_get_info { 13182fbb4f7SClemens Ladisch unsigned int type; /* SNDRV_FIREWIRE_TYPE_xxx */ 13282fbb4f7SClemens Ladisch unsigned int card; /* same as fw_cdev_get_info.card */ 13382fbb4f7SClemens Ladisch unsigned char guid[8]; 13482fbb4f7SClemens Ladisch char device_name[16]; /* device node in /dev */ 13582fbb4f7SClemens Ladisch }; 13682fbb4f7SClemens Ladisch 13782fbb4f7SClemens Ladisch /* 13882fbb4f7SClemens Ladisch * SNDRV_FIREWIRE_IOCTL_LOCK prevents the driver from streaming. 13982fbb4f7SClemens Ladisch * Returns -EBUSY if the driver is already streaming. 14082fbb4f7SClemens Ladisch */ 14182fbb4f7SClemens Ladisch 14233b2e144STakashi Sakamoto #define SNDRV_FIREWIRE_TASCAM_STATE_COUNT 64 14333b2e144STakashi Sakamoto 14490e8ac5cSTakashi Sakamoto struct snd_firewire_tascam_state { 14590e8ac5cSTakashi Sakamoto __be32 data[SNDRV_FIREWIRE_TASCAM_STATE_COUNT]; 14690e8ac5cSTakashi Sakamoto }; 14790e8ac5cSTakashi Sakamoto 148b1570647STakashi Iwai /* 149b1570647STakashi Iwai * In below MOTU models, software is allowed to control their DSP by accessing to registers. 150b1570647STakashi Iwai * - 828mk2 151b1570647STakashi Iwai * - 896hd 152b1570647STakashi Iwai * - Traveler 153b1570647STakashi Iwai * - 8 pre 154b1570647STakashi Iwai * - Ultralite 155b1570647STakashi Iwai * - 4 pre 156b1570647STakashi Iwai * - Audio Express 157b1570647STakashi Iwai * 158b1570647STakashi Iwai * On the other hand, the status of DSP is split into specific messages included in the sequence of 159b1570647STakashi Iwai * isochronous packet. ALSA firewire-motu driver gathers the messages and allow userspace applications 160b1570647STakashi Iwai * to read it via ioctl. In 828mk2, 896hd, and Traveler, hardware meter for all of physical inputs 161b1570647STakashi Iwai * are put into the message, while one pair of physical outputs is selected. The selection is done by 162b1570647STakashi Iwai * LSB one byte in asynchronous write quadlet transaction to 0x'ffff'f000'0b2c. 163b1570647STakashi Iwai * 164b1570647STakashi Iwai * I note that V3HD/V4HD uses asynchronous transaction for the purpose. The destination address is 165b1570647STakashi Iwai * registered to 0x'ffff'f000'0b38 and '0b3c by asynchronous write quadlet request. The size of 166b1570647STakashi Iwai * message differs between 23 and 51 quadlets. For the case, the number of mixer bus can be extended 167b1570647STakashi Iwai * up to 12. 168b1570647STakashi Iwai */ 169bea36afaSTakashi Sakamoto 1700f166e12STakashi Sakamoto #define SNDRV_FIREWIRE_MOTU_REGISTER_DSP_METER_INPUT_COUNT 24 1710f166e12STakashi Sakamoto #define SNDRV_FIREWIRE_MOTU_REGISTER_DSP_METER_OUTPUT_COUNT 24 1720f166e12STakashi Sakamoto #define SNDRV_FIREWIRE_MOTU_REGISTER_DSP_METER_COUNT \ 1730f166e12STakashi Sakamoto (SNDRV_FIREWIRE_MOTU_REGISTER_DSP_METER_INPUT_COUNT + SNDRV_FIREWIRE_MOTU_REGISTER_DSP_METER_OUTPUT_COUNT) 174bea36afaSTakashi Sakamoto 175bea36afaSTakashi Sakamoto /** 176bea36afaSTakashi Sakamoto * struct snd_firewire_motu_register_dsp_meter - the container for meter information in DSP 177bea36afaSTakashi Sakamoto * controlled by register access 178bea36afaSTakashi Sakamoto * @data: Signal level meters. The mapping between position and input/output channel is 179bea36afaSTakashi Sakamoto * model-dependent. 180bea36afaSTakashi Sakamoto * 181bea36afaSTakashi Sakamoto * The structure expresses the part of DSP status for hardware meter. The u8 storage includes linear 182bea36afaSTakashi Sakamoto * value for audio signal level between 0x00 and 0x7f. 183bea36afaSTakashi Sakamoto */ 184bea36afaSTakashi Sakamoto struct snd_firewire_motu_register_dsp_meter { 185bea36afaSTakashi Sakamoto __u8 data[SNDRV_FIREWIRE_MOTU_REGISTER_DSP_METER_COUNT]; 186bea36afaSTakashi Sakamoto }; 187bea36afaSTakashi Sakamoto 188dc36a975STakashi Sakamoto #define SNDRV_FIREWIRE_MOTU_REGISTER_DSP_MIXER_COUNT 4 189dc36a975STakashi Sakamoto #define SNDRV_FIREWIRE_MOTU_REGISTER_DSP_MIXER_SRC_COUNT 20 1907d843c49STakashi Sakamoto #define SNDRV_FIREWIRE_MOTU_REGISTER_DSP_INPUT_COUNT 10 1917d843c49STakashi Sakamoto #define SNDRV_FIREWIRE_MOTU_REGISTER_DSP_ALIGNED_INPUT_COUNT (SNDRV_FIREWIRE_MOTU_REGISTER_DSP_INPUT_COUNT + 2) 192dc36a975STakashi Sakamoto 193dc36a975STakashi Sakamoto /** 194dc36a975STakashi Sakamoto * snd_firewire_motu_register_dsp_parameter - the container for parameters of DSP controlled 195dc36a975STakashi Sakamoto * by register access. 196dc36a975STakashi Sakamoto * @mixer.source.gain: The gain of source to mixer. 197dc36a975STakashi Sakamoto * @mixer.source.pan: The L/R balance of source to mixer. 198dc36a975STakashi Sakamoto * @mixer.source.flag: The flag of source to mixer, including mute, solo. 199dc36a975STakashi Sakamoto * @mixer.source.paired_balance: The L/R balance of paired source to mixer, only for 4 pre and 200dc36a975STakashi Sakamoto * Audio Express. 201dc36a975STakashi Sakamoto * @mixer.source.paired_width: The width of paired source to mixer, only for 4 pre and 202dc36a975STakashi Sakamoto * Audio Express. 203ce69bed5STakashi Sakamoto * @mixer.output.paired_volume: The volume of paired output from mixer. 204ce69bed5STakashi Sakamoto * @mixer.output.paired_flag: The flag of paired output from mixer. 2056ca81d2bSTakashi Sakamoto * @output.main_paired_volume: The volume of paired main output. 2066ca81d2bSTakashi Sakamoto * @output.hp_paired_volume: The volume of paired hp output. 2076ca81d2bSTakashi Sakamoto * @output.hp_paired_assignment: The source assigned to paired hp output. 2086ca81d2bSTakashi Sakamoto * @output.reserved: Padding for 32 bit alignment for future extension. 20941cc2338STakashi Sakamoto * @line_input.boost_flag: The flags of boost for line inputs, only for 828mk2 and Traveler. 21041cc2338STakashi Sakamoto * @line_input.nominal_level_flag: The flags of nominal level for line inputs, only for 828mk2 and 21141cc2338STakashi Sakamoto * Traveler. 21241cc2338STakashi Sakamoto * @line_input.reserved: Padding for 32 bit alignment for future extension. 2137d843c49STakashi Sakamoto * @input.gain_and_invert: The value including gain and invert for input, only for Ultralite, 4 pre 2147d843c49STakashi Sakamoto * and Audio Express. 2157d843c49STakashi Sakamoto * @input.flag: The flag of input; e.g. jack detection, phantom power, and pad, only for Ultralite, 2167d843c49STakashi Sakamoto * 4 pre and Audio express. 2177d843c49STakashi Sakamoto * @reserved: Padding so that the size of structure is kept to 512 byte, but for future extension. 218dc36a975STakashi Sakamoto * 219dc36a975STakashi Sakamoto * The structure expresses the set of parameters for DSP controlled by register access. 220dc36a975STakashi Sakamoto */ 221dc36a975STakashi Sakamoto struct snd_firewire_motu_register_dsp_parameter { 222dc36a975STakashi Sakamoto struct { 223dc36a975STakashi Sakamoto struct { 224dc36a975STakashi Sakamoto __u8 gain[SNDRV_FIREWIRE_MOTU_REGISTER_DSP_MIXER_SRC_COUNT]; 225dc36a975STakashi Sakamoto __u8 pan[SNDRV_FIREWIRE_MOTU_REGISTER_DSP_MIXER_SRC_COUNT]; 226dc36a975STakashi Sakamoto __u8 flag[SNDRV_FIREWIRE_MOTU_REGISTER_DSP_MIXER_SRC_COUNT]; 227dc36a975STakashi Sakamoto __u8 paired_balance[SNDRV_FIREWIRE_MOTU_REGISTER_DSP_MIXER_SRC_COUNT]; 228dc36a975STakashi Sakamoto __u8 paired_width[SNDRV_FIREWIRE_MOTU_REGISTER_DSP_MIXER_SRC_COUNT]; 229dc36a975STakashi Sakamoto } source[SNDRV_FIREWIRE_MOTU_REGISTER_DSP_MIXER_COUNT]; 230ce69bed5STakashi Sakamoto struct { 231ce69bed5STakashi Sakamoto __u8 paired_volume[SNDRV_FIREWIRE_MOTU_REGISTER_DSP_MIXER_COUNT]; 232ce69bed5STakashi Sakamoto __u8 paired_flag[SNDRV_FIREWIRE_MOTU_REGISTER_DSP_MIXER_COUNT]; 233ce69bed5STakashi Sakamoto } output; 234dc36a975STakashi Sakamoto } mixer; 2356ca81d2bSTakashi Sakamoto struct { 2366ca81d2bSTakashi Sakamoto __u8 main_paired_volume; 2376ca81d2bSTakashi Sakamoto __u8 hp_paired_volume; 2386ca81d2bSTakashi Sakamoto __u8 hp_paired_assignment; 2396ca81d2bSTakashi Sakamoto __u8 reserved[5]; 2406ca81d2bSTakashi Sakamoto } output; 24141cc2338STakashi Sakamoto struct { 24241cc2338STakashi Sakamoto __u8 boost_flag; 24341cc2338STakashi Sakamoto __u8 nominal_level_flag; 24441cc2338STakashi Sakamoto __u8 reserved[6]; 24541cc2338STakashi Sakamoto } line_input; 2467d843c49STakashi Sakamoto struct { 2477d843c49STakashi Sakamoto __u8 gain_and_invert[SNDRV_FIREWIRE_MOTU_REGISTER_DSP_ALIGNED_INPUT_COUNT]; 2487d843c49STakashi Sakamoto __u8 flag[SNDRV_FIREWIRE_MOTU_REGISTER_DSP_ALIGNED_INPUT_COUNT]; 2497d843c49STakashi Sakamoto } input; 2507d843c49STakashi Sakamoto __u8 reserved[64]; 251dc36a975STakashi Sakamoto }; 252dc36a975STakashi Sakamoto 253b1570647STakashi Iwai /* 254b1570647STakashi Iwai * In below MOTU models, software is allowed to control their DSP by command in frame of 255b1570647STakashi Iwai * asynchronous transaction to 0x'ffff'0001'0000: 256b1570647STakashi Iwai * 257b1570647STakashi Iwai * - 828 mk3 (FireWire only and Hybrid) 258b1570647STakashi Iwai * - 896 mk3 (FireWire only and Hybrid) 259b1570647STakashi Iwai * - Ultralite mk3 (FireWire only and Hybrid) 260b1570647STakashi Iwai * - Traveler mk3 261b1570647STakashi Iwai * - Track 16 262b1570647STakashi Iwai * 263b1570647STakashi Iwai * On the other hand, the states of hardware meter is split into specific messages included in the 264b1570647STakashi Iwai * sequence of isochronous packet. ALSA firewire-motu driver gathers the message and allow userspace 265b1570647STakashi Iwai * application to read it via ioctl. 266b1570647STakashi Iwai */ 26790b28f3bSTakashi Sakamoto 26890b28f3bSTakashi Sakamoto #define SNDRV_FIREWIRE_MOTU_COMMAND_DSP_METER_COUNT 400 26990b28f3bSTakashi Sakamoto 27090b28f3bSTakashi Sakamoto /** 27190b28f3bSTakashi Sakamoto * struct snd_firewire_motu_command_dsp_meter - the container for meter information in DSP 27290b28f3bSTakashi Sakamoto * controlled by command 27390b28f3bSTakashi Sakamoto * @data: Signal level meters. The mapping between position and signal channel is model-dependent. 27490b28f3bSTakashi Sakamoto * 27590b28f3bSTakashi Sakamoto * The structure expresses the part of DSP status for hardware meter. The 32 bit storage is 27690b28f3bSTakashi Sakamoto * estimated to include IEEE 764 32 bit single precision floating point (binary32) value. It is 277407359d4STakashi Sakamoto * expected to be linear value (not logarithm) for audio signal level between 0.0 and +1.0. 27890b28f3bSTakashi Sakamoto */ 27990b28f3bSTakashi Sakamoto struct snd_firewire_motu_command_dsp_meter { 280407359d4STakashi Sakamoto #ifdef __KERNEL__ 28190b28f3bSTakashi Sakamoto __u32 data[SNDRV_FIREWIRE_MOTU_COMMAND_DSP_METER_COUNT]; 282407359d4STakashi Sakamoto #else 283407359d4STakashi Sakamoto float data[SNDRV_FIREWIRE_MOTU_COMMAND_DSP_METER_COUNT]; 284407359d4STakashi Sakamoto #endif 28590b28f3bSTakashi Sakamoto }; 28690b28f3bSTakashi Sakamoto 2873b098eb4SChen Gang #endif /* _UAPI_SOUND_FIREWIRE_H_INCLUDED */ 288