]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - sound/firewire/lib.h
ALSA: firewire-lib: add a restriction for a transaction at once
[karo-tx-linux.git] / sound / firewire / lib.h
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