Linux Audio

Check our new training course

Loading...
v5.14.15
 1/* SPDX-License-Identifier: GPL-2.0 */
 2#ifndef SOUND_FIREWIRE_LIB_H_INCLUDED
 3#define SOUND_FIREWIRE_LIB_H_INCLUDED
 4
 5#include <linux/firewire-constants.h>
 6#include <linux/types.h>
 7#include <linux/sched.h>
 8#include <sound/rawmidi.h>
 9
10struct fw_unit;
11
12#define FW_GENERATION_MASK	0x00ff
13#define FW_FIXED_GENERATION	0x0100
14#define FW_QUIET		0x0200
15
16int snd_fw_transaction(struct fw_unit *unit, int tcode,
17		       u64 offset, void *buffer, size_t length,
18		       unsigned int flags);
19
20/* returns true if retrying the transaction would not make sense */
21static inline bool rcode_is_permanent_error(int rcode)
22{
23	return rcode == RCODE_TYPE_ERROR || rcode == RCODE_ADDRESS_ERROR;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24}
25
26#endif
v4.6
 
 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
25struct 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;
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
48int 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);
51void 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 */
58static inline void
59snd_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 */
72static inline void
73snd_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