blob: 59e08658721268e24e17562b58f73a03f18ec060 [file] [log] [blame]
Clemens Ladisch31ef9132011-03-15 07:53:21 +01001#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>
Takashi Sakamoto585d7cb2015-10-09 08:10:25 +09006#include <linux/sched.h>
7#include <sound/rawmidi.h>
Clemens Ladisch31ef9132011-03-15 07:53:21 +01008
9struct fw_unit;
10
Clemens Ladisch1b704852011-09-04 22:17:38 +020011#define FW_GENERATION_MASK 0x00ff
12#define FW_FIXED_GENERATION 0x0100
13#define FW_QUIET 0x0200
14
Clemens Ladisch31ef9132011-03-15 07:53:21 +010015int snd_fw_transaction(struct fw_unit *unit, int tcode,
Clemens Ladisch1b704852011-09-04 22:17:38 +020016 u64 offset, void *buffer, size_t length,
17 unsigned int flags);
Clemens Ladisch31ef9132011-03-15 07:53:21 +010018
19/* returns true if retrying the transaction would not make sense */
20static inline bool rcode_is_permanent_error(int rcode)
21{
22 return rcode == RCODE_TYPE_ERROR || rcode == RCODE_ADDRESS_ERROR;
23}
24
Takashi Sakamoto585d7cb2015-10-09 08:10:25 +090025struct snd_fw_async_midi_port;
26typedef int (*snd_fw_async_midi_port_fill)(
27 struct snd_rawmidi_substream *substream,
28 u8 *buf);
29
30struct snd_fw_async_midi_port {
31 struct fw_device *parent;
32 struct work_struct work;
Takashi Sakamotod3ef9cb2015-10-09 08:10:26 +090033 bool idling;
Takashi Sakamotoea848b72015-10-09 08:10:28 +090034 ktime_t next_ktime;
Takashi Sakamoto585d7cb2015-10-09 08:10:25 +090035
36 u64 addr;
37 struct fw_transaction transaction;
38
39 u8 *buf;
40 unsigned int len;
41
42 struct snd_rawmidi_substream *substream;
43 snd_fw_async_midi_port_fill fill;
44 unsigned int consume_bytes;
45};
46
47int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port,
48 struct fw_unit *unit, u64 addr, unsigned int len,
49 snd_fw_async_midi_port_fill fill);
50void snd_fw_async_midi_port_destroy(struct snd_fw_async_midi_port *port);
51
52/**
53 * snd_fw_async_midi_port_run - run transactions for the async MIDI port
54 * @port: the asynchronous MIDI port
55 * @substream: the MIDI substream
56 */
57static inline void
58snd_fw_async_midi_port_run(struct snd_fw_async_midi_port *port,
59 struct snd_rawmidi_substream *substream)
60{
61 port->substream = substream;
62 schedule_work(&port->work);
63}
64
65/**
66 * snd_fw_async_midi_port_finish - finish the asynchronous MIDI port
67 * @port: the asynchronous MIDI port
68 */
69static inline void
70snd_fw_async_midi_port_finish(struct snd_fw_async_midi_port *port)
71{
72 port->substream = NULL;
73}
74
Clemens Ladisch31ef9132011-03-15 07:53:21 +010075#endif