Commit | Line | Data |
---|---|---|
31ef9134 CL |
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> | |
585d7cba TS |
6 | #include <linux/sched.h> |
7 | #include <sound/rawmidi.h> | |
31ef9134 CL |
8 | |
9 | struct fw_unit; | |
10 | ||
1b70485f CL |
11 | #define FW_GENERATION_MASK 0x00ff |
12 | #define FW_FIXED_GENERATION 0x0100 | |
13 | #define FW_QUIET 0x0200 | |
14 | ||
31ef9134 | 15 | int snd_fw_transaction(struct fw_unit *unit, int tcode, |
1b70485f CL |
16 | u64 offset, void *buffer, size_t length, |
17 | unsigned int flags); | |
31ef9134 CL |
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 | ||
585d7cba TS |
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; | |
d3ef9cb9 | 33 | bool idling; |
ea848b7b | 34 | ktime_t next_ktime; |
bde3e288 | 35 | bool error; |
585d7cba TS |
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 | { | |
bde3e288 TS |
62 | if (!port->error) { |
63 | port->substream = substream; | |
64 | schedule_work(&port->work); | |
65 | } | |
585d7cba TS |
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; | |
bde3e288 | 76 | port->error = false; |
585d7cba TS |
77 | } |
78 | ||
31ef9134 | 79 | #endif |