1da607e19SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 26c3cef48STakashi Sakamoto /* 36c3cef48STakashi Sakamoto * motu.h - a part of driver for MOTU FireWire series 46c3cef48STakashi Sakamoto * 56c3cef48STakashi Sakamoto * Copyright (c) 2015-2017 Takashi Sakamoto <o-takashi@sakamocchi.jp> 66c3cef48STakashi Sakamoto */ 76c3cef48STakashi Sakamoto 86c3cef48STakashi Sakamoto #ifndef SOUND_FIREWIRE_MOTU_H_INCLUDED 96c3cef48STakashi Sakamoto #define SOUND_FIREWIRE_MOTU_H_INCLUDED 106c3cef48STakashi Sakamoto 116c3cef48STakashi Sakamoto #include <linux/device.h> 126c3cef48STakashi Sakamoto #include <linux/firewire.h> 136c3cef48STakashi Sakamoto #include <linux/firewire-constants.h> 146c3cef48STakashi Sakamoto #include <linux/module.h> 156c3cef48STakashi Sakamoto #include <linux/mod_devicetable.h> 166c3cef48STakashi Sakamoto #include <linux/mutex.h> 176c3cef48STakashi Sakamoto #include <linux/slab.h> 1871c37977STakashi Sakamoto #include <linux/compat.h> 1971c37977STakashi Sakamoto #include <linux/sched/signal.h> 206c3cef48STakashi Sakamoto 216c3cef48STakashi Sakamoto #include <sound/control.h> 226c3cef48STakashi Sakamoto #include <sound/core.h> 234641c939STakashi Sakamoto #include <sound/pcm.h> 244638ec6eSTakashi Sakamoto #include <sound/info.h> 259e796e7dSTakashi Sakamoto #include <sound/rawmidi.h> 2671c37977STakashi Sakamoto #include <sound/firewire.h> 2771c37977STakashi Sakamoto #include <sound/hwdep.h> 286c3cef48STakashi Sakamoto 298865a31eSTakashi Sakamoto #include "../lib.h" 304641c939STakashi Sakamoto #include "../amdtp-stream.h" 319b2bb4f2STakashi Sakamoto #include "../iso-resources.h" 328865a31eSTakashi Sakamoto 3359f6482cSTakashi Sakamoto struct snd_motu_packet_format { 349e796e7dSTakashi Sakamoto unsigned char midi_flag_offset; 359e796e7dSTakashi Sakamoto unsigned char midi_byte_offset; 3659f6482cSTakashi Sakamoto unsigned char pcm_byte_offset; 3759f6482cSTakashi Sakamoto 3859f6482cSTakashi Sakamoto unsigned char msg_chunks; 3928c8d3c9STakashi Sakamoto unsigned char pcm_chunks[3]; 4059f6482cSTakashi Sakamoto }; 4159f6482cSTakashi Sakamoto 42e50dfac8STakashi Sakamoto struct amdtp_motu_cache { 43e50dfac8STakashi Sakamoto unsigned int *event_offsets; 44e50dfac8STakashi Sakamoto unsigned int size; 45e50dfac8STakashi Sakamoto unsigned int tail; 46e50dfac8STakashi Sakamoto unsigned int tx_cycle_count; 47f2ac3b83STakashi Sakamoto unsigned int head; 48f2ac3b83STakashi Sakamoto unsigned int rx_cycle_count; 49e50dfac8STakashi Sakamoto }; 50e50dfac8STakashi Sakamoto 516c3cef48STakashi Sakamoto struct snd_motu { 526c3cef48STakashi Sakamoto struct snd_card *card; 536c3cef48STakashi Sakamoto struct fw_unit *unit; 546c3cef48STakashi Sakamoto struct mutex mutex; 559e796e7dSTakashi Sakamoto spinlock_t lock; 568865a31eSTakashi Sakamoto 575e03c33eSTakashi Sakamoto /* Model dependent information. */ 585e03c33eSTakashi Sakamoto const struct snd_motu_spec *spec; 5959f6482cSTakashi Sakamoto 6059f6482cSTakashi Sakamoto /* For packet streaming */ 6159f6482cSTakashi Sakamoto struct snd_motu_packet_format tx_packet_formats; 6259f6482cSTakashi Sakamoto struct snd_motu_packet_format rx_packet_formats; 634641c939STakashi Sakamoto struct amdtp_stream tx_stream; 644641c939STakashi Sakamoto struct amdtp_stream rx_stream; 659b2bb4f2STakashi Sakamoto struct fw_iso_resources tx_resources; 669b2bb4f2STakashi Sakamoto struct fw_iso_resources rx_resources; 6718f26034STakashi Sakamoto unsigned int substreams_counter; 682e76701bSTakashi Sakamoto 692e76701bSTakashi Sakamoto /* For notification. */ 702e76701bSTakashi Sakamoto struct fw_address_handler async_handler; 712e76701bSTakashi Sakamoto u32 msg; 7271c37977STakashi Sakamoto 7371c37977STakashi Sakamoto /* For uapi */ 7471c37977STakashi Sakamoto int dev_lock_count; 7571c37977STakashi Sakamoto bool dev_lock_changed; 7671c37977STakashi Sakamoto wait_queue_head_t hwdep_wait; 77ccc6c1b0STakashi Sakamoto 78ccc6c1b0STakashi Sakamoto struct amdtp_domain domain; 79e50dfac8STakashi Sakamoto 80e50dfac8STakashi Sakamoto struct amdtp_motu_cache cache; 81bea36afaSTakashi Sakamoto 82bea36afaSTakashi Sakamoto void *message_parser; 835e03c33eSTakashi Sakamoto }; 845e03c33eSTakashi Sakamoto 855e03c33eSTakashi Sakamoto enum snd_motu_spec_flags { 86739bdbaeSTakashi Sakamoto SND_MOTU_SPEC_RX_MIDI_2ND_Q = 0x0001, 87739bdbaeSTakashi Sakamoto SND_MOTU_SPEC_RX_MIDI_3RD_Q = 0x0002, 88739bdbaeSTakashi Sakamoto SND_MOTU_SPEC_TX_MIDI_2ND_Q = 0x0004, 89739bdbaeSTakashi Sakamoto SND_MOTU_SPEC_TX_MIDI_3RD_Q = 0x0008, 90bea36afaSTakashi Sakamoto SND_MOTU_SPEC_REGISTER_DSP = 0x0010, 9190b28f3bSTakashi Sakamoto SND_MOTU_SPEC_COMMAND_DSP = 0x0020, 925e03c33eSTakashi Sakamoto }; 935e03c33eSTakashi Sakamoto 9459f6482cSTakashi Sakamoto #define SND_MOTU_CLOCK_RATE_COUNT 6 9559f6482cSTakashi Sakamoto extern const unsigned int snd_motu_clock_rates[SND_MOTU_CLOCK_RATE_COUNT]; 9659f6482cSTakashi Sakamoto 9759f6482cSTakashi Sakamoto enum snd_motu_clock_source { 9859f6482cSTakashi Sakamoto SND_MOTU_CLOCK_SOURCE_INTERNAL, 9959f6482cSTakashi Sakamoto SND_MOTU_CLOCK_SOURCE_ADAT_ON_DSUB, 10059f6482cSTakashi Sakamoto SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT, 10159f6482cSTakashi Sakamoto SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_A, 10259f6482cSTakashi Sakamoto SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_B, 10359f6482cSTakashi Sakamoto SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT, 10459f6482cSTakashi Sakamoto SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_A, 10559f6482cSTakashi Sakamoto SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_B, 10659f6482cSTakashi Sakamoto SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX, 10759f6482cSTakashi Sakamoto SND_MOTU_CLOCK_SOURCE_AESEBU_ON_XLR, 10859f6482cSTakashi Sakamoto SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC, 1093f58f004STakashi Sakamoto SND_MOTU_CLOCK_SOURCE_SPH, 11059f6482cSTakashi Sakamoto SND_MOTU_CLOCK_SOURCE_UNKNOWN, 11159f6482cSTakashi Sakamoto }; 11259f6482cSTakashi Sakamoto 11361d79c70STakashi Sakamoto enum snd_motu_protocol_version { 114d13d6b28STakashi Sakamoto SND_MOTU_PROTOCOL_V1, 11561d79c70STakashi Sakamoto SND_MOTU_PROTOCOL_V2, 11661d79c70STakashi Sakamoto SND_MOTU_PROTOCOL_V3, 11761d79c70STakashi Sakamoto }; 11861d79c70STakashi Sakamoto 1195e03c33eSTakashi Sakamoto struct snd_motu_spec { 1205e03c33eSTakashi Sakamoto const char *const name; 12161d79c70STakashi Sakamoto enum snd_motu_protocol_version protocol_version; 122ffe66bbeSTakashi Sakamoto // The combination of snd_motu_spec_flags enumeration-constants. 123ffe66bbeSTakashi Sakamoto unsigned int flags; 1245e03c33eSTakashi Sakamoto 125dfbaa4dcSTakashi Sakamoto unsigned char tx_fixed_pcm_chunks[3]; 126dfbaa4dcSTakashi Sakamoto unsigned char rx_fixed_pcm_chunks[3]; 1276c3cef48STakashi Sakamoto }; 1286c3cef48STakashi Sakamoto 129d13d6b28STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_828; 130b431f16fSTakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_896; 131d13d6b28STakashi Sakamoto 132bd107372STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_828mk2; 13323c671beSTakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_896hd; 1340a7c7b47STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_traveler; 1350a7c7b47STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_ultralite; 1360a7c7b47STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_8pre; 1376c5e1ac0STakashi Sakamoto 1385b24119eSTakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_828mk3_fw; 1395b24119eSTakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_828mk3_hybrid; 140e0b2db35STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_ultralite_mk3; 141c806a0e2STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_audio_express; 142c806a0e2STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_4pre; 143c806a0e2STakashi Sakamoto 1444641c939STakashi Sakamoto int amdtp_motu_init(struct amdtp_stream *s, struct fw_unit *unit, 1454641c939STakashi Sakamoto enum amdtp_stream_direction dir, 146e50dfac8STakashi Sakamoto const struct snd_motu_spec *spec, 147e50dfac8STakashi Sakamoto struct amdtp_motu_cache *cache); 1484641c939STakashi Sakamoto int amdtp_motu_set_parameters(struct amdtp_stream *s, unsigned int rate, 1499e796e7dSTakashi Sakamoto unsigned int midi_ports, 1504641c939STakashi Sakamoto struct snd_motu_packet_format *formats); 1514641c939STakashi Sakamoto int amdtp_motu_add_pcm_hw_constraints(struct amdtp_stream *s, 1524641c939STakashi Sakamoto struct snd_pcm_runtime *runtime); 1539e796e7dSTakashi Sakamoto void amdtp_motu_midi_trigger(struct amdtp_stream *s, unsigned int port, 1549e796e7dSTakashi Sakamoto struct snd_rawmidi_substream *midi); 1552e76701bSTakashi Sakamoto 1562e76701bSTakashi Sakamoto int snd_motu_transaction_read(struct snd_motu *motu, u32 offset, __be32 *reg, 1572e76701bSTakashi Sakamoto size_t size); 1582e76701bSTakashi Sakamoto int snd_motu_transaction_write(struct snd_motu *motu, u32 offset, __be32 *reg, 1592e76701bSTakashi Sakamoto size_t size); 1602e76701bSTakashi Sakamoto int snd_motu_transaction_register(struct snd_motu *motu); 1612e76701bSTakashi Sakamoto int snd_motu_transaction_reregister(struct snd_motu *motu); 1622e76701bSTakashi Sakamoto void snd_motu_transaction_unregister(struct snd_motu *motu); 1639b2bb4f2STakashi Sakamoto 1649b2bb4f2STakashi Sakamoto int snd_motu_stream_init_duplex(struct snd_motu *motu); 1659b2bb4f2STakashi Sakamoto void snd_motu_stream_destroy_duplex(struct snd_motu *motu); 1668b460c76STakashi Sakamoto int snd_motu_stream_cache_packet_formats(struct snd_motu *motu); 1670d39cd0eSTakashi Sakamoto int snd_motu_stream_reserve_duplex(struct snd_motu *motu, unsigned int rate, 1680f5482e7STakashi Sakamoto unsigned int frames_per_period, 1690f5482e7STakashi Sakamoto unsigned int frames_per_buffer); 1708edc56ecSTakashi Sakamoto int snd_motu_stream_start_duplex(struct snd_motu *motu); 1719b2bb4f2STakashi Sakamoto void snd_motu_stream_stop_duplex(struct snd_motu *motu); 17271c37977STakashi Sakamoto int snd_motu_stream_lock_try(struct snd_motu *motu); 17371c37977STakashi Sakamoto void snd_motu_stream_lock_release(struct snd_motu *motu); 1744638ec6eSTakashi Sakamoto 1754638ec6eSTakashi Sakamoto void snd_motu_proc_init(struct snd_motu *motu); 176dd49b2d1STakashi Sakamoto 177dd49b2d1STakashi Sakamoto int snd_motu_create_pcm_devices(struct snd_motu *motu); 1789e796e7dSTakashi Sakamoto 1799e796e7dSTakashi Sakamoto int snd_motu_create_midi_devices(struct snd_motu *motu); 18071c37977STakashi Sakamoto 18171c37977STakashi Sakamoto int snd_motu_create_hwdep_device(struct snd_motu *motu); 182ff222b7eSTakashi Sakamoto 183d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_get_clock_rate(struct snd_motu *motu, 184d13d6b28STakashi Sakamoto unsigned int *rate); 185d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_set_clock_rate(struct snd_motu *motu, 186d13d6b28STakashi Sakamoto unsigned int rate); 187d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_get_clock_source(struct snd_motu *motu, 188d13d6b28STakashi Sakamoto enum snd_motu_clock_source *src); 189d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_switch_fetching_mode(struct snd_motu *motu, 190d13d6b28STakashi Sakamoto bool enable); 191d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_cache_packet_formats(struct snd_motu *motu); 192d13d6b28STakashi Sakamoto 193ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_get_clock_rate(struct snd_motu *motu, 194ff222b7eSTakashi Sakamoto unsigned int *rate); 195ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_set_clock_rate(struct snd_motu *motu, 196ff222b7eSTakashi Sakamoto unsigned int rate); 197ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_get_clock_source(struct snd_motu *motu, 198ff222b7eSTakashi Sakamoto enum snd_motu_clock_source *src); 199ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_switch_fetching_mode(struct snd_motu *motu, 200ff222b7eSTakashi Sakamoto bool enable); 201ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_cache_packet_formats(struct snd_motu *motu); 202ff222b7eSTakashi Sakamoto 203ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_get_clock_rate(struct snd_motu *motu, 204ff222b7eSTakashi Sakamoto unsigned int *rate); 205ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_set_clock_rate(struct snd_motu *motu, 206ff222b7eSTakashi Sakamoto unsigned int rate); 207ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_get_clock_source(struct snd_motu *motu, 208ff222b7eSTakashi Sakamoto enum snd_motu_clock_source *src); 209ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_switch_fetching_mode(struct snd_motu *motu, 210ff222b7eSTakashi Sakamoto bool enable); 211ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_cache_packet_formats(struct snd_motu *motu); 212ff222b7eSTakashi Sakamoto 213ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_get_clock_rate(struct snd_motu *motu, 214ff222b7eSTakashi Sakamoto unsigned int *rate) 215ff222b7eSTakashi Sakamoto { 216ff222b7eSTakashi Sakamoto if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2) 217ff222b7eSTakashi Sakamoto return snd_motu_protocol_v2_get_clock_rate(motu, rate); 218ff222b7eSTakashi Sakamoto else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3) 219ff222b7eSTakashi Sakamoto return snd_motu_protocol_v3_get_clock_rate(motu, rate); 220d13d6b28STakashi Sakamoto else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1) 221d13d6b28STakashi Sakamoto return snd_motu_protocol_v1_get_clock_rate(motu, rate); 222ff222b7eSTakashi Sakamoto else 223ff222b7eSTakashi Sakamoto return -ENXIO; 224ff222b7eSTakashi Sakamoto } 225ff222b7eSTakashi Sakamoto 226ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_set_clock_rate(struct snd_motu *motu, 227ff222b7eSTakashi Sakamoto unsigned int rate) 228ff222b7eSTakashi Sakamoto { 229ff222b7eSTakashi Sakamoto if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2) 230ff222b7eSTakashi Sakamoto return snd_motu_protocol_v2_set_clock_rate(motu, rate); 231ff222b7eSTakashi Sakamoto else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3) 232ff222b7eSTakashi Sakamoto return snd_motu_protocol_v3_set_clock_rate(motu, rate); 233d13d6b28STakashi Sakamoto else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1) 234d13d6b28STakashi Sakamoto return snd_motu_protocol_v1_set_clock_rate(motu, rate); 235ff222b7eSTakashi Sakamoto else 236ff222b7eSTakashi Sakamoto return -ENXIO; 237ff222b7eSTakashi Sakamoto } 238ff222b7eSTakashi Sakamoto 239ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_get_clock_source(struct snd_motu *motu, 240ff222b7eSTakashi Sakamoto enum snd_motu_clock_source *source) 241ff222b7eSTakashi Sakamoto { 242ff222b7eSTakashi Sakamoto if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2) 243ff222b7eSTakashi Sakamoto return snd_motu_protocol_v2_get_clock_source(motu, source); 244ff222b7eSTakashi Sakamoto else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3) 245ff222b7eSTakashi Sakamoto return snd_motu_protocol_v3_get_clock_source(motu, source); 246d13d6b28STakashi Sakamoto else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1) 247d13d6b28STakashi Sakamoto return snd_motu_protocol_v1_get_clock_source(motu, source); 248ff222b7eSTakashi Sakamoto else 249ff222b7eSTakashi Sakamoto return -ENXIO; 250ff222b7eSTakashi Sakamoto } 251ff222b7eSTakashi Sakamoto 252ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_switch_fetching_mode(struct snd_motu *motu, 253ff222b7eSTakashi Sakamoto bool enable) 254ff222b7eSTakashi Sakamoto { 255ff222b7eSTakashi Sakamoto if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2) 256ff222b7eSTakashi Sakamoto return snd_motu_protocol_v2_switch_fetching_mode(motu, enable); 257ff222b7eSTakashi Sakamoto else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3) 258ff222b7eSTakashi Sakamoto return snd_motu_protocol_v3_switch_fetching_mode(motu, enable); 259d13d6b28STakashi Sakamoto else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1) 260d13d6b28STakashi Sakamoto return snd_motu_protocol_v1_switch_fetching_mode(motu, enable); 261ff222b7eSTakashi Sakamoto else 262ff222b7eSTakashi Sakamoto return -ENXIO; 263ff222b7eSTakashi Sakamoto } 264ff222b7eSTakashi Sakamoto 265ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_cache_packet_formats(struct snd_motu *motu) 266ff222b7eSTakashi Sakamoto { 267ff222b7eSTakashi Sakamoto if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2) 268ff222b7eSTakashi Sakamoto return snd_motu_protocol_v2_cache_packet_formats(motu); 269ff222b7eSTakashi Sakamoto else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3) 270ff222b7eSTakashi Sakamoto return snd_motu_protocol_v3_cache_packet_formats(motu); 271d13d6b28STakashi Sakamoto else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1) 272d13d6b28STakashi Sakamoto return snd_motu_protocol_v1_cache_packet_formats(motu); 273ff222b7eSTakashi Sakamoto else 274ff222b7eSTakashi Sakamoto return -ENXIO; 275ff222b7eSTakashi Sakamoto } 276ff222b7eSTakashi Sakamoto 277bea36afaSTakashi Sakamoto int snd_motu_register_dsp_message_parser_new(struct snd_motu *motu); 278bea36afaSTakashi Sakamoto int snd_motu_register_dsp_message_parser_init(struct snd_motu *motu); 279bea36afaSTakashi Sakamoto void snd_motu_register_dsp_message_parser_parse(struct snd_motu *motu, const struct pkt_desc *descs, 280bea36afaSTakashi Sakamoto unsigned int desc_count, unsigned int data_block_quadlets); 28158b62ab7STakashi Sakamoto void snd_motu_register_dsp_message_parser_copy_meter(struct snd_motu *motu, 28258b62ab7STakashi Sakamoto struct snd_firewire_motu_register_dsp_meter *meter); 283*ca15a09cSTakashi Sakamoto void snd_motu_register_dsp_message_parser_copy_parameter(struct snd_motu *motu, 284*ca15a09cSTakashi Sakamoto struct snd_firewire_motu_register_dsp_parameter *params); 28590b28f3bSTakashi Sakamoto 28690b28f3bSTakashi Sakamoto int snd_motu_command_dsp_message_parser_new(struct snd_motu *motu); 28790b28f3bSTakashi Sakamoto int snd_motu_command_dsp_message_parser_init(struct snd_motu *motu, enum cip_sfc sfc); 28890b28f3bSTakashi Sakamoto void snd_motu_command_dsp_message_parser_parse(struct snd_motu *motu, const struct pkt_desc *descs, 28990b28f3bSTakashi Sakamoto unsigned int desc_count, unsigned int data_block_quadlets); 29058b62ab7STakashi Sakamoto void snd_motu_command_dsp_message_parser_copy_meter(struct snd_motu *motu, 29158b62ab7STakashi Sakamoto struct snd_firewire_motu_command_dsp_meter *meter); 29290b28f3bSTakashi Sakamoto 2936c3cef48STakashi Sakamoto #endif 294