brintos

brintos / linux-shallow public Read only

0
0
Text · 5.7 KiB · 5736ad4 Raw
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