1 /*
2  * Line6 Linux USB driver - 0.9.1beta
3  *
4  * Copyright (C) 2004-2010 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 POD_H
13 #define POD_H
14 
15 #include <linux/interrupt.h>
16 #include <linux/spinlock.h>
17 #include <linux/usb.h>
18 #include <linux/wait.h>
19 
20 #include <sound/core.h>
21 
22 #include "driver.h"
23 #include "dumprequest.h"
24 
25 /*
26 	PODxt Live interfaces
27 */
28 #define PODXTLIVE_INTERFACE_POD    0
29 #define PODXTLIVE_INTERFACE_VARIAX 1
30 
31 /*
32 	Locate name in binary program dump
33 */
34 #define	POD_NAME_OFFSET 0
35 #define	POD_NAME_LENGTH 16
36 
37 /*
38 	Other constants
39 */
40 #define POD_CONTROL_SIZE 0x80
41 #define POD_BUFSIZE_DUMPREQ 7
42 #define POD_STARTUP_DELAY 1000
43 
44 /*
45 	Stages of POD startup procedure
46 */
47 enum {
48 	POD_STARTUP_INIT = 1,
49 	POD_STARTUP_DUMPREQ,
50 	POD_STARTUP_VERSIONREQ,
51 	POD_STARTUP_WORKQUEUE,
52 	POD_STARTUP_SETUP,
53 	POD_STARTUP_LAST = POD_STARTUP_SETUP - 1
54 };
55 
56 /**
57 	Data structure for values that need to be requested explicitly.
58 	This is the case for system and tuner settings.
59 */
60 struct ValueWait {
61 	int value;
62 	wait_queue_head_t wait;
63 };
64 
65 /**
66 	Binary PODxt Pro program dump
67 */
68 struct pod_program {
69 	/**
70 		Header information (including program name).
71 	*/
72 	unsigned char header[0x20];
73 
74 	/**
75 		Program parameters.
76 	*/
77 	unsigned char control[POD_CONTROL_SIZE];
78 };
79 
80 struct usb_line6_pod {
81 	/**
82 		Generic Line6 USB data.
83 	*/
84 	struct usb_line6 line6;
85 
86 	/**
87 		Dump request structure.
88 	*/
89 	struct line6_dump_request dumpreq;
90 
91 	/**
92 		Current program number.
93 	*/
94 	unsigned char channel_num;
95 
96 	/**
97 		Current program settings.
98 	*/
99 	struct pod_program prog_data;
100 
101 	/**
102 		Buffer for data retrieved from or to be stored on PODxt Pro.
103 	*/
104 	struct pod_program prog_data_buf;
105 
106 	/**
107 		Tuner mute mode.
108 	*/
109 	struct ValueWait tuner_mute;
110 
111 	/**
112 		Tuner base frequency (typically 440Hz).
113 	*/
114 	struct ValueWait tuner_freq;
115 
116 	/**
117 		Note received from tuner.
118 	*/
119 	struct ValueWait tuner_note;
120 
121 	/**
122 		Pitch value received from tuner.
123 	*/
124 	struct ValueWait tuner_pitch;
125 
126 	/**
127 		Instrument monitor level.
128 	*/
129 	struct ValueWait monitor_level;
130 
131 	/**
132 		Audio routing mode.
133 		0: send processed guitar
134 		1: send clean guitar
135 		2: send clean guitar re-amp playback
136 		3: send re-amp playback
137 	*/
138 	struct ValueWait routing;
139 
140 	/**
141 		Wait for audio clipping event.
142 	*/
143 	struct ValueWait clipping;
144 
145 	/**
146 		Timer for device initializaton.
147 	*/
148 	struct timer_list startup_timer;
149 
150 	/**
151 		Work handler for device initializaton.
152 	*/
153 	struct work_struct startup_work;
154 
155 	/**
156 		Current progress in startup procedure.
157 	*/
158 	int startup_progress;
159 
160 	/**
161 		Dirty flags for access to parameter data.
162 	*/
163 	unsigned long param_dirty[POD_CONTROL_SIZE / sizeof(unsigned long)];
164 
165 	/**
166 		Some atomic flags.
167 	*/
168 	unsigned long atomic_flags;
169 
170 	/**
171 		Serial number of device.
172 	*/
173 	int serial_number;
174 
175 	/**
176 		Firmware version (x 100).
177 	*/
178 	int firmware_version;
179 
180 	/**
181 		Device ID.
182 	*/
183 	int device_id;
184 
185 	/**
186 		Flag to indicate modification of current program settings.
187 	*/
188 	char dirty;
189 
190 	/**
191 		Flag to enable MIDI postprocessing.
192 	*/
193 	char midi_postprocess;
194 };
195 
196 extern void line6_pod_disconnect(struct usb_interface *interface);
197 extern int line6_pod_init(struct usb_interface *interface,
198 			  struct usb_line6_pod *pod);
199 extern void line6_pod_midi_postprocess(struct usb_line6_pod *pod,
200 				       unsigned char *data, int length);
201 extern void line6_pod_process_message(struct usb_line6_pod *pod);
202 extern void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param,
203 					 int value);
204 
205 #endif
206