| Clemens Ladisch | 31ef913 | 2011-03-15 07:53:21 +0100 | [diff] [blame] | 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> | 
| Takashi Sakamoto | 585d7cb | 2015-10-09 08:10:25 +0900 | [diff] [blame] | 6 | #include <linux/sched.h> | 
 | 7 | #include <sound/rawmidi.h> | 
| Clemens Ladisch | 31ef913 | 2011-03-15 07:53:21 +0100 | [diff] [blame] | 8 |  | 
 | 9 | struct fw_unit; | 
 | 10 |  | 
| Clemens Ladisch | 1b70485 | 2011-09-04 22:17:38 +0200 | [diff] [blame] | 11 | #define FW_GENERATION_MASK	0x00ff | 
 | 12 | #define FW_FIXED_GENERATION	0x0100 | 
 | 13 | #define FW_QUIET		0x0200 | 
 | 14 |  | 
| Clemens Ladisch | 31ef913 | 2011-03-15 07:53:21 +0100 | [diff] [blame] | 15 | int snd_fw_transaction(struct fw_unit *unit, int tcode, | 
| Clemens Ladisch | 1b70485 | 2011-09-04 22:17:38 +0200 | [diff] [blame] | 16 | 		       u64 offset, void *buffer, size_t length, | 
 | 17 | 		       unsigned int flags); | 
| Clemens Ladisch | 31ef913 | 2011-03-15 07:53:21 +0100 | [diff] [blame] | 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 |  | 
| Takashi Sakamoto | 923f92e | 2016-03-31 08:47:04 +0900 | [diff] [blame] | 25 | void snd_fw_schedule_registration(struct fw_unit *unit, | 
 | 26 | 				  struct delayed_work *dwork); | 
 | 27 |  | 
| Takashi Sakamoto | 585d7cb | 2015-10-09 08:10:25 +0900 | [diff] [blame] | 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; | 
| Takashi Sakamoto | d3ef9cb | 2015-10-09 08:10:26 +0900 | [diff] [blame] | 36 | 	bool idling; | 
| Takashi Sakamoto | ea848b7 | 2015-10-09 08:10:28 +0900 | [diff] [blame] | 37 | 	ktime_t next_ktime; | 
| Takashi Sakamoto | bde3e28 | 2015-10-09 08:10:29 +0900 | [diff] [blame] | 38 | 	bool error; | 
| Takashi Sakamoto | 585d7cb | 2015-10-09 08:10:25 +0900 | [diff] [blame] | 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 | { | 
| Takashi Sakamoto | bde3e28 | 2015-10-09 08:10:29 +0900 | [diff] [blame] | 65 | 	if (!port->error) { | 
 | 66 | 		port->substream = substream; | 
 | 67 | 		schedule_work(&port->work); | 
 | 68 | 	} | 
| Takashi Sakamoto | 585d7cb | 2015-10-09 08:10:25 +0900 | [diff] [blame] | 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; | 
| Takashi Sakamoto | bde3e28 | 2015-10-09 08:10:29 +0900 | [diff] [blame] | 79 | 	port->error = false; | 
| Takashi Sakamoto | 585d7cb | 2015-10-09 08:10:25 +0900 | [diff] [blame] | 80 | } | 
 | 81 |  | 
| Clemens Ladisch | 31ef913 | 2011-03-15 07:53:21 +0100 | [diff] [blame] | 82 | #endif |