linux/sound/firewire/lib.h
<<
>>
Prefs
   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
  83