2011-03-15 09:53:21 +03: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 02:10:25 +03:00
# include <linux/sched.h>
# include <sound/rawmidi.h>
2011-03-15 09:53:21 +03:00
struct fw_unit ;
2011-09-05 00:17:38 +04:00
# define FW_GENERATION_MASK 0x00ff
# define FW_FIXED_GENERATION 0x0100
# define FW_QUIET 0x0200
2011-03-15 09:53:21 +03:00
int snd_fw_transaction ( struct fw_unit * unit , int tcode ,
2011-09-05 00:17:38 +04:00
u64 offset , void * buffer , size_t length ,
unsigned int flags ) ;
2011-03-15 09:53:21 +03: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 02:47:04 +03:00
void snd_fw_schedule_registration ( struct fw_unit * unit ,
struct delayed_work * dwork ) ;
2015-10-09 02:10:25 +03: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 02:10:26 +03:00
bool idling ;
2015-10-09 02:10:28 +03:00
ktime_t next_ktime ;
2015-10-09 02:10:29 +03:00
bool error ;
2015-10-09 02:10:25 +03: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 02:10:29 +03:00
if ( ! port - > error ) {
port - > substream = substream ;
schedule_work ( & port - > work ) ;
}
2015-10-09 02:10:25 +03: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 02:10:29 +03:00
port - > error = false ;
2015-10-09 02:10:25 +03:00
}
2011-03-15 09:53:21 +03:00
# endif