forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/sound/usb/line6/variax.c
....@@ -1,12 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Line 6 Linux USB driver
34 *
45 * 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
- *
106 */
117
128 #include <linux/slab.h>
....@@ -26,13 +22,9 @@
2622 Stages of Variax startup procedure
2723 */
2824 enum {
29
- VARIAX_STARTUP_INIT = 1,
3025 VARIAX_STARTUP_VERSIONREQ,
31
- VARIAX_STARTUP_WAIT,
3226 VARIAX_STARTUP_ACTIVATE,
33
- VARIAX_STARTUP_WORKQUEUE,
3427 VARIAX_STARTUP_SETUP,
35
- VARIAX_STARTUP_LAST = VARIAX_STARTUP_SETUP - 1
3628 };
3729
3830 enum {
....@@ -47,16 +39,11 @@
4739 /* Buffer for activation code */
4840 unsigned char *buffer_activate;
4941
50
- /* Handler for device initialization */
51
- struct work_struct startup_work;
52
-
53
- /* Timers for device initialization */
54
- struct timer_list startup_timer1;
55
- struct timer_list startup_timer2;
56
-
5742 /* Current progress in startup procedure */
5843 int startup_progress;
5944 };
45
+
46
+#define line6_to_variax(x) container_of(x, struct usb_line6_variax, line6)
6047
6148 #define VARIAX_OFFSET_ACTIVATE 7
6249
....@@ -81,11 +68,6 @@
8168 0xf7
8269 };
8370
84
-/* forward declarations: */
85
-static void variax_startup2(struct timer_list *t);
86
-static void variax_startup4(struct timer_list *t);
87
-static void variax_startup5(struct timer_list *t);
88
-
8971 static void variax_activate_async(struct usb_line6_variax *variax, int a)
9072 {
9173 variax->buffer_activate[VARIAX_OFFSET_ACTIVATE] = a;
....@@ -100,74 +82,30 @@
10082 context). After the last one has finished, the device is ready to use.
10183 */
10284
103
-static void variax_startup1(struct usb_line6_variax *variax)
85
+static void variax_startup(struct usb_line6 *line6)
10486 {
105
- CHECK_STARTUP_PROGRESS(variax->startup_progress, VARIAX_STARTUP_INIT);
87
+ struct usb_line6_variax *variax = line6_to_variax(line6);
10688
107
- /* delay startup procedure: */
108
- line6_start_timer(&variax->startup_timer1, VARIAX_STARTUP_DELAY1,
109
- variax_startup2);
110
-}
111
-
112
-static void variax_startup2(struct timer_list *t)
113
-{
114
- struct usb_line6_variax *variax = from_timer(variax, t, startup_timer1);
115
- struct usb_line6 *line6 = &variax->line6;
116
-
117
- /* schedule another startup procedure until startup is complete: */
118
- if (variax->startup_progress >= VARIAX_STARTUP_LAST)
119
- return;
120
-
121
- variax->startup_progress = VARIAX_STARTUP_VERSIONREQ;
122
- line6_start_timer(&variax->startup_timer1, VARIAX_STARTUP_DELAY1,
123
- variax_startup2);
124
-
125
- /* request firmware version: */
126
- line6_version_request_async(line6);
127
-}
128
-
129
-static void variax_startup3(struct usb_line6_variax *variax)
130
-{
131
- CHECK_STARTUP_PROGRESS(variax->startup_progress, VARIAX_STARTUP_WAIT);
132
-
133
- /* delay startup procedure: */
134
- line6_start_timer(&variax->startup_timer2, VARIAX_STARTUP_DELAY3,
135
- variax_startup4);
136
-}
137
-
138
-static void variax_startup4(struct timer_list *t)
139
-{
140
- struct usb_line6_variax *variax = from_timer(variax, t, startup_timer2);
141
-
142
- CHECK_STARTUP_PROGRESS(variax->startup_progress,
143
- VARIAX_STARTUP_ACTIVATE);
144
-
145
- /* activate device: */
146
- variax_activate_async(variax, 1);
147
- line6_start_timer(&variax->startup_timer2, VARIAX_STARTUP_DELAY4,
148
- variax_startup5);
149
-}
150
-
151
-static void variax_startup5(struct timer_list *t)
152
-{
153
- struct usb_line6_variax *variax = from_timer(variax, t, startup_timer2);
154
-
155
- CHECK_STARTUP_PROGRESS(variax->startup_progress,
156
- VARIAX_STARTUP_WORKQUEUE);
157
-
158
- /* schedule work for global work queue: */
159
- schedule_work(&variax->startup_work);
160
-}
161
-
162
-static void variax_startup6(struct work_struct *work)
163
-{
164
- struct usb_line6_variax *variax =
165
- container_of(work, struct usb_line6_variax, startup_work);
166
-
167
- CHECK_STARTUP_PROGRESS(variax->startup_progress, VARIAX_STARTUP_SETUP);
168
-
169
- /* ALSA audio interface: */
170
- snd_card_register(variax->line6.card);
89
+ switch (variax->startup_progress) {
90
+ case VARIAX_STARTUP_VERSIONREQ:
91
+ /* repeat request until getting the response */
92
+ schedule_delayed_work(&line6->startup_work,
93
+ msecs_to_jiffies(VARIAX_STARTUP_DELAY1));
94
+ /* request firmware version: */
95
+ line6_version_request_async(line6);
96
+ break;
97
+ case VARIAX_STARTUP_ACTIVATE:
98
+ /* activate device: */
99
+ variax_activate_async(variax, 1);
100
+ variax->startup_progress = VARIAX_STARTUP_SETUP;
101
+ schedule_delayed_work(&line6->startup_work,
102
+ msecs_to_jiffies(VARIAX_STARTUP_DELAY4));
103
+ break;
104
+ case VARIAX_STARTUP_SETUP:
105
+ /* ALSA audio interface: */
106
+ snd_card_register(variax->line6.card);
107
+ break;
108
+ }
171109 }
172110
173111 /*
....@@ -175,7 +113,7 @@
175113 */
176114 static void line6_variax_process_message(struct usb_line6 *line6)
177115 {
178
- struct usb_line6_variax *variax = (struct usb_line6_variax *) line6;
116
+ struct usb_line6_variax *variax = line6_to_variax(line6);
179117 const unsigned char *buf = variax->line6.buffer_message;
180118
181119 switch (buf[0]) {
....@@ -186,11 +124,19 @@
186124 case LINE6_SYSEX_BEGIN:
187125 if (memcmp(buf + 1, variax_init_version + 1,
188126 sizeof(variax_init_version) - 1) == 0) {
189
- variax_startup3(variax);
127
+ if (variax->startup_progress >= VARIAX_STARTUP_ACTIVATE)
128
+ break;
129
+ variax->startup_progress = VARIAX_STARTUP_ACTIVATE;
130
+ cancel_delayed_work(&line6->startup_work);
131
+ schedule_delayed_work(&line6->startup_work,
132
+ msecs_to_jiffies(VARIAX_STARTUP_DELAY3));
190133 } else if (memcmp(buf + 1, variax_init_done + 1,
191134 sizeof(variax_init_done) - 1) == 0) {
192135 /* notify of complete initialization: */
193
- variax_startup4(&variax->startup_timer2);
136
+ if (variax->startup_progress >= VARIAX_STARTUP_SETUP)
137
+ break;
138
+ cancel_delayed_work(&line6->startup_work);
139
+ schedule_delayed_work(&line6->startup_work, 0);
194140 }
195141 break;
196142 }
....@@ -201,11 +147,7 @@
201147 */
202148 static void line6_variax_disconnect(struct usb_line6 *line6)
203149 {
204
- struct usb_line6_variax *variax = (struct usb_line6_variax *)line6;
205
-
206
- del_timer(&variax->startup_timer1);
207
- del_timer(&variax->startup_timer2);
208
- cancel_work_sync(&variax->startup_work);
150
+ struct usb_line6_variax *variax = line6_to_variax(line6);
209151
210152 kfree(variax->buffer_activate);
211153 }
....@@ -216,14 +158,11 @@
216158 static int variax_init(struct usb_line6 *line6,
217159 const struct usb_device_id *id)
218160 {
219
- struct usb_line6_variax *variax = (struct usb_line6_variax *) line6;
161
+ struct usb_line6_variax *variax = line6_to_variax(line6);
220162
221163 line6->process_message = line6_variax_process_message;
222164 line6->disconnect = line6_variax_disconnect;
223
-
224
- timer_setup(&variax->startup_timer1, NULL, 0);
225
- timer_setup(&variax->startup_timer2, NULL, 0);
226
- INIT_WORK(&variax->startup_work, variax_startup6);
165
+ line6->startup = variax_startup;
227166
228167 /* initialize USB buffers: */
229168 variax->buffer_activate = kmemdup(variax_activate,
....@@ -233,7 +172,8 @@
233172 return -ENOMEM;
234173
235174 /* initiate startup procedure: */
236
- variax_startup1(variax);
175
+ schedule_delayed_work(&line6->startup_work,
176
+ msecs_to_jiffies(VARIAX_STARTUP_DELAY1));
237177 return 0;
238178 }
239179
....@@ -298,5 +238,5 @@
298238
299239 module_usb_driver(variax_driver);
300240
301
-MODULE_DESCRIPTION("Vairax Workbench USB driver");
241
+MODULE_DESCRIPTION("Variax Workbench USB driver");
302242 MODULE_LICENSE("GPL");