Merge branch 'timers-for-linus-cleanups' of git://git.kernel.org/pub/scm/linux/kernel...
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / line6 / driver.h
CommitLineData
705ececd
MG
1/*
2 * Line6 Linux USB driver - 0.8.0
3 *
4 * Copyright (C) 2004-2009 Markus Grabner (grabner@icg.tugraz.at)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation, version 2.
9 *
10 */
11
12#ifndef DRIVER_H
13#define DRIVER_H
14
15
16#include "config.h"
17
18#include <linux/spinlock.h>
19#include <linux/usb.h>
20#include <linux/wait.h>
705ececd
MG
21#include <sound/core.h>
22
23#include "midi.h"
24
705ececd
MG
25#define DRIVER_NAME "line6usb"
26
27#define LINE6_TIMEOUT 1
28#define LINE6_MAX_DEVICES 8
29#define LINE6_BUFSIZE_LISTEN 32
30#define LINE6_MESSAGE_MAXLEN 256
31
32
33/*
34 Line6 MIDI control commands
35*/
36#define LINE6_PARAM_CHANGE 0xb0
37#define LINE6_PROGRAM_CHANGE 0xc0
38#define LINE6_SYSEX_BEGIN 0xf0
39#define LINE6_SYSEX_END 0xf7
40#define LINE6_RESET 0xff
41
42/*
43 MIDI channel for messages initiated by the host
44 (and eventually echoed back by the device)
45*/
46#define LINE6_CHANNEL_HOST 0x00
47
48/*
49 MIDI channel for messages initiated by the device
50*/
51#define LINE6_CHANNEL_DEVICE 0x02
52
53#define LINE6_CHANNEL_UNKNOWN 5 /* don't know yet what this is good for */
54
55#define LINE6_CHANNEL_MASK 0x0f
56
57
a49e4838
GKH
58#define MISSING_CASE \
59 printk(KERN_ERR "line6usb driver bug: missing case in %s:%d\n", \
60 __FILE__, __LINE__)
705ececd
MG
61
62
a49e4838
GKH
63#define CHECK_RETURN(x) \
64do { \
65 err = x; \
66 if (err < 0) \
67 return err; \
68} while (0)
705ececd
MG
69
70
71extern const unsigned char line6_midi_id[3];
72extern struct usb_line6 *line6_devices[LINE6_MAX_DEVICES];
73extern struct workqueue_struct *line6_workqueue;
74
75static const int SYSEX_DATA_OFS = sizeof(line6_midi_id) + 3;
76static const int SYSEX_EXTRA_SIZE = sizeof(line6_midi_id) + 4;
77
78
79/**
80 Common properties of Line6 devices.
81*/
82struct line6_properties {
83 const char *name;
84 int device_bit;
85 int capabilities;
86};
87
88/**
89 Common data shared by all Line6 devices.
90 Corresponds to a pair of USB endpoints.
91*/
92struct usb_line6 {
93 /**
94 USB device.
95 */
96 struct usb_device *usbdev;
97
98 /**
99 Product id.
100 */
101 int product;
102
103 /**
104 Properties.
105 */
106 const struct line6_properties *properties;
107
108 /**
109 Interface number.
110 */
111 int interface_number;
112
113 /**
114 Interval (ms).
115 */
116 int interval;
117
118 /**
119 Maximum size of USB packet.
120 */
121 int max_packet_size;
122
123 /**
124 Device representing the USB interface.
125 */
126 struct device *ifcdev;
127
128 /**
129 Line6 sound card data structure.
130 Each device has at least MIDI or PCM.
131 */
132 struct snd_card *card;
133
134 /**
135 Line6 PCM device data structure.
136 */
137 struct snd_line6_pcm *line6pcm;
138
139 /**
140 Line6 MIDI device data structure.
141 */
142 struct snd_line6_midi *line6midi;
143
144 /**
145 USB endpoint for listening to control commands.
146 */
147 int ep_control_read;
148
149 /**
150 USB endpoint for writing control commands.
151 */
152 int ep_control_write;
153
154 /**
155 URB for listening to PODxt Pro control endpoint.
156 */
157 struct urb *urb_listen;
158
159 /**
160 Buffer for listening to PODxt Pro control endpoint.
161 */
162 unsigned char *buffer_listen;
163
164 /**
165 Buffer for message to be processed.
166 */
167 unsigned char *buffer_message;
168
169 /**
170 Length of message to be processed.
171 */
172 int message_length;
173};
174
175
a49e4838
GKH
176extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1,
177 int code2, int size);
178extern ssize_t line6_nop_read(struct device *dev,
179 struct device_attribute *attr, char *buf);
180extern ssize_t line6_nop_write(struct device *dev,
181 struct device_attribute *attr,
182 const char *buf, size_t count);
183extern int line6_read_data(struct usb_line6 *line6, int address, void *data,
184 size_t datalen);
185extern int line6_read_serial_number(struct usb_line6 *line6,
186 int *serial_number);
705ececd 187extern int line6_send_program(struct usb_line6 *line6, int value);
a49e4838
GKH
188extern int line6_send_raw_message(struct usb_line6 *line6, const char *buffer,
189 int size);
190extern int line6_send_raw_message_async(struct usb_line6 *line6,
191 const char *buffer, int size);
192extern int line6_send_sysex_message(struct usb_line6 *line6,
193 const char *buffer, int size);
194extern ssize_t line6_set_raw(struct device *dev, struct device_attribute *attr,
195 const char *buf, size_t count);
196extern int line6_transmit_parameter(struct usb_line6 *line6, int param,
197 int value);
198extern int line6_write_data(struct usb_line6 *line6, int address, void *data,
199 size_t datalen);
200extern void line6_write_hexdump(struct usb_line6 *line6, char dir,
201 const unsigned char *buffer, int size);
705ececd
MG
202
203
204#endif