xref: /openbmc/linux/sound/firewire/motu/motu.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
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;
141bf868be7STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_traveler_mk3;
142e0b2db35STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_ultralite_mk3;
143c806a0e2STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_audio_express;
144411ac298STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_track16;
145c806a0e2STakashi Sakamoto extern const struct snd_motu_spec snd_motu_spec_4pre;
146c806a0e2STakashi Sakamoto 
1474641c939STakashi Sakamoto int amdtp_motu_init(struct amdtp_stream *s, struct fw_unit *unit,
1484641c939STakashi Sakamoto 		    enum amdtp_stream_direction dir,
149e50dfac8STakashi Sakamoto 		    const struct snd_motu_spec *spec,
150e50dfac8STakashi Sakamoto 		    struct amdtp_motu_cache *cache);
1514641c939STakashi Sakamoto int amdtp_motu_set_parameters(struct amdtp_stream *s, unsigned int rate,
1529e796e7dSTakashi Sakamoto 			      unsigned int midi_ports,
1534641c939STakashi Sakamoto 			      struct snd_motu_packet_format *formats);
1544641c939STakashi Sakamoto int amdtp_motu_add_pcm_hw_constraints(struct amdtp_stream *s,
1554641c939STakashi Sakamoto 				      struct snd_pcm_runtime *runtime);
1569e796e7dSTakashi Sakamoto void amdtp_motu_midi_trigger(struct amdtp_stream *s, unsigned int port,
1579e796e7dSTakashi Sakamoto 			     struct snd_rawmidi_substream *midi);
1582e76701bSTakashi Sakamoto 
1592e76701bSTakashi Sakamoto int snd_motu_transaction_read(struct snd_motu *motu, u32 offset, __be32 *reg,
1602e76701bSTakashi Sakamoto 			      size_t size);
1612e76701bSTakashi Sakamoto int snd_motu_transaction_write(struct snd_motu *motu, u32 offset, __be32 *reg,
1622e76701bSTakashi Sakamoto 			       size_t size);
1632e76701bSTakashi Sakamoto int snd_motu_transaction_register(struct snd_motu *motu);
1642e76701bSTakashi Sakamoto int snd_motu_transaction_reregister(struct snd_motu *motu);
1652e76701bSTakashi Sakamoto void snd_motu_transaction_unregister(struct snd_motu *motu);
1669b2bb4f2STakashi Sakamoto 
1679b2bb4f2STakashi Sakamoto int snd_motu_stream_init_duplex(struct snd_motu *motu);
1689b2bb4f2STakashi Sakamoto void snd_motu_stream_destroy_duplex(struct snd_motu *motu);
1698b460c76STakashi Sakamoto int snd_motu_stream_cache_packet_formats(struct snd_motu *motu);
1700d39cd0eSTakashi Sakamoto int snd_motu_stream_reserve_duplex(struct snd_motu *motu, unsigned int rate,
1710f5482e7STakashi Sakamoto 				   unsigned int frames_per_period,
1720f5482e7STakashi Sakamoto 				   unsigned int frames_per_buffer);
1738edc56ecSTakashi Sakamoto int snd_motu_stream_start_duplex(struct snd_motu *motu);
1749b2bb4f2STakashi Sakamoto void snd_motu_stream_stop_duplex(struct snd_motu *motu);
17571c37977STakashi Sakamoto int snd_motu_stream_lock_try(struct snd_motu *motu);
17671c37977STakashi Sakamoto void snd_motu_stream_lock_release(struct snd_motu *motu);
1774638ec6eSTakashi Sakamoto 
1784638ec6eSTakashi Sakamoto void snd_motu_proc_init(struct snd_motu *motu);
179dd49b2d1STakashi Sakamoto 
180dd49b2d1STakashi Sakamoto int snd_motu_create_pcm_devices(struct snd_motu *motu);
1819e796e7dSTakashi Sakamoto 
1829e796e7dSTakashi Sakamoto int snd_motu_create_midi_devices(struct snd_motu *motu);
18371c37977STakashi Sakamoto 
18471c37977STakashi Sakamoto int snd_motu_create_hwdep_device(struct snd_motu *motu);
185ff222b7eSTakashi Sakamoto 
186d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_get_clock_rate(struct snd_motu *motu,
187d13d6b28STakashi Sakamoto 					unsigned int *rate);
188d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_set_clock_rate(struct snd_motu *motu,
189d13d6b28STakashi Sakamoto 					unsigned int rate);
190d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_get_clock_source(struct snd_motu *motu,
191d13d6b28STakashi Sakamoto 					  enum snd_motu_clock_source *src);
192d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_switch_fetching_mode(struct snd_motu *motu,
193d13d6b28STakashi Sakamoto 					      bool enable);
194d13d6b28STakashi Sakamoto int snd_motu_protocol_v1_cache_packet_formats(struct snd_motu *motu);
195d13d6b28STakashi Sakamoto 
196ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_get_clock_rate(struct snd_motu *motu,
197ff222b7eSTakashi Sakamoto 					unsigned int *rate);
198ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_set_clock_rate(struct snd_motu *motu,
199ff222b7eSTakashi Sakamoto 					unsigned int rate);
200ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_get_clock_source(struct snd_motu *motu,
201ff222b7eSTakashi Sakamoto 					  enum snd_motu_clock_source *src);
202ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_switch_fetching_mode(struct snd_motu *motu,
203ff222b7eSTakashi Sakamoto 					      bool enable);
204ff222b7eSTakashi Sakamoto int snd_motu_protocol_v2_cache_packet_formats(struct snd_motu *motu);
205ff222b7eSTakashi Sakamoto 
206ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_get_clock_rate(struct snd_motu *motu,
207ff222b7eSTakashi Sakamoto 					unsigned int *rate);
208ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_set_clock_rate(struct snd_motu *motu,
209ff222b7eSTakashi Sakamoto 					unsigned int rate);
210ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_get_clock_source(struct snd_motu *motu,
211ff222b7eSTakashi Sakamoto 					  enum snd_motu_clock_source *src);
212ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_switch_fetching_mode(struct snd_motu *motu,
213ff222b7eSTakashi Sakamoto 					      bool enable);
214ff222b7eSTakashi Sakamoto int snd_motu_protocol_v3_cache_packet_formats(struct snd_motu *motu);
215ff222b7eSTakashi Sakamoto 
snd_motu_protocol_get_clock_rate(struct snd_motu * motu,unsigned int * rate)216ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_get_clock_rate(struct snd_motu *motu,
217ff222b7eSTakashi Sakamoto 						   unsigned int *rate)
218ff222b7eSTakashi Sakamoto {
219ff222b7eSTakashi Sakamoto 	if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
220ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v2_get_clock_rate(motu, rate);
221ff222b7eSTakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
222ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v3_get_clock_rate(motu, rate);
223d13d6b28STakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1)
224d13d6b28STakashi Sakamoto 		return snd_motu_protocol_v1_get_clock_rate(motu, rate);
225ff222b7eSTakashi Sakamoto 	else
226ff222b7eSTakashi Sakamoto 		return -ENXIO;
227ff222b7eSTakashi Sakamoto }
228ff222b7eSTakashi Sakamoto 
snd_motu_protocol_set_clock_rate(struct snd_motu * motu,unsigned int rate)229ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_set_clock_rate(struct snd_motu *motu,
230ff222b7eSTakashi Sakamoto 						   unsigned int rate)
231ff222b7eSTakashi Sakamoto {
232ff222b7eSTakashi Sakamoto 	if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
233ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v2_set_clock_rate(motu, rate);
234ff222b7eSTakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
235ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v3_set_clock_rate(motu, rate);
236d13d6b28STakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1)
237d13d6b28STakashi Sakamoto 		return snd_motu_protocol_v1_set_clock_rate(motu, rate);
238ff222b7eSTakashi Sakamoto 	else
239ff222b7eSTakashi Sakamoto 		return -ENXIO;
240ff222b7eSTakashi Sakamoto }
241ff222b7eSTakashi Sakamoto 
snd_motu_protocol_get_clock_source(struct snd_motu * motu,enum snd_motu_clock_source * source)242ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_get_clock_source(struct snd_motu *motu,
243ff222b7eSTakashi Sakamoto 					enum snd_motu_clock_source *source)
244ff222b7eSTakashi Sakamoto {
245ff222b7eSTakashi Sakamoto 	if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
246ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v2_get_clock_source(motu, source);
247ff222b7eSTakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
248ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v3_get_clock_source(motu, source);
249d13d6b28STakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1)
250d13d6b28STakashi Sakamoto 		return snd_motu_protocol_v1_get_clock_source(motu, source);
251ff222b7eSTakashi Sakamoto 	else
252ff222b7eSTakashi Sakamoto 		return -ENXIO;
253ff222b7eSTakashi Sakamoto }
254ff222b7eSTakashi Sakamoto 
snd_motu_protocol_switch_fetching_mode(struct snd_motu * motu,bool enable)255ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_switch_fetching_mode(struct snd_motu *motu,
256ff222b7eSTakashi Sakamoto 							 bool enable)
257ff222b7eSTakashi Sakamoto {
258ff222b7eSTakashi Sakamoto 	if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
259ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v2_switch_fetching_mode(motu, enable);
260ff222b7eSTakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
261ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v3_switch_fetching_mode(motu, enable);
262d13d6b28STakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1)
263d13d6b28STakashi Sakamoto 		return snd_motu_protocol_v1_switch_fetching_mode(motu, enable);
264ff222b7eSTakashi Sakamoto 	else
265ff222b7eSTakashi Sakamoto 		return -ENXIO;
266ff222b7eSTakashi Sakamoto }
267ff222b7eSTakashi Sakamoto 
snd_motu_protocol_cache_packet_formats(struct snd_motu * motu)268ff222b7eSTakashi Sakamoto static inline int snd_motu_protocol_cache_packet_formats(struct snd_motu *motu)
269ff222b7eSTakashi Sakamoto {
270ff222b7eSTakashi Sakamoto 	if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V2)
271ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v2_cache_packet_formats(motu);
272ff222b7eSTakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V3)
273ff222b7eSTakashi Sakamoto 		return snd_motu_protocol_v3_cache_packet_formats(motu);
274d13d6b28STakashi Sakamoto 	else if (motu->spec->protocol_version == SND_MOTU_PROTOCOL_V1)
275d13d6b28STakashi Sakamoto 		return snd_motu_protocol_v1_cache_packet_formats(motu);
276ff222b7eSTakashi Sakamoto 	else
277ff222b7eSTakashi Sakamoto 		return -ENXIO;
278ff222b7eSTakashi Sakamoto }
279ff222b7eSTakashi Sakamoto 
280bea36afaSTakashi Sakamoto int snd_motu_register_dsp_message_parser_new(struct snd_motu *motu);
281bea36afaSTakashi Sakamoto int snd_motu_register_dsp_message_parser_init(struct snd_motu *motu);
282*0cac60c7STakashi Sakamoto void snd_motu_register_dsp_message_parser_parse(const struct amdtp_stream *s,
283*0cac60c7STakashi Sakamoto 					const struct pkt_desc *descs, unsigned int count);
28458b62ab7STakashi Sakamoto void snd_motu_register_dsp_message_parser_copy_meter(struct snd_motu *motu,
28558b62ab7STakashi Sakamoto 					struct snd_firewire_motu_register_dsp_meter *meter);
286ca15a09cSTakashi Sakamoto void snd_motu_register_dsp_message_parser_copy_parameter(struct snd_motu *motu,
287ca15a09cSTakashi Sakamoto 					struct snd_firewire_motu_register_dsp_parameter *params);
288634ec0b2STakashi Sakamoto unsigned int snd_motu_register_dsp_message_parser_count_event(struct snd_motu *motu);
289634ec0b2STakashi Sakamoto bool snd_motu_register_dsp_message_parser_copy_event(struct snd_motu *motu, u32 *event);
29090b28f3bSTakashi Sakamoto 
29190b28f3bSTakashi Sakamoto int snd_motu_command_dsp_message_parser_new(struct snd_motu *motu);
29290b28f3bSTakashi Sakamoto int snd_motu_command_dsp_message_parser_init(struct snd_motu *motu, enum cip_sfc sfc);
293*0cac60c7STakashi Sakamoto void snd_motu_command_dsp_message_parser_parse(const struct amdtp_stream *s,
294*0cac60c7STakashi Sakamoto 					const struct pkt_desc *descs, unsigned int count);
29558b62ab7STakashi Sakamoto void snd_motu_command_dsp_message_parser_copy_meter(struct snd_motu *motu,
29658b62ab7STakashi Sakamoto 					struct snd_firewire_motu_command_dsp_meter *meter);
29790b28f3bSTakashi Sakamoto 
2986c3cef48STakashi Sakamoto #endif
299