2011-03-15 14:53:21 +08:00
|
|
|
#ifndef SOUND_FIREWIRE_LIB_H_INCLUDED
|
|
|
|
#define SOUND_FIREWIRE_LIB_H_INCLUDED
|
|
|
|
|
|
|
|
#include <linux/firewire-constants.h>
|
|
|
|
#include <linux/types.h>
|
2015-10-09 07:10:25 +08:00
|
|
|
#include <linux/sched.h>
|
|
|
|
#include <sound/rawmidi.h>
|
2011-03-15 14:53:21 +08:00
|
|
|
|
|
|
|
struct fw_unit;
|
|
|
|
|
2011-09-05 04:17:38 +08:00
|
|
|
#define FW_GENERATION_MASK 0x00ff
|
|
|
|
#define FW_FIXED_GENERATION 0x0100
|
|
|
|
#define FW_QUIET 0x0200
|
|
|
|
|
2011-03-15 14:53:21 +08:00
|
|
|
int snd_fw_transaction(struct fw_unit *unit, int tcode,
|
2011-09-05 04:17:38 +08:00
|
|
|
u64 offset, void *buffer, size_t length,
|
|
|
|
unsigned int flags);
|
2011-03-15 14:53:21 +08:00
|
|
|
|
|
|
|
/* returns true if retrying the transaction would not make sense */
|
|
|
|
static inline bool rcode_is_permanent_error(int rcode)
|
|
|
|
{
|
|
|
|
return rcode == RCODE_TYPE_ERROR || rcode == RCODE_ADDRESS_ERROR;
|
|
|
|
}
|
|
|
|
|
2016-03-31 07:47:04 +08:00
|
|
|
void snd_fw_schedule_registration(struct fw_unit *unit,
|
|
|
|
struct delayed_work *dwork);
|
|
|
|
|
2015-10-09 07:10:25 +08:00
|
|
|
struct snd_fw_async_midi_port;
|
|
|
|
typedef int (*snd_fw_async_midi_port_fill)(
|
|
|
|
struct snd_rawmidi_substream *substream,
|
|
|
|
u8 *buf);
|
|
|
|
|
|
|
|
struct snd_fw_async_midi_port {
|
|
|
|
struct fw_device *parent;
|
|
|
|
struct work_struct work;
|
2015-10-09 07:10:26 +08:00
|
|
|
bool idling;
|
2015-10-09 07:10:28 +08:00
|
|
|
ktime_t next_ktime;
|
2015-10-09 07:10:29 +08:00
|
|
|
bool error;
|
2015-10-09 07:10:25 +08:00
|
|
|
|
|
|
|
u64 addr;
|
|
|
|
struct fw_transaction transaction;
|
|
|
|
|
|
|
|
u8 *buf;
|
|
|
|
unsigned int len;
|
|
|
|
|
|
|
|
struct snd_rawmidi_substream *substream;
|
|
|
|
snd_fw_async_midi_port_fill fill;
|
|
|
|
unsigned int consume_bytes;
|
|
|
|
};
|
|
|
|
|
|
|
|
int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port,
|
|
|
|
struct fw_unit *unit, u64 addr, unsigned int len,
|
|
|
|
snd_fw_async_midi_port_fill fill);
|
|
|
|
void snd_fw_async_midi_port_destroy(struct snd_fw_async_midi_port *port);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* snd_fw_async_midi_port_run - run transactions for the async MIDI port
|
|
|
|
* @port: the asynchronous MIDI port
|
|
|
|
* @substream: the MIDI substream
|
|
|
|
*/
|
|
|
|
static inline void
|
|
|
|
snd_fw_async_midi_port_run(struct snd_fw_async_midi_port *port,
|
|
|
|
struct snd_rawmidi_substream *substream)
|
|
|
|
{
|
2015-10-09 07:10:29 +08:00
|
|
|
if (!port->error) {
|
|
|
|
port->substream = substream;
|
|
|
|
schedule_work(&port->work);
|
|
|
|
}
|
2015-10-09 07:10:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* snd_fw_async_midi_port_finish - finish the asynchronous MIDI port
|
|
|
|
* @port: the asynchronous MIDI port
|
|
|
|
*/
|
|
|
|
static inline void
|
|
|
|
snd_fw_async_midi_port_finish(struct snd_fw_async_midi_port *port)
|
|
|
|
{
|
|
|
|
port->substream = NULL;
|
2015-10-09 07:10:29 +08:00
|
|
|
port->error = false;
|
2015-10-09 07:10:25 +08:00
|
|
|
}
|
|
|
|
|
2011-03-15 14:53:21 +08:00
|
|
|
#endif
|