Linux Audio

Check our new training course

Loading...
v3.15
 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
 7struct fw_unit;
 8
 9#define FW_GENERATION_MASK	0x00ff
10#define FW_FIXED_GENERATION	0x0100
11#define FW_QUIET		0x0200
12
13int snd_fw_transaction(struct fw_unit *unit, int tcode,
14		       u64 offset, void *buffer, size_t length,
15		       unsigned int flags);
16
17/* returns true if retrying the transaction would not make sense */
18static inline bool rcode_is_permanent_error(int rcode)
19{
20	return rcode == RCODE_TYPE_ERROR || rcode == RCODE_ADDRESS_ERROR;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21}
22
23#endif
v4.10.11
 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
 9struct fw_unit;
10
11#define FW_GENERATION_MASK	0x00ff
12#define FW_FIXED_GENERATION	0x0100
13#define FW_QUIET		0x0200
14
15int 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 */
20static inline bool rcode_is_permanent_error(int rcode)
21{
22	return rcode == RCODE_TYPE_ERROR || rcode == RCODE_ADDRESS_ERROR;
23}
24
25void snd_fw_schedule_registration(struct fw_unit *unit,
26				  struct delayed_work *dwork);
27
28struct snd_fw_async_midi_port;
29typedef int (*snd_fw_async_midi_port_fill)(
30				struct snd_rawmidi_substream *substream,
31				u8 *buf);
32
33struct snd_fw_async_midi_port {
34	struct fw_device *parent;
35	struct work_struct work;
36	bool idling;
37	ktime_t next_ktime;
38	bool error;
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
51int 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);
54void 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 */
61static inline void
62snd_fw_async_midi_port_run(struct snd_fw_async_midi_port *port,
63			   struct snd_rawmidi_substream *substream)
64{
65	if (!port->error) {
66		port->substream = substream;
67		schedule_work(&port->work);
68	}
69}
70
71/**
72 * snd_fw_async_midi_port_finish - finish the asynchronous MIDI port
73 * @port: the asynchronous MIDI port
74 */
75static inline void
76snd_fw_async_midi_port_finish(struct snd_fw_async_midi_port *port)
77{
78	port->substream = NULL;
79	port->error = false;
80}
81
82#endif