summaryrefslogtreecommitdiff
path: root/drivers/staging/line6/variax.h
blob: e2999ab41b08dec80f6871574032fba1e8b29956 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * Line6 Linux USB driver - 0.9.1beta
 *
 * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
 *
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU General Public License as
 *	published by the Free Software Foundation, version 2.
 *
 */

#ifndef VARIAX_H
#define VARIAX_H

#include <linux/spinlock.h>
#include <linux/usb.h>
#include <linux/wait.h>
#include <sound/core.h>

#include "driver.h"
#include "dumprequest.h"

#define VARIAX_STARTUP_DELAY1 1000
#define VARIAX_STARTUP_DELAY3 100
#define VARIAX_STARTUP_DELAY4 100

/*
	Stages of Variax startup procedure
*/
enum {
	VARIAX_STARTUP_INIT = 1,
	VARIAX_STARTUP_VERSIONREQ,
	VARIAX_STARTUP_WAIT,
	VARIAX_STARTUP_ACTIVATE,
	VARIAX_STARTUP_DUMPREQ,
	VARIAX_STARTUP_WORKQUEUE,
	VARIAX_STARTUP_SETUP,
	VARIAX_STARTUP_LAST = VARIAX_STARTUP_SETUP - 1
};

enum {
	VARIAX_DUMP_PASS1 = LINE6_DUMP_CURRENT,
	VARIAX_DUMP_PASS2,
	VARIAX_DUMP_PASS3
};

/**
	Binary Variax model dump
*/
struct variax_model {
	/**
		Header information (including program name).
	*/
	unsigned char name[18];

	/**
		Model parameters.
	*/
	unsigned char control[78 * 2];
};

struct usb_line6_variax {
	/**
		Generic Line6 USB data.
	*/
	struct usb_line6 line6;

	/**
		Dump request structure.
		Append two extra buffers for 3-pass data query.
	*/
	struct line6_dump_request dumpreq;
	struct line6_dump_reqbuf extrabuf[2];

	/**
		Buffer for activation code.
	*/
	unsigned char *buffer_activate;

	/**
		Model number.
	*/
	int model;

	/**
		Current model settings.
	*/
	struct variax_model model_data;

	/**
		Name of connected guitar.
	*/
	unsigned char guitar[18];

	/**
		Name of current model bank.
	*/
	unsigned char bank[18];

	/**
		Position of volume dial.
	*/
	int volume;

	/**
		Position of tone control dial.
	*/
	int tone;

	/**
		Handler for device initializaton.
	*/
	struct work_struct startup_work;

	/**
		Timers for device initializaton.
	*/
	struct timer_list startup_timer1;
	struct timer_list startup_timer2;

	/**
		Current progress in startup procedure.
	*/
	int startup_progress;
};

extern void line6_variax_disconnect(struct usb_interface *interface);
extern int line6_variax_init(struct usb_interface *interface,
			     struct usb_line6_variax *variax);
extern void line6_variax_process_message(struct usb_line6_variax *variax);

#endif