xref: /linux/sound/firewire/motu/motu.h (revision a23e1966932464e1c5226cb9ac4ce1d5fc10ba22)
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;
774c9eda8fSTakashi Sakamoto 	struct snd_hwdep *hwdep;
78ccc6c1b0STakashi Sakamoto 
79ccc6c1b0STakashi Sakamoto 	struct amdtp_domain domain;
80e50dfac8STakashi Sakamoto 
81e50dfac8STakashi Sakamoto 	struct amdtp_motu_cache cache;
82bea36afaSTakashi Sakamoto 
83bea36afaSTakashi Sakamoto 	void *message_parser;
845e03c33eSTakashi Sakamoto };
855e03c33eSTakashi Sakamoto 
865e03c33eSTakashi Sakamoto enum snd_motu_spec_flags {
87739bdbaeSTakashi Sakamoto 	SND_MOTU_SPEC_RX_MIDI_2ND_Q	= 0x0001,
88739bdbaeSTakashi Sakamoto 	SND_MOTU_SPEC_RX_MIDI_3RD_Q	= 0x0002,
89739bdbaeSTakashi Sakamoto 	SND_MOTU_SPEC_TX_MIDI_2ND_Q	= 0x0004,
90739bdbaeSTakashi Sakamoto 	SND_MOTU_SPEC_TX_MIDI_3RD_Q	= 0x0008,
91bea36afaSTakashi Sakamoto 	SND_MOTU_SPEC_REGISTER_DSP	= 0x0010,
9290b28f3bSTakashi Sakamoto 	SND_MOTU_SPEC_COMMAND_DSP	= 0x0020,
935e03c33eSTakashi Sakamoto };
945e03c33eSTakashi Sakamoto 
9559f6482cSTakashi Sakamoto #define SND_MOTU_CLOCK_RATE_COUNT	6
9659f6482cSTakashi Sakamoto extern const unsigned int snd_motu_clock_rates[SND_MOTU_CLOCK_RATE_COUNT];
9759f6482cSTakashi Sakamoto 
9859f6482cSTakashi Sakamoto enum snd_motu_clock_source {
9959f6482cSTakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_INTERNAL,
10059f6482cSTakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_ADAT_ON_DSUB,
10159f6482cSTakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT,
10259f6482cSTakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_A,
10359f6482cSTakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_B,
10459f6482cSTakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT,
10559f6482cSTakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_A,
10659f6482cSTakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_B,
10759f6482cSTakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX,
10859f6482cSTakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_AESEBU_ON_XLR,
10959f6482cSTakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC,
1103f58f004STakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_SPH,
11159f6482cSTakashi Sakamoto 	SND_MOTU_CLOCK_SOURCE_UNKNOWN,
11259f6482cSTakashi Sakamoto };
11359f6482cSTakashi Sakamoto 
11461d79c70STakashi Sakamoto enum snd_motu_protocol_version {
115d13d6b28STakashi Sakamoto 	SND_MOTU_PROTOCOL_V1,
11661d79c70STakashi Sakamoto 	SND_MOTU_PROTOCOL_V2,
11761d79c70STakashi Sakamoto 	SND_MOTU_PROTOCOL_V3,
11861d79c70STakashi Sakamoto };
11961d79c70STakashi Sakamoto 
1205e03c33eSTakashi Sakamoto struct snd_motu_spec {
1215e03c33eSTakashi Sakamoto 	const char *const name;
12261d79c70STakashi Sakamoto 	enum snd_motu_protocol_version protocol_version;
123ffe66bbeSTakashi Sakamoto 	// The combination of snd_motu_spec_flags enumeration-constants.
124ffe66bbeSTakashi Sakamoto 	unsigned int flags;
1255e03c33eSTakashi Sakamoto 
126dfbaa4dcSTakashi Sakamoto 	unsigned char tx_fixed_pcm_chunks[3];
127dfbaa4dcSTakashi Sakamoto 	unsigned char rx_fixed_pcm_chunks[3];
1286c3cef48STakashi Sakamoto };
1296c3cef48STakashi Sakamoto 
130d13d6b28STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_828;
131b431f16fSTakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_896;
132d13d6b28STakashi Sakamoto 
133bd107372STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_828mk2;
13423c671beSTakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_896hd;
1350a7c7b47STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_traveler;
1360a7c7b47STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_ultralite;
1370a7c7b47STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_8pre;
1386c5e1ac0STakashi Sakamoto 
1395b24119eSTakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_828mk3_fw;
1405b24119eSTakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_828mk3_hybrid;
1416d5a2ddaSTakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_896mk3;
142bf868be7STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_traveler_mk3;
143e0b2db35STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_ultralite_mk3;
144c806a0e2STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_audio_express;
145411ac298STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_track16;
146c806a0e2STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_4pre;
147c806a0e2STakashi Sakamoto 
1484641c939STakashi Sakamoto int amdtp_motu_init(struct amdtp_stream *s, struct fw_unit *unit,
1494641c939STakashi Sakamoto 		    enum amdtp_stream_direction dir,
150e50dfac8STakashi Sakamoto 		    const struct snd_motu_spec *spec,
151e50dfac8STakashi Sakamoto 		    struct amdtp_motu_cache *cache);
1524641c939STakashi Sakamoto int amdtp_motu_set_parameters(struct amdtp_stream *s, unsigned int rate,
1539e796e7dSTakashi Sakamoto 			      unsigned int midi_ports,
1544641c939STakashi Sakamoto 			      struct snd_motu_packet_format *formats);
1554641c939STakashi Sakamoto int amdtp_motu_add_pcm_hw_constraints(struct amdtp_stream *s,
1564641c939STakashi Sakamoto 				      struct snd_pcm_runtime *runtime);
1579e796e7dSTakashi Sakamoto void amdtp_motu_midi_trigger(struct amdtp_stream *s, unsigned int port,
1589e796e7dSTakashi Sakamoto 			     struct snd_rawmidi_substream *midi);
1592e76701bSTakashi Sakamoto 
1602e76701bSTakashi Sakamoto int snd_motu_transaction_read(struct snd_motu *motu, u32 offset, __be32 *reg,
1612e76701bSTakashi Sakamoto 			      size_t size);
1622e76701bSTakashi Sakamoto int snd_motu_transaction_write(struct snd_motu *motu, u32 offset, __be32 *reg,
1632e76701bSTakashi Sakamoto 			       size_t size);
1642e76701bSTakashi Sakamoto int snd_motu_transaction_register(struct snd_motu *motu);
1652e76701bSTakashi Sakamoto int snd_motu_transaction_reregister(struct snd_motu *motu);
1662e76701bSTakashi Sakamoto void snd_motu_transaction_unregister(struct snd_motu *motu);
1679b2bb4f2STakashi Sakamoto 
1689b2bb4f2STakashi Sakamoto int snd_motu_stream_init_duplex(struct snd_motu *motu);
1699b2bb4f2STakashi Sakamoto void snd_motu_stream_destroy_duplex(struct snd_motu *motu);
1708b460c76STakashi Sakamoto int snd_motu_stream_cache_packet_formats(struct snd_motu *motu);
1710d39cd0eSTakashi Sakamoto int snd_motu_stream_reserve_duplex(struct snd_motu *motu, unsigned int rate,
1720f5482e7STakashi Sakamoto 				   unsigned int frames_per_period,
1730f5482e7STakashi Sakamoto 				   unsigned int frames_per_buffer);
1748edc56ecSTakashi Sakamoto int snd_motu_stream_start_duplex(struct snd_motu *motu);
1759b2bb4f2STakashi Sakamoto void snd_motu_stream_stop_duplex(struct snd_motu *motu);
17671c37977STakashi Sakamoto int snd_motu_stream_lock_try(struct snd_motu *motu);
17771c37977STakashi Sakamoto void snd_motu_stream_lock_release(struct snd_motu *motu);
1784638ec6eSTakashi Sakamoto 
1794638ec6eSTakashi Sakamoto void snd_motu_proc_init(struct snd_motu *motu);
180dd49b2d1STakashi Sakamoto 
181dd49b2d1STakashi Sakamoto int snd_motu_create_pcm_devices(struct snd_motu *motu);
1829e796e7dSTakashi Sakamoto 
1839e796e7dSTakashi Sakamoto int snd_motu_create_midi_devices(struct snd_motu *motu);
18471c37977STakashi Sakamoto 
18571c37977STakashi Sakamoto int snd_motu_create_hwdep_device(struct snd_motu *motu);
186ff222b7eSTakashi Sakamoto 
187d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_get_clock_rate(struct snd_motu *motu,
188d13d6b28STakashi Sakamoto 					unsigned int *rate);
189d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_set_clock_rate(struct snd_motu *motu,
190d13d6b28STakashi Sakamoto 					unsigned int rate);
191d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_get_clock_source(struct snd_motu *motu,
192d13d6b28STakashi Sakamoto 					  enum snd_motu_clock_source *src);
193d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_switch_fetching_mode(struct snd_motu *motu,
194d13d6b28STakashi Sakamoto 					      bool enable);
195d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_cache_packet_formats(struct snd_motu *motu);
196d13d6b28STakashi Sakamoto 
197ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_get_clock_rate(struct snd_motu *motu,
198ff222b7eSTakashi Sakamoto 					unsigned int *rate);
199ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_set_clock_rate(struct snd_motu *motu,
200ff222b7eSTakashi Sakamoto 					unsigned int rate);
201ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_get_clock_source(struct snd_motu *motu,
202ff222b7eSTakashi Sakamoto 					  enum snd_motu_clock_source *src);
203ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_switch_fetching_mode(struct snd_motu *motu,
204ff222b7eSTakashi Sakamoto 					      bool enable);
205ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_cache_packet_formats(struct snd_motu *motu);
206ff222b7eSTakashi Sakamoto 
207ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_get_clock_rate(struct snd_motu *motu,
208ff222b7eSTakashi Sakamoto 					unsigned int *rate);
209ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_set_clock_rate(struct snd_motu *motu,
210ff222b7eSTakashi Sakamoto 					unsigned int rate);
211ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_get_clock_source(struct snd_motu *motu,
212ff222b7eSTakashi Sakamoto 					  enum snd_motu_clock_source *src);
213ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_switch_fetching_mode(struct snd_motu *motu,
214ff222b7eSTakashi Sakamoto 					      bool enable);
215ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_cache_packet_formats(struct snd_motu *motu);
216ff222b7eSTakashi Sakamoto 
snd_motu_protocol_get_clock_rate(struct snd_motu * motu,unsigned int * rate)217ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_get_clock_rate(struct snd_motu *motu,
218ff222b7eSTakashi Sakamoto 						   unsigned int *rate)
219ff222b7eSTakashi Sakamoto {
220ff222b7eSTakashi Sakamoto 	if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
221ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v2_get_clock_rate(motu, rate);
222ff222b7eSTakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
223ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v3_get_clock_rate(motu, rate);
224d13d6b28STakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1)
225d13d6b28STakashi Sakamoto 		return snd_motu_protocol_v1_get_clock_rate(motu, rate);
226ff222b7eSTakashi Sakamoto 	else
227ff222b7eSTakashi Sakamoto 		return -ENXIO;
228ff222b7eSTakashi Sakamoto }
229ff222b7eSTakashi Sakamoto 
snd_motu_protocol_set_clock_rate(struct snd_motu * motu,unsigned int rate)230ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_set_clock_rate(struct snd_motu *motu,
231ff222b7eSTakashi Sakamoto 						   unsigned int rate)
232ff222b7eSTakashi Sakamoto {
233ff222b7eSTakashi Sakamoto 	if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
234ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v2_set_clock_rate(motu, rate);
235ff222b7eSTakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
236ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v3_set_clock_rate(motu, rate);
237d13d6b28STakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1)
238d13d6b28STakashi Sakamoto 		return snd_motu_protocol_v1_set_clock_rate(motu, rate);
239ff222b7eSTakashi Sakamoto 	else
240ff222b7eSTakashi Sakamoto 		return -ENXIO;
241ff222b7eSTakashi Sakamoto }
242ff222b7eSTakashi Sakamoto 
snd_motu_protocol_get_clock_source(struct snd_motu * motu,enum snd_motu_clock_source * source)243ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_get_clock_source(struct snd_motu *motu,
244ff222b7eSTakashi Sakamoto 					enum snd_motu_clock_source *source)
245ff222b7eSTakashi Sakamoto {
246ff222b7eSTakashi Sakamoto 	if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
247ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v2_get_clock_source(motu, source);
248ff222b7eSTakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
249ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v3_get_clock_source(motu, source);
250d13d6b28STakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1)
251d13d6b28STakashi Sakamoto 		return snd_motu_protocol_v1_get_clock_source(motu, source);
252ff222b7eSTakashi Sakamoto 	else
253ff222b7eSTakashi Sakamoto 		return -ENXIO;
254ff222b7eSTakashi Sakamoto }
255ff222b7eSTakashi Sakamoto 
snd_motu_protocol_switch_fetching_mode(struct snd_motu * motu,bool enable)256ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_switch_fetching_mode(struct snd_motu *motu,
257ff222b7eSTakashi Sakamoto 							 bool enable)
258ff222b7eSTakashi Sakamoto {
259ff222b7eSTakashi Sakamoto 	if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
260ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v2_switch_fetching_mode(motu, enable);
261ff222b7eSTakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
262ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v3_switch_fetching_mode(motu, enable);
263d13d6b28STakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1)
264d13d6b28STakashi Sakamoto 		return snd_motu_protocol_v1_switch_fetching_mode(motu, enable);
265ff222b7eSTakashi Sakamoto 	else
266ff222b7eSTakashi Sakamoto 		return -ENXIO;
267ff222b7eSTakashi Sakamoto }
268ff222b7eSTakashi Sakamoto 
snd_motu_protocol_cache_packet_formats(struct snd_motu * motu)269ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_cache_packet_formats(struct snd_motu *motu)
270ff222b7eSTakashi Sakamoto {
271ff222b7eSTakashi Sakamoto 	if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
272ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v2_cache_packet_formats(motu);
273ff222b7eSTakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
274ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v3_cache_packet_formats(motu);
275d13d6b28STakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1)
276d13d6b28STakashi Sakamoto 		return snd_motu_protocol_v1_cache_packet_formats(motu);
277ff222b7eSTakashi Sakamoto 	else
278ff222b7eSTakashi Sakamoto 		return -ENXIO;
279ff222b7eSTakashi Sakamoto }
280ff222b7eSTakashi Sakamoto 
281bea36afaSTakashi Sakamoto int snd_motu_register_dsp_message_parser_new(struct snd_motu *motu);
282bea36afaSTakashi Sakamoto int snd_motu_register_dsp_message_parser_init(struct snd_motu *motu);
2830cac60c7STakashi Sakamoto void snd_motu_register_dsp_message_parser_parse(const struct amdtp_stream *s,
2840cac60c7STakashi Sakamoto 					const struct pkt_desc *descs, unsigned int count);
28558b62ab7STakashi Sakamoto void snd_motu_register_dsp_message_parser_copy_meter(struct snd_motu *motu,
28658b62ab7STakashi Sakamoto 					struct snd_firewire_motu_register_dsp_meter *meter);
287ca15a09cSTakashi Sakamoto void snd_motu_register_dsp_message_parser_copy_parameter(struct snd_motu *motu,
288ca15a09cSTakashi Sakamoto 					struct snd_firewire_motu_register_dsp_parameter *params);
289634ec0b2STakashi Sakamoto unsigned int snd_motu_register_dsp_message_parser_count_event(struct snd_motu *motu);
290634ec0b2STakashi Sakamoto bool snd_motu_register_dsp_message_parser_copy_event(struct snd_motu *motu, u32 *event);
29190b28f3bSTakashi Sakamoto 
29290b28f3bSTakashi Sakamoto int snd_motu_command_dsp_message_parser_new(struct snd_motu *motu);
29390b28f3bSTakashi Sakamoto int snd_motu_command_dsp_message_parser_init(struct snd_motu *motu, enum cip_sfc sfc);
2940cac60c7STakashi Sakamoto void snd_motu_command_dsp_message_parser_parse(const struct amdtp_stream *s,
2950cac60c7STakashi Sakamoto 					const struct pkt_desc *descs, unsigned int count);
29658b62ab7STakashi Sakamoto void snd_motu_command_dsp_message_parser_copy_meter(struct snd_motu *motu,
29758b62ab7STakashi Sakamoto 					struct snd_firewire_motu_command_dsp_meter *meter);
29890b28f3bSTakashi Sakamoto 
2996c3cef48STakashi Sakamoto #endif
300