xref: /openbmc/linux/sound/firewire/lib.h (revision d3ef9cb9)
1 #ifndef SOUND_FIREWIRE_LIB_H_INCLUDED
2 #define SOUND_FIREWIRE_LIB_H_INCLUDED
3 
4 #include <linux/firewire-constants.h>
5 #include <linux/types.h>
6 #include <linux/sched.h>
7 #include <sound/rawmidi.h>
8 
9 struct fw_unit;
10 
11 #define FW_GENERATION_MASK	0x00ff
12 #define FW_FIXED_GENERATION	0x0100
13 #define FW_QUIET		0x0200
14 
15 int snd_fw_transaction(struct fw_unit *unit, int tcode,
16 		       u64 offset, void *buffer, size_t length,
17 		       unsigned int flags);
18 
19 /* returns true if retrying the transaction would not make sense */
20 static inline bool rcode_is_permanent_error(int rcode)
21 {
22 	return rcode == RCODE_TYPE_ERROR || rcode == RCODE_ADDRESS_ERROR;
23 }
24 
25 struct snd_fw_async_midi_port;
26 typedef int (*snd_fw_async_midi_port_fill)(
27 				struct snd_rawmidi_substream *substream,
28 				u8 *buf);
29 
30 struct snd_fw_async_midi_port {
31 	struct fw_device *parent;
32 	struct work_struct work;
33 	bool idling;
34 
35 	u64 addr;
36 	struct fw_transaction transaction;
37 
38 	u8 *buf;
39 	unsigned int len;
40 
41 	struct snd_rawmidi_substream *substream;
42 	snd_fw_async_midi_port_fill fill;
43 	unsigned int consume_bytes;
44 };
45 
46 int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port,
47 		struct fw_unit *unit, u64 addr, unsigned int len,
48 		snd_fw_async_midi_port_fill fill);
49 void snd_fw_async_midi_port_destroy(struct snd_fw_async_midi_port *port);
50 
51 /**
52  * snd_fw_async_midi_port_run - run transactions for the async MIDI port
53  * @port: the asynchronous MIDI port
54  * @substream: the MIDI substream
55  */
56 static inline void
57 snd_fw_async_midi_port_run(struct snd_fw_async_midi_port *port,
58 			   struct snd_rawmidi_substream *substream)
59 {
60 	port->substream = substream;
61 	schedule_work(&port->work);
62 }
63 
64 /**
65  * snd_fw_async_midi_port_finish - finish the asynchronous MIDI port
66  * @port: the asynchronous MIDI port
67  */
68 static inline void
69 snd_fw_async_midi_port_finish(struct snd_fw_async_midi_port *port)
70 {
71 	port->substream = NULL;
72 }
73 
74 #endif
75