These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / 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         ktime_t next_ktime;
35         bool error;
36
37         u64 addr;
38         struct fw_transaction transaction;
39
40         u8 *buf;
41         unsigned int len;
42
43         struct snd_rawmidi_substream *substream;
44         snd_fw_async_midi_port_fill fill;
45         unsigned int consume_bytes;
46 };
47
48 int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port,
49                 struct fw_unit *unit, u64 addr, unsigned int len,
50                 snd_fw_async_midi_port_fill fill);
51 void snd_fw_async_midi_port_destroy(struct snd_fw_async_midi_port *port);
52
53 /**
54  * snd_fw_async_midi_port_run - run transactions for the async MIDI port
55  * @port: the asynchronous MIDI port
56  * @substream: the MIDI substream
57  */
58 static inline void
59 snd_fw_async_midi_port_run(struct snd_fw_async_midi_port *port,
60                            struct snd_rawmidi_substream *substream)
61 {
62         if (!port->error) {
63                 port->substream = substream;
64                 schedule_work(&port->work);
65         }
66 }
67
68 /**
69  * snd_fw_async_midi_port_finish - finish the asynchronous MIDI port
70  * @port: the asynchronous MIDI port
71  */
72 static inline void
73 snd_fw_async_midi_port_finish(struct snd_fw_async_midi_port *port)
74 {
75         port->substream = NULL;
76         port->error = false;
77 }
78
79 #endif