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 | ||
923f92eb TS |
25 | void snd_fw_schedule_registration(struct fw_unit *unit, |
26 | struct delayed_work *dwork); | |
27 | ||
585d7cba TS |
28 | struct snd_fw_async_midi_port; |
29 | typedef int (*snd_fw_async_midi_port_fill)( | |
30 | struct snd_rawmidi_substream *substream, | |
31 | u8 *buf); | |
32 | ||
33 | struct snd_fw_async_midi_port { | |
34 | struct fw_device *parent; | |
35 | struct work_struct work; | |
d3ef9cb9 | 36 | bool idling; |
ea848b7b | 37 | ktime_t next_ktime; |
bde3e288 | 38 | bool error; |
585d7cba TS |
39 | |
40 | u64 addr; | |
41 | struct fw_transaction transaction; | |
42 | ||
43 | u8 *buf; | |
44 | unsigned int len; | |
45 | ||
46 | struct snd_rawmidi_substream *substream; | |
47 | snd_fw_async_midi_port_fill fill; | |
48 | unsigned int consume_bytes; | |
49 | }; | |
50 | ||
51 | int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port, | |
52 | struct fw_unit *unit, u64 addr, unsigned int len, | |
53 | snd_fw_async_midi_port_fill fill); | |
54 | void snd_fw_async_midi_port_destroy(struct snd_fw_async_midi_port *port); | |
55 | ||
56 | /** | |
57 | * snd_fw_async_midi_port_run - run transactions for the async MIDI port | |
58 | * @port: the asynchronous MIDI port | |
59 | * @substream: the MIDI substream | |
60 | */ | |
61 | static inline void | |
62 | snd_fw_async_midi_port_run(struct snd_fw_async_midi_port *port, | |
63 | struct snd_rawmidi_substream *substream) | |
64 | { | |
bde3e288 TS |
65 | if (!port->error) { |
66 | port->substream = substream; | |
67 | schedule_work(&port->work); | |
68 | } | |
585d7cba TS |
69 | } |
70 | ||
71 | /** | |
72 | * snd_fw_async_midi_port_finish - finish the asynchronous MIDI port | |
73 | * @port: the asynchronous MIDI port | |
74 | */ | |
75 | static inline void | |
76 | snd_fw_async_midi_port_finish(struct snd_fw_async_midi_port *port) | |
77 | { | |
78 | port->substream = NULL; | |
bde3e288 | 79 | port->error = false; |
585d7cba TS |
80 | } |
81 | ||
31ef9134 | 82 | #endif |