215 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Line 6 Linux USB driver4 *5 * Copyright (C) 2004-2010 Markus Grabner (line6@grabner-graz.at)6 */7 8#ifndef DRIVER_H9#define DRIVER_H10 11#include <linux/usb.h>12#include <linux/mutex.h>13#include <linux/kfifo.h>14#include <sound/core.h>15 16#include "midi.h"17 18/* USB 1.1 speed configuration */19#define USB_LOW_INTERVALS_PER_SECOND 100020#define USB_LOW_ISO_BUFFERS 221 22/* USB 2.0+ speed configuration */23#define USB_HIGH_INTERVALS_PER_SECOND 800024#define USB_HIGH_ISO_BUFFERS 1625 26/* Fallback USB interval and max packet size values */27#define LINE6_FALLBACK_INTERVAL 1028#define LINE6_FALLBACK_MAXPACKETSIZE 1629 30#define LINE6_TIMEOUT 100031#define LINE6_BUFSIZE_LISTEN 6432#define LINE6_MIDI_MESSAGE_MAXLEN 25633 34#define LINE6_RAW_MESSAGES_MAXCOUNT_ORDER 735/* 4k packets are common, BUFSIZE * MAXCOUNT should be bigger... */36#define LINE6_RAW_MESSAGES_MAXCOUNT (1 << LINE6_RAW_MESSAGES_MAXCOUNT_ORDER)37 38 39#if LINE6_BUFSIZE_LISTEN > 6553540#error "Use dynamic fifo instead"41#endif42 43/*44 Line 6 MIDI control commands45*/46#define LINE6_PARAM_CHANGE 0xb047#define LINE6_PROGRAM_CHANGE 0xc048#define LINE6_SYSEX_BEGIN 0xf049#define LINE6_SYSEX_END 0xf750#define LINE6_RESET 0xff51 52/*53 MIDI channel for messages initiated by the host54 (and eventually echoed back by the device)55*/56#define LINE6_CHANNEL_HOST 0x0057 58/*59 MIDI channel for messages initiated by the device60*/61#define LINE6_CHANNEL_DEVICE 0x0262 63#define LINE6_CHANNEL_UNKNOWN 5 /* don't know yet what this is good for */64 65#define LINE6_CHANNEL_MASK 0x0f66 67extern const unsigned char line6_midi_id[3];68 69#define SYSEX_DATA_OFS (sizeof(line6_midi_id) + 3)70#define SYSEX_EXTRA_SIZE (sizeof(line6_midi_id) + 4)71 72/*73 Common properties of Line 6 devices.74*/75struct line6_properties {76 /* Card id string (maximum 16 characters).77 * This can be used to address the device in ALSA programs as78 * "default:CARD=<id>"79 */80 const char *id;81 82 /* Card short name (maximum 32 characters) */83 const char *name;84 85 /* Bit vector defining this device's capabilities in line6usb driver */86 int capabilities;87 88 int altsetting;89 90 unsigned int ctrl_if;91 unsigned int ep_ctrl_r;92 unsigned int ep_ctrl_w;93 unsigned int ep_audio_r;94 unsigned int ep_audio_w;95};96 97/* Capability bits */98enum {99 /* device supports settings parameter via USB */100 LINE6_CAP_CONTROL = 1 << 0,101 /* device supports PCM input/output via USB */102 LINE6_CAP_PCM = 1 << 1,103 /* device supports hardware monitoring */104 LINE6_CAP_HWMON = 1 << 2,105 /* device requires output data when input is read */106 LINE6_CAP_IN_NEEDS_OUT = 1 << 3,107 /* device uses raw MIDI via USB (data endpoints) */108 LINE6_CAP_CONTROL_MIDI = 1 << 4,109 /* device provides low-level information */110 LINE6_CAP_CONTROL_INFO = 1 << 5,111 /* device provides hardware monitoring volume control */112 LINE6_CAP_HWMON_CTL = 1 << 6,113};114 115/*116 Common data shared by all Line 6 devices.117 Corresponds to a pair of USB endpoints.118*/119struct usb_line6 {120 /* USB device */121 struct usb_device *usbdev;122 123 /* Properties */124 const struct line6_properties *properties;125 126 /* Interval for data USB packets */127 int interval;128 /* ...for isochronous transfers framing */129 int intervals_per_second;130 131 /* Number of isochronous URBs used for frame transfers */132 int iso_buffers;133 134 /* Maximum size of data USB packet */135 int max_packet_size;136 137 /* Device representing the USB interface */138 struct device *ifcdev;139 140 /* Line 6 sound card data structure.141 * Each device has at least MIDI or PCM.142 */143 struct snd_card *card;144 145 /* Line 6 PCM device data structure */146 struct snd_line6_pcm *line6pcm;147 148 /* Line 6 MIDI device data structure */149 struct snd_line6_midi *line6midi;150 151 /* URB for listening to POD data endpoint */152 struct urb *urb_listen;153 154 /* Buffer for incoming data from POD data endpoint */155 unsigned char *buffer_listen;156 157 /* Buffer for message to be processed, generated from MIDI layer */158 unsigned char *buffer_message;159 160 /* Length of message to be processed, generated from MIDI layer */161 int message_length;162 163 /* Circular buffer for non-MIDI control messages */164 struct {165 struct mutex read_lock;166 wait_queue_head_t wait_queue;167 unsigned int active:1;168 unsigned int nonblock:1;169 STRUCT_KFIFO_REC_2(LINE6_BUFSIZE_LISTEN * LINE6_RAW_MESSAGES_MAXCOUNT)170 fifo;171 } messages;172 173 /* Work for delayed PCM startup */174 struct delayed_work startup_work;175 176 /* If MIDI is supported, buffer_message contains the pre-processed data;177 * otherwise the data is only in urb_listen (buffer_incoming).178 */179 void (*process_message)(struct usb_line6 *);180 void (*disconnect)(struct usb_line6 *line6);181 void (*startup)(struct usb_line6 *line6);182};183 184extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1,185 int code2, int size);186extern int line6_read_data(struct usb_line6 *line6, unsigned address,187 void *data, unsigned datalen);188extern int line6_read_serial_number(struct usb_line6 *line6,189 u32 *serial_number);190extern int line6_send_raw_message(struct usb_line6 *line6,191 const char *buffer, int size);192extern int line6_send_raw_message_async(struct usb_line6 *line6,193 const char *buffer, int size);194extern int line6_send_sysex_message(struct usb_line6 *line6,195 const char *buffer, int size);196extern int line6_version_request_async(struct usb_line6 *line6);197extern int line6_write_data(struct usb_line6 *line6, unsigned address,198 void *data, unsigned datalen);199 200int line6_probe(struct usb_interface *interface,201 const struct usb_device_id *id,202 const char *driver_name,203 const struct line6_properties *properties,204 int (*private_init)(struct usb_line6 *, const struct usb_device_id *id),205 size_t data_size);206 207void line6_disconnect(struct usb_interface *interface);208 209#ifdef CONFIG_PM210int line6_suspend(struct usb_interface *interface, pm_message_t message);211int line6_resume(struct usb_interface *interface);212#endif213 214#endif215