staging: comedi: 8255_pci: fix possible NULL deref during detach
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / line6 / pod.c
CommitLineData
705ececd 1/*
e1a164d7 2 * Line6 Linux USB driver - 0.9.1beta
705ececd 3 *
1027f476 4 * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
705ececd
MG
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
5a0e3ad6 12#include <linux/slab.h>
1027f476
MG
13#include <linux/wait.h>
14#include <sound/control.h>
5a0e3ad6 15
705ececd
MG
16#include "audio.h"
17#include "capture.h"
18#include "control.h"
1027f476 19#include "driver.h"
705ececd
MG
20#include "playback.h"
21#include "pod.h"
22
705ececd 23#define POD_SYSEX_CODE 3
e1a164d7 24#define POD_BYTES_PER_FRAME 6 /* 24bit audio (stereo) */
705ececd 25
e1a164d7 26/* *INDENT-OFF* */
705ececd
MG
27
28enum {
29 POD_SYSEX_CLIP = 0x0f,
30 POD_SYSEX_SAVE = 0x24,
31 POD_SYSEX_SYSTEM = 0x56,
32 POD_SYSEX_SYSTEMREQ = 0x57,
33 /* POD_SYSEX_UPDATE = 0x6c, */ /* software update! */
34 POD_SYSEX_STORE = 0x71,
35 POD_SYSEX_FINISH = 0x72,
36 POD_SYSEX_DUMPMEM = 0x73,
37 POD_SYSEX_DUMP = 0x74,
38 POD_SYSEX_DUMPREQ = 0x75
39 /* POD_SYSEX_DUMPMEM2 = 0x76 */ /* dumps entire internal memory of PODxt Pro */
40};
41
42enum {
43 POD_monitor_level = 0x04,
44 POD_routing = 0x05,
45 POD_tuner_mute = 0x13,
46 POD_tuner_freq = 0x15,
47 POD_tuner_note = 0x16,
48 POD_tuner_pitch = 0x17,
1027f476 49 POD_system_invalid = 0x10000
705ececd
MG
50};
51
e1a164d7
MG
52/* *INDENT-ON* */
53
705ececd
MG
54enum {
55 POD_DUMP_MEMORY = 2
56};
57
58enum {
59 POD_BUSY_READ,
60 POD_BUSY_WRITE,
61 POD_CHANNEL_DIRTY,
62 POD_SAVE_PRESSED,
63 POD_BUSY_MIDISEND
64};
65
705ececd
MG
66static struct snd_ratden pod_ratden = {
67 .num_min = 78125,
68 .num_max = 78125,
69 .num_step = 1,
70 .den = 2
71};
72
73static struct line6_pcm_properties pod_pcm_properties = {
1027f476 74 .snd_line6_playback_hw = {
e1a164d7
MG
75 .info = (SNDRV_PCM_INFO_MMAP |
76 SNDRV_PCM_INFO_INTERLEAVED |
77 SNDRV_PCM_INFO_BLOCK_TRANSFER |
78 SNDRV_PCM_INFO_MMAP_VALID |
79 SNDRV_PCM_INFO_PAUSE |
1027f476 80#ifdef CONFIG_PM
e1a164d7 81 SNDRV_PCM_INFO_RESUME |
1027f476 82#endif
e1a164d7
MG
83 SNDRV_PCM_INFO_SYNC_START),
84 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
85 .rates = SNDRV_PCM_RATE_KNOT,
86 .rate_min = 39062,
87 .rate_max = 39063,
88 .channels_min = 2,
89 .channels_max = 2,
90 .buffer_bytes_max = 60000,
91 .period_bytes_min = 64,
92 .period_bytes_max = 8192,
93 .periods_min = 1,
94 .periods_max = 1024},
1027f476 95 .snd_line6_capture_hw = {
e1a164d7
MG
96 .info = (SNDRV_PCM_INFO_MMAP |
97 SNDRV_PCM_INFO_INTERLEAVED |
98 SNDRV_PCM_INFO_BLOCK_TRANSFER |
99 SNDRV_PCM_INFO_MMAP_VALID |
1027f476 100#ifdef CONFIG_PM
e1a164d7 101 SNDRV_PCM_INFO_RESUME |
1027f476 102#endif
e1a164d7
MG
103 SNDRV_PCM_INFO_SYNC_START),
104 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
105 .rates = SNDRV_PCM_RATE_KNOT,
106 .rate_min = 39062,
107 .rate_max = 39063,
108 .channels_min = 2,
109 .channels_max = 2,
110 .buffer_bytes_max = 60000,
111 .period_bytes_min = 64,
112 .period_bytes_max = 8192,
113 .periods_min = 1,
114 .periods_max = 1024},
705ececd 115 .snd_line6_rates = {
e1a164d7
MG
116 .nrats = 1,
117 .rats = &pod_ratden},
705ececd
MG
118 .bytes_per_frame = POD_BYTES_PER_FRAME
119};
120
1027f476
MG
121static const char pod_request_channel[] = {
122 0xf0, 0x00, 0x01, 0x0c, 0x03, 0x75, 0xf7
123};
124
e1a164d7 125static const char pod_version_header[] = {
1027f476
MG
126 0xf2, 0x7e, 0x7f, 0x06, 0x02
127};
128
1027f476
MG
129/* forward declarations: */
130static void pod_startup2(unsigned long data);
131static void pod_startup3(struct usb_line6_pod *pod);
132static void pod_startup4(struct usb_line6_pod *pod);
705ececd 133
705ececd
MG
134/*
135 Mark all parameters as dirty and notify waiting processes.
136*/
137static void pod_mark_batch_all_dirty(struct usb_line6_pod *pod)
138{
139 int i;
140
e1769b3c 141 for (i = 0; i < POD_CONTROL_SIZE; i++)
705ececd
MG
142 set_bit(i, pod->param_dirty);
143}
144
e1a164d7
MG
145static char *pod_alloc_sysex_buffer(struct usb_line6_pod *pod, int code,
146 int size)
705ececd 147{
e1a164d7
MG
148 return line6_alloc_sysex_buffer(&pod->line6, POD_SYSEX_CODE, code,
149 size);
705ececd
MG
150}
151
152/*
153 Send channel dump data to the PODxt Pro.
154*/
155static void pod_dump(struct usb_line6_pod *pod, const unsigned char *data)
156{
157 int size = 1 + sizeof(pod->prog_data);
158 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_DUMP, size);
0fdef36a
GKH
159 if (!sysex)
160 return;
161 /* Don't know what this is good for, but PODxt Pro transmits it, so we
162 * also do... */
163 sysex[SYSEX_DATA_OFS] = 5;
705ececd
MG
164 memcpy(sysex + SYSEX_DATA_OFS + 1, data, sizeof(pod->prog_data));
165 line6_send_sysex_message(&pod->line6, sysex, size);
166 memcpy(&pod->prog_data, data, sizeof(pod->prog_data));
167 pod_mark_batch_all_dirty(pod);
168 kfree(sysex);
169}
170
171/*
172 Store parameter value in driver memory and mark it as dirty.
173*/
174static void pod_store_parameter(struct usb_line6_pod *pod, int param, int value)
175{
176 pod->prog_data.control[param] = value;
177 set_bit(param, pod->param_dirty);
178 pod->dirty = 1;
179}
180
181/*
1027f476 182 Handle SAVE button.
705ececd 183*/
e1a164d7
MG
184static void pod_save_button_pressed(struct usb_line6_pod *pod, int type,
185 int index)
705ececd
MG
186{
187 pod->dirty = 0;
188 set_bit(POD_SAVE_PRESSED, &pod->atomic_flags);
189}
190
191/*
192 Process a completely received message.
193*/
1027f476 194void line6_pod_process_message(struct usb_line6_pod *pod)
705ececd
MG
195{
196 const unsigned char *buf = pod->line6.buffer_message;
197
198 /* filter messages by type */
0fdef36a 199 switch (buf[0] & 0xf0) {
705ececd
MG
200 case LINE6_PARAM_CHANGE:
201 case LINE6_PROGRAM_CHANGE:
202 case LINE6_SYSEX_BEGIN:
e1a164d7 203 break; /* handle these further down */
705ececd
MG
204
205 default:
e1a164d7 206 return; /* ignore all others */
705ececd
MG
207 }
208
209 /* process all remaining messages */
0fdef36a 210 switch (buf[0]) {
705ececd
MG
211 case LINE6_PARAM_CHANGE | LINE6_CHANNEL_DEVICE:
212 pod_store_parameter(pod, buf[1], buf[2]);
213 /* intentionally no break here! */
214
215 case LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST:
0fdef36a
GKH
216 if ((buf[1] == POD_amp_model_setup) ||
217 (buf[1] == POD_effect_setup))
218 /* these also affect other settings */
e1a164d7
MG
219 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
220 LINE6_DUMP_CURRENT);
705ececd
MG
221
222 break;
223
224 case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_DEVICE:
225 case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST:
226 pod->channel_num = buf[1];
227 pod->dirty = 0;
228 set_bit(POD_CHANNEL_DIRTY, &pod->atomic_flags);
e1a164d7
MG
229 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
230 LINE6_DUMP_CURRENT);
705ececd
MG
231 break;
232
233 case LINE6_SYSEX_BEGIN | LINE6_CHANNEL_DEVICE:
234 case LINE6_SYSEX_BEGIN | LINE6_CHANNEL_UNKNOWN:
0fdef36a
GKH
235 if (memcmp(buf + 1, line6_midi_id, sizeof(line6_midi_id)) == 0) {
236 switch (buf[5]) {
705ececd 237 case POD_SYSEX_DUMP:
e1a164d7
MG
238 if (pod->line6.message_length ==
239 sizeof(pod->prog_data) + 7) {
0fdef36a 240 switch (pod->dumpreq.in_progress) {
705ececd 241 case LINE6_DUMP_CURRENT:
e1a164d7
MG
242 memcpy(&pod->prog_data, buf + 7,
243 sizeof(pod->prog_data));
705ececd 244 pod_mark_batch_all_dirty(pod);
705ececd
MG
245 break;
246
247 case POD_DUMP_MEMORY:
e1a164d7
MG
248 memcpy(&pod->prog_data_buf,
249 buf + 7,
250 sizeof
251 (pod->prog_data_buf));
705ececd
MG
252 break;
253
254 default:
e1a164d7
MG
255 DEBUG_MESSAGES(dev_err
256 (pod->
257 line6.ifcdev,
258 "unknown dump code %02X\n",
259 pod->
260 dumpreq.in_progress));
705ececd
MG
261 }
262
263 line6_dump_finished(&pod->dumpreq);
1027f476 264 pod_startup3(pod);
0fdef36a 265 } else
e1a164d7
MG
266 DEBUG_MESSAGES(dev_err
267 (pod->line6.ifcdev,
268 "wrong size of channel dump message (%d instead of %d)\n",
269 pod->
270 line6.message_length,
271 (int)
272 sizeof(pod->prog_data) +
273 7));
705ececd
MG
274
275 break;
276
e1a164d7
MG
277 case POD_SYSEX_SYSTEM:{
278 short value =
279 ((int)buf[7] << 12) | ((int)buf[8]
280 << 8) |
281 ((int)buf[9] << 4) | (int)buf[10];
705ececd
MG
282
283#define PROCESS_SYSTEM_PARAM(x) \
284 case POD_ ## x: \
285 pod->x.value = value; \
1027f476 286 wake_up(&pod->x.wait); \
705ececd
MG
287 break;
288
e1a164d7
MG
289 switch (buf[6]) {
290 PROCESS_SYSTEM_PARAM
291 (monitor_level);
292 PROCESS_SYSTEM_PARAM(routing);
293 PROCESS_SYSTEM_PARAM
294 (tuner_mute);
295 PROCESS_SYSTEM_PARAM
296 (tuner_freq);
297 PROCESS_SYSTEM_PARAM
298 (tuner_note);
299 PROCESS_SYSTEM_PARAM
300 (tuner_pitch);
705ececd
MG
301
302#undef PROCESS_SYSTEM_PARAM
303
e1a164d7
MG
304 default:
305 DEBUG_MESSAGES(dev_err
306 (pod->
307 line6.ifcdev,
308 "unknown tuner/system response %02X\n",
309 buf[6]));
310 }
705ececd 311
e1a164d7
MG
312 break;
313 }
705ececd
MG
314
315 case POD_SYSEX_FINISH:
316 /* do we need to respond to this? */
317 break;
318
319 case POD_SYSEX_SAVE:
320 pod_save_button_pressed(pod, buf[6], buf[7]);
321 break;
322
323 case POD_SYSEX_CLIP:
e1a164d7
MG
324 DEBUG_MESSAGES(dev_err
325 (pod->line6.ifcdev,
326 "audio clipped\n"));
705ececd 327 pod->clipping.value = 1;
1027f476 328 wake_up(&pod->clipping.wait);
705ececd
MG
329 break;
330
331 case POD_SYSEX_STORE:
e1a164d7
MG
332 DEBUG_MESSAGES(dev_err
333 (pod->line6.ifcdev,
334 "message %02X not yet implemented\n",
335 buf[5]));
705ececd
MG
336 break;
337
338 default:
e1a164d7
MG
339 DEBUG_MESSAGES(dev_err
340 (pod->line6.ifcdev,
341 "unknown sysex message %02X\n",
342 buf[5]));
705ececd 343 }
e1a164d7
MG
344 } else
345 if (memcmp
346 (buf, pod_version_header,
347 sizeof(pod_version_header)) == 0) {
348 pod->firmware_version =
349 buf[13] * 100 + buf[14] * 10 + buf[15];
350 pod->device_id =
351 ((int)buf[8] << 16) | ((int)buf[9] << 8) | (int)
352 buf[10];
1027f476 353 pod_startup4(pod);
0fdef36a 354 } else
e1a164d7
MG
355 DEBUG_MESSAGES(dev_err
356 (pod->line6.ifcdev,
357 "unknown sysex header\n"));
705ececd
MG
358
359 break;
360
361 case LINE6_SYSEX_END:
362 break;
363
364 default:
e1a164d7
MG
365 DEBUG_MESSAGES(dev_err
366 (pod->line6.ifcdev,
367 "POD: unknown message %02X\n", buf[0]));
705ececd
MG
368 }
369}
370
371/*
372 Detect some cases that require a channel dump after sending a command to the
373 device. Important notes:
374 *) The actual dump request can not be sent here since we are not allowed to
375 wait for the completion of the first message in this context, and sending
376 the dump request before completion of the previous message leaves the POD
377 in an undefined state. The dump request will be sent when the echoed
378 commands are received.
379 *) This method fails if a param change message is "chopped" after the first
380 byte.
381*/
e1a164d7
MG
382void line6_pod_midi_postprocess(struct usb_line6_pod *pod, unsigned char *data,
383 int length)
705ececd
MG
384{
385 int i;
386
0fdef36a 387 if (!pod->midi_postprocess)
705ececd
MG
388 return;
389
0fdef36a
GKH
390 for (i = 0; i < length; ++i) {
391 if (data[i] == (LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST)) {
705ececd
MG
392 line6_invalidate_current(&pod->dumpreq);
393 break;
e1a164d7
MG
394 } else
395 if ((data[i] == (LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST))
396 && (i < length - 1))
397 if ((data[i + 1] == POD_amp_model_setup)
398 || (data[i + 1] == POD_effect_setup)) {
705ececd
MG
399 line6_invalidate_current(&pod->dumpreq);
400 break;
401 }
402 }
403}
404
405/*
406 Send channel number (i.e., switch to a different sound).
407*/
8d6b7f7c 408static void pod_send_channel(struct usb_line6_pod *pod, u8 value)
705ececd
MG
409{
410 line6_invalidate_current(&pod->dumpreq);
411
0fdef36a 412 if (line6_send_program(&pod->line6, value) == 0)
705ececd
MG
413 pod->channel_num = value;
414 else
415 line6_dump_finished(&pod->dumpreq);
416}
417
418/*
419 Transmit PODxt Pro control parameter.
420*/
e1a164d7 421void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param,
5b9bd2ad 422 u8 value)
705ececd 423{
0fdef36a 424 if (line6_transmit_parameter(&pod->line6, param, value) == 0)
705ececd
MG
425 pod_store_parameter(pod, param, value);
426
e1a164d7 427 if ((param == POD_amp_model_setup) || (param == POD_effect_setup)) /* these also affect other settings */
705ececd
MG
428 line6_invalidate_current(&pod->dumpreq);
429}
430
431/*
432 Resolve value to memory location.
433*/
e1a164d7
MG
434static int pod_resolve(const char *buf, short block0, short block1,
435 unsigned char *location)
705ececd 436{
1d0e834d 437 u8 value;
7e4d5c13
SB
438 short block;
439 int ret;
440
1d0e834d 441 ret = kstrtou8(buf, 10, &value);
7e4d5c13
SB
442 if (ret)
443 return ret;
444
445 block = (value < 0x40) ? block0 : block1;
705ececd
MG
446 value &= 0x3f;
447 location[0] = block >> 7;
448 location[1] = value | (block & 0x7f);
7e4d5c13 449 return 0;
705ececd
MG
450}
451
452/*
453 Send command to store channel/effects setup/amp setup to PODxt Pro.
454*/
e1a164d7
MG
455static ssize_t pod_send_store_command(struct device *dev, const char *buf,
456 size_t count, short block0, short block1)
705ececd
MG
457{
458 struct usb_interface *interface = to_usb_interface(dev);
459 struct usb_line6_pod *pod = usb_get_intfdata(interface);
7e4d5c13 460 int ret;
705ececd
MG
461 int size = 3 + sizeof(pod->prog_data_buf);
462 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_STORE, size);
7e4d5c13 463
0fdef36a
GKH
464 if (!sysex)
465 return 0;
705ececd 466
e1a164d7 467 sysex[SYSEX_DATA_OFS] = 5; /* see pod_dump() */
7e4d5c13
SB
468 ret = pod_resolve(buf, block0, block1, sysex + SYSEX_DATA_OFS + 1);
469 if (ret) {
470 kfree(sysex);
471 return ret;
472 }
473
e1a164d7
MG
474 memcpy(sysex + SYSEX_DATA_OFS + 3, &pod->prog_data_buf,
475 sizeof(pod->prog_data_buf));
705ececd
MG
476
477 line6_send_sysex_message(&pod->line6, sysex, size);
478 kfree(sysex);
479 /* needs some delay here on AMD64 platform */
480 return count;
481}
482
483/*
484 Send command to retrieve channel/effects setup/amp setup to PODxt Pro.
485*/
e1a164d7
MG
486static ssize_t pod_send_retrieve_command(struct device *dev, const char *buf,
487 size_t count, short block0,
488 short block1)
705ececd
MG
489{
490 struct usb_interface *interface = to_usb_interface(dev);
491 struct usb_line6_pod *pod = usb_get_intfdata(interface);
7e4d5c13 492 int ret;
705ececd
MG
493 int size = 4;
494 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_DUMPMEM, size);
0fdef36a
GKH
495
496 if (!sysex)
497 return 0;
705ececd 498
7e4d5c13
SB
499 ret = pod_resolve(buf, block0, block1, sysex + SYSEX_DATA_OFS);
500 if (ret) {
501 kfree(sysex);
502 return ret;
503 }
705ececd
MG
504 sysex[SYSEX_DATA_OFS + 2] = 0;
505 sysex[SYSEX_DATA_OFS + 3] = 0;
506 line6_dump_started(&pod->dumpreq, POD_DUMP_MEMORY);
507
0fdef36a 508 if (line6_send_sysex_message(&pod->line6, sysex, size) < size)
705ececd
MG
509 line6_dump_finished(&pod->dumpreq);
510
511 kfree(sysex);
512 /* needs some delay here on AMD64 platform */
513 return count;
514}
515
516/*
517 Generic get name function.
518*/
e1a164d7
MG
519static ssize_t get_name_generic(struct usb_line6_pod *pod, const char *str,
520 char *buf)
705ececd
MG
521{
522 int length = 0;
523 const char *p1;
524 char *p2;
525 char *last_non_space = buf;
526
1027f476 527 int retval = line6_dump_wait_interruptible(&pod->dumpreq);
0fdef36a
GKH
528 if (retval < 0)
529 return retval;
705ececd 530
0fdef36a 531 for (p1 = str, p2 = buf; *p1; ++p1, ++p2) {
705ececd 532 *p2 = *p1;
0fdef36a
GKH
533 if (*p2 != ' ')
534 last_non_space = p2;
535 if (++length == POD_NAME_LENGTH)
536 break;
705ececd
MG
537 }
538
539 *(last_non_space + 1) = '\n';
540 return last_non_space - buf + 2;
541}
542
543/*
544 "read" request on "channel" special file.
545*/
77491e52
GKH
546static ssize_t pod_get_channel(struct device *dev,
547 struct device_attribute *attr, char *buf)
705ececd
MG
548{
549 struct usb_interface *interface = to_usb_interface(dev);
550 struct usb_line6_pod *pod = usb_get_intfdata(interface);
551 return sprintf(buf, "%d\n", pod->channel_num);
552}
553
554/*
555 "write" request on "channel" special file.
556*/
77491e52
GKH
557static ssize_t pod_set_channel(struct device *dev,
558 struct device_attribute *attr,
559 const char *buf, size_t count)
705ececd
MG
560{
561 struct usb_interface *interface = to_usb_interface(dev);
562 struct usb_line6_pod *pod = usb_get_intfdata(interface);
a4fb7d53 563 u8 value;
7e4d5c13
SB
564 int ret;
565
a4fb7d53 566 ret = kstrtou8(buf, 10, &value);
7e4d5c13
SB
567 if (ret)
568 return ret;
569
705ececd
MG
570 pod_send_channel(pod, value);
571 return count;
572}
573
574/*
575 "read" request on "name" special file.
576*/
77491e52
GKH
577static ssize_t pod_get_name(struct device *dev, struct device_attribute *attr,
578 char *buf)
705ececd
MG
579{
580 struct usb_interface *interface = to_usb_interface(dev);
581 struct usb_line6_pod *pod = usb_get_intfdata(interface);
e1a164d7
MG
582 return get_name_generic(pod, pod->prog_data.header + POD_NAME_OFFSET,
583 buf);
705ececd
MG
584}
585
586/*
587 "read" request on "name" special file.
588*/
77491e52
GKH
589static ssize_t pod_get_name_buf(struct device *dev,
590 struct device_attribute *attr, char *buf)
705ececd
MG
591{
592 struct usb_interface *interface = to_usb_interface(dev);
593 struct usb_line6_pod *pod = usb_get_intfdata(interface);
e1a164d7
MG
594 return get_name_generic(pod,
595 pod->prog_data_buf.header + POD_NAME_OFFSET,
596 buf);
705ececd
MG
597}
598
599/*
600 "read" request on "dump" special file.
601*/
77491e52
GKH
602static ssize_t pod_get_dump(struct device *dev, struct device_attribute *attr,
603 char *buf)
705ececd
MG
604{
605 struct usb_interface *interface = to_usb_interface(dev);
606 struct usb_line6_pod *pod = usb_get_intfdata(interface);
1027f476 607 int retval = line6_dump_wait_interruptible(&pod->dumpreq);
0fdef36a
GKH
608 if (retval < 0)
609 return retval;
705ececd
MG
610 memcpy(buf, &pod->prog_data, sizeof(pod->prog_data));
611 return sizeof(pod->prog_data);
612}
613
614/*
615 "write" request on "dump" special file.
616*/
77491e52
GKH
617static ssize_t pod_set_dump(struct device *dev, struct device_attribute *attr,
618 const char *buf, size_t count)
705ececd
MG
619{
620 struct usb_interface *interface = to_usb_interface(dev);
621 struct usb_line6_pod *pod = usb_get_intfdata(interface);
622
0fdef36a 623 if (count != sizeof(pod->prog_data)) {
705ececd 624 dev_err(pod->line6.ifcdev,
e1a164d7
MG
625 "data block must be exactly %d bytes\n",
626 (int)sizeof(pod->prog_data));
705ececd
MG
627 return -EINVAL;
628 }
629
630 pod_dump(pod, buf);
631 return sizeof(pod->prog_data);
632}
633
634/*
1027f476
MG
635 Identify system parameters related to the tuner.
636*/
637static bool pod_is_tuner(int code)
638{
639 return
e1a164d7
MG
640 (code == POD_tuner_mute) ||
641 (code == POD_tuner_freq) ||
642 (code == POD_tuner_note) || (code == POD_tuner_pitch);
1027f476
MG
643}
644
645/*
646 Get system parameter (as integer).
705ececd
MG
647 @param tuner non-zero, if code refers to a tuner parameter
648*/
e1a164d7
MG
649static int pod_get_system_param_int(struct usb_line6_pod *pod, int *value,
650 int code, struct ValueWait *param, int sign)
705ececd
MG
651{
652 char *sysex;
705ececd
MG
653 static const int size = 1;
654 int retval = 0;
705ececd 655
e1a164d7
MG
656 if (((pod->prog_data.control[POD_tuner] & 0x40) == 0)
657 && pod_is_tuner(code))
705ececd
MG
658 return -ENODEV;
659
1027f476 660 /* send value request to device: */
705ececd
MG
661 param->value = POD_system_invalid;
662 sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEMREQ, size);
1027f476 663
0fdef36a 664 if (!sysex)
1027f476
MG
665 return -ENOMEM;
666
705ececd
MG
667 sysex[SYSEX_DATA_OFS] = code;
668 line6_send_sysex_message(&pod->line6, sysex, size);
669 kfree(sysex);
670
1027f476 671 /* wait for device to respond: */
e1a164d7
MG
672 retval =
673 wait_event_interruptible(param->wait,
674 param->value != POD_system_invalid);
705ececd 675
1027f476
MG
676 if (retval < 0)
677 return retval;
705ececd 678
e1a164d7
MG
679 *value = sign ? (int)(signed short)param->value : (int)(unsigned short)
680 param->value;
705ececd 681
e1a164d7
MG
682 if (*value == POD_system_invalid)
683 *value = 0; /* don't report uninitialized values */
1027f476
MG
684
685 return 0;
686}
687
688/*
689 Get system parameter (as string).
690 @param tuner non-zero, if code refers to a tuner parameter
691*/
e1a164d7
MG
692static ssize_t pod_get_system_param_string(struct usb_line6_pod *pod, char *buf,
693 int code, struct ValueWait *param,
694 int sign)
1027f476
MG
695{
696 int retval, value = 0;
697 retval = pod_get_system_param_int(pod, &value, code, param, sign);
698
e1a164d7 699 if (retval < 0)
705ececd
MG
700 return retval;
701
705ececd
MG
702 return sprintf(buf, "%d\n", value);
703}
704
705/*
1027f476 706 Send system parameter (from integer).
705ececd
MG
707 @param tuner non-zero, if code refers to a tuner parameter
708*/
e1a164d7
MG
709static int pod_set_system_param_int(struct usb_line6_pod *pod, int value,
710 int code)
705ececd
MG
711{
712 char *sysex;
713 static const int size = 5;
705ececd 714
e1a164d7
MG
715 if (((pod->prog_data.control[POD_tuner] & 0x40) == 0)
716 && pod_is_tuner(code))
705ececd
MG
717 return -EINVAL;
718
719 /* send value to tuner: */
720 sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEM, size);
0fdef36a 721 if (!sysex)
1027f476 722 return -ENOMEM;
705ececd
MG
723 sysex[SYSEX_DATA_OFS] = code;
724 sysex[SYSEX_DATA_OFS + 1] = (value >> 12) & 0x0f;
e1a164d7
MG
725 sysex[SYSEX_DATA_OFS + 2] = (value >> 8) & 0x0f;
726 sysex[SYSEX_DATA_OFS + 3] = (value >> 4) & 0x0f;
727 sysex[SYSEX_DATA_OFS + 4] = (value) & 0x0f;
705ececd
MG
728 line6_send_sysex_message(&pod->line6, sysex, size);
729 kfree(sysex);
1027f476
MG
730 return 0;
731}
732
733/*
734 Send system parameter (from string).
735 @param tuner non-zero, if code refers to a tuner parameter
736*/
e1a164d7
MG
737static ssize_t pod_set_system_param_string(struct usb_line6_pod *pod,
738 const char *buf, int count, int code,
739 unsigned short mask)
1027f476
MG
740{
741 int retval;
742 unsigned short value = simple_strtoul(buf, NULL, 10) & mask;
743 retval = pod_set_system_param_int(pod, value, code);
744 return (retval < 0) ? retval : count;
705ececd
MG
745}
746
747/*
748 "read" request on "dump_buf" special file.
749*/
77491e52
GKH
750static ssize_t pod_get_dump_buf(struct device *dev,
751 struct device_attribute *attr, char *buf)
705ececd
MG
752{
753 struct usb_interface *interface = to_usb_interface(dev);
754 struct usb_line6_pod *pod = usb_get_intfdata(interface);
1027f476 755 int retval = line6_dump_wait_interruptible(&pod->dumpreq);
0fdef36a
GKH
756 if (retval < 0)
757 return retval;
705ececd
MG
758 memcpy(buf, &pod->prog_data_buf, sizeof(pod->prog_data_buf));
759 return sizeof(pod->prog_data_buf);
760}
761
762/*
763 "write" request on "dump_buf" special file.
764*/
77491e52
GKH
765static ssize_t pod_set_dump_buf(struct device *dev,
766 struct device_attribute *attr,
767 const char *buf, size_t count)
705ececd
MG
768{
769 struct usb_interface *interface = to_usb_interface(dev);
770 struct usb_line6_pod *pod = usb_get_intfdata(interface);
771
0fdef36a 772 if (count != sizeof(pod->prog_data)) {
705ececd 773 dev_err(pod->line6.ifcdev,
1027f476
MG
774 "data block must be exactly %d bytes\n",
775 (int)sizeof(pod->prog_data));
705ececd
MG
776 return -EINVAL;
777 }
778
779 memcpy(&pod->prog_data_buf, buf, sizeof(pod->prog_data));
780 return sizeof(pod->prog_data);
781}
782
783/*
784 "write" request on "finish" special file.
785*/
77491e52
GKH
786static ssize_t pod_set_finish(struct device *dev,
787 struct device_attribute *attr,
788 const char *buf, size_t count)
705ececd
MG
789{
790 struct usb_interface *interface = to_usb_interface(dev);
791 struct usb_line6_pod *pod = usb_get_intfdata(interface);
792 int size = 0;
793 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_FINISH, size);
0fdef36a
GKH
794 if (!sysex)
795 return 0;
705ececd
MG
796 line6_send_sysex_message(&pod->line6, sysex, size);
797 kfree(sysex);
798 return count;
799}
800
801/*
802 "write" request on "store_channel" special file.
803*/
77491e52
GKH
804static ssize_t pod_set_store_channel(struct device *dev,
805 struct device_attribute *attr,
806 const char *buf, size_t count)
705ececd
MG
807{
808 return pod_send_store_command(dev, buf, count, 0x0000, 0x00c0);
809}
810
811/*
812 "write" request on "store_effects_setup" special file.
813*/
77491e52
GKH
814static ssize_t pod_set_store_effects_setup(struct device *dev,
815 struct device_attribute *attr,
816 const char *buf, size_t count)
705ececd
MG
817{
818 return pod_send_store_command(dev, buf, count, 0x0080, 0x0080);
819}
820
821/*
822 "write" request on "store_amp_setup" special file.
823*/
77491e52
GKH
824static ssize_t pod_set_store_amp_setup(struct device *dev,
825 struct device_attribute *attr,
826 const char *buf, size_t count)
705ececd
MG
827{
828 return pod_send_store_command(dev, buf, count, 0x0040, 0x0100);
829}
830
831/*
832 "write" request on "retrieve_channel" special file.
833*/
77491e52
GKH
834static ssize_t pod_set_retrieve_channel(struct device *dev,
835 struct device_attribute *attr,
836 const char *buf, size_t count)
705ececd
MG
837{
838 return pod_send_retrieve_command(dev, buf, count, 0x0000, 0x00c0);
839}
840
841/*
842 "write" request on "retrieve_effects_setup" special file.
843*/
77491e52
GKH
844static ssize_t pod_set_retrieve_effects_setup(struct device *dev,
845 struct device_attribute *attr,
846 const char *buf, size_t count)
705ececd
MG
847{
848 return pod_send_retrieve_command(dev, buf, count, 0x0080, 0x0080);
849}
850
851/*
852 "write" request on "retrieve_amp_setup" special file.
853*/
77491e52
GKH
854static ssize_t pod_set_retrieve_amp_setup(struct device *dev,
855 struct device_attribute *attr,
856 const char *buf, size_t count)
705ececd
MG
857{
858 return pod_send_retrieve_command(dev, buf, count, 0x0040, 0x0100);
859}
860
861/*
862 "read" request on "dirty" special file.
863*/
77491e52
GKH
864static ssize_t pod_get_dirty(struct device *dev, struct device_attribute *attr,
865 char *buf)
705ececd
MG
866{
867 struct usb_interface *interface = to_usb_interface(dev);
868 struct usb_line6_pod *pod = usb_get_intfdata(interface);
869 buf[0] = pod->dirty ? '1' : '0';
870 buf[1] = '\n';
871 return 2;
872}
873
874/*
875 "read" request on "midi_postprocess" special file.
876*/
77491e52
GKH
877static ssize_t pod_get_midi_postprocess(struct device *dev,
878 struct device_attribute *attr,
879 char *buf)
705ececd
MG
880{
881 struct usb_interface *interface = to_usb_interface(dev);
882 struct usb_line6_pod *pod = usb_get_intfdata(interface);
883 return sprintf(buf, "%d\n", pod->midi_postprocess);
884}
885
886/*
887 "write" request on "midi_postprocess" special file.
888*/
77491e52
GKH
889static ssize_t pod_set_midi_postprocess(struct device *dev,
890 struct device_attribute *attr,
891 const char *buf, size_t count)
705ececd
MG
892{
893 struct usb_interface *interface = to_usb_interface(dev);
894 struct usb_line6_pod *pod = usb_get_intfdata(interface);
06501787 895 u8 value;
7e4d5c13
SB
896 int ret;
897
06501787 898 ret = kstrtou8(buf, 10, &value);
7e4d5c13
SB
899 if (ret)
900 return ret;
901
705ececd
MG
902 pod->midi_postprocess = value ? 1 : 0;
903 return count;
904}
905
906/*
907 "read" request on "serial_number" special file.
908*/
77491e52
GKH
909static ssize_t pod_get_serial_number(struct device *dev,
910 struct device_attribute *attr, char *buf)
705ececd
MG
911{
912 struct usb_interface *interface = to_usb_interface(dev);
913 struct usb_line6_pod *pod = usb_get_intfdata(interface);
914 return sprintf(buf, "%d\n", pod->serial_number);
915}
916
917/*
918 "read" request on "firmware_version" special file.
919*/
77491e52
GKH
920static ssize_t pod_get_firmware_version(struct device *dev,
921 struct device_attribute *attr,
922 char *buf)
705ececd
MG
923{
924 struct usb_interface *interface = to_usb_interface(dev);
925 struct usb_line6_pod *pod = usb_get_intfdata(interface);
0fdef36a
GKH
926 return sprintf(buf, "%d.%02d\n", pod->firmware_version / 100,
927 pod->firmware_version % 100);
705ececd
MG
928}
929
930/*
931 "read" request on "device_id" special file.
932*/
77491e52
GKH
933static ssize_t pod_get_device_id(struct device *dev,
934 struct device_attribute *attr, char *buf)
705ececd
MG
935{
936 struct usb_interface *interface = to_usb_interface(dev);
937 struct usb_line6_pod *pod = usb_get_intfdata(interface);
938 return sprintf(buf, "%d\n", pod->device_id);
939}
940
941/*
942 "read" request on "clip" special file.
943*/
77491e52
GKH
944static ssize_t pod_wait_for_clip(struct device *dev,
945 struct device_attribute *attr, char *buf)
705ececd
MG
946{
947 struct usb_interface *interface = to_usb_interface(dev);
948 struct usb_line6_pod *pod = usb_get_intfdata(interface);
e1a164d7
MG
949 return wait_event_interruptible(pod->clipping.wait,
950 pod->clipping.value != 0);
1027f476 951}
705ececd 952
1027f476
MG
953/*
954 POD startup procedure.
955 This is a sequence of functions with special requirements (e.g., must
956 not run immediately after initialization, must not run in interrupt
957 context). After the last one has finished, the device is ready to use.
958*/
959
960static void pod_startup1(struct usb_line6_pod *pod)
961{
e1a164d7 962 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_INIT);
1027f476
MG
963
964 /* delay startup procedure: */
e1a164d7
MG
965 line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
966 (unsigned long)pod);
1027f476
MG
967}
968
969static void pod_startup2(unsigned long data)
970{
971 struct usb_line6_pod *pod = (struct usb_line6_pod *)data;
e1a164d7
MG
972
973 /* schedule another startup procedure until startup is complete: */
974 if (pod->startup_progress >= POD_STARTUP_LAST)
975 return;
976
977 pod->startup_progress = POD_STARTUP_DUMPREQ;
978 line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
979 (unsigned long)pod);
1027f476
MG
980
981 /* current channel dump: */
e1a164d7
MG
982 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
983 LINE6_DUMP_CURRENT);
1027f476
MG
984}
985
986static void pod_startup3(struct usb_line6_pod *pod)
987{
988 struct usb_line6 *line6 = &pod->line6;
e1a164d7 989 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_VERSIONREQ);
1027f476
MG
990
991 /* request firmware version: */
992 line6_version_request_async(line6);
705ececd
MG
993}
994
1027f476
MG
995static void pod_startup4(struct usb_line6_pod *pod)
996{
e1a164d7 997 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_WORKQUEUE);
1027f476
MG
998
999 /* schedule work for global work queue: */
1000 schedule_work(&pod->startup_work);
1001}
1002
1003static void pod_startup5(struct work_struct *work)
1004{
e1a164d7
MG
1005 struct usb_line6_pod *pod =
1006 container_of(work, struct usb_line6_pod, startup_work);
1027f476
MG
1007 struct usb_line6 *line6 = &pod->line6;
1008
e1a164d7 1009 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_SETUP);
1027f476
MG
1010
1011 /* serial number: */
1012 line6_read_serial_number(&pod->line6, &pod->serial_number);
1013
1014 /* ALSA audio interface: */
1015 line6_register_audio(line6);
1016
1017 /* device files: */
e1a164d7
MG
1018 line6_pod_create_files(pod->firmware_version,
1019 line6->properties->device_bit, line6->ifcdev);
1027f476
MG
1020}
1021
1022#define POD_GET_SYSTEM_PARAM(code, sign) \
77491e52
GKH
1023static ssize_t pod_get_ ## code(struct device *dev, \
1024 struct device_attribute *attr, char *buf) \
705ececd
MG
1025{ \
1026 struct usb_interface *interface = to_usb_interface(dev); \
1027 struct usb_line6_pod *pod = usb_get_intfdata(interface); \
1027f476
MG
1028 return pod_get_system_param_string(pod, buf, POD_ ## code, \
1029 &pod->code, sign); \
705ececd
MG
1030}
1031
1027f476
MG
1032#define POD_GET_SET_SYSTEM_PARAM(code, mask, sign) \
1033POD_GET_SYSTEM_PARAM(code, sign) \
77491e52 1034static ssize_t pod_set_ ## code(struct device *dev, \
0fdef36a
GKH
1035 struct device_attribute *attr, \
1036 const char *buf, size_t count) \
705ececd
MG
1037{ \
1038 struct usb_interface *interface = to_usb_interface(dev); \
1039 struct usb_line6_pod *pod = usb_get_intfdata(interface); \
1027f476 1040 return pod_set_system_param_string(pod, buf, count, POD_ ## code, mask); \
705ececd
MG
1041}
1042
1027f476
MG
1043POD_GET_SET_SYSTEM_PARAM(monitor_level, 0xffff, 0);
1044POD_GET_SET_SYSTEM_PARAM(routing, 0x0003, 0);
1045POD_GET_SET_SYSTEM_PARAM(tuner_mute, 0x0001, 0);
1046POD_GET_SET_SYSTEM_PARAM(tuner_freq, 0xffff, 0);
1047POD_GET_SYSTEM_PARAM(tuner_note, 1);
1048POD_GET_SYSTEM_PARAM(tuner_pitch, 1);
705ececd
MG
1049
1050#undef GET_SET_SYSTEM_PARAM
1051#undef GET_SYSTEM_PARAM
1052
1053/* POD special files: */
a3a972a0 1054static DEVICE_ATTR(channel, S_IWUSR | S_IRUGO, pod_get_channel,
e1a164d7 1055 pod_set_channel);
705ececd
MG
1056static DEVICE_ATTR(clip, S_IRUGO, pod_wait_for_clip, line6_nop_write);
1057static DEVICE_ATTR(device_id, S_IRUGO, pod_get_device_id, line6_nop_write);
1058static DEVICE_ATTR(dirty, S_IRUGO, pod_get_dirty, line6_nop_write);
a3a972a0
GKH
1059static DEVICE_ATTR(dump, S_IWUSR | S_IRUGO, pod_get_dump, pod_set_dump);
1060static DEVICE_ATTR(dump_buf, S_IWUSR | S_IRUGO, pod_get_dump_buf,
e1a164d7 1061 pod_set_dump_buf);
a3a972a0 1062static DEVICE_ATTR(finish, S_IWUSR, line6_nop_read, pod_set_finish);
e1a164d7
MG
1063static DEVICE_ATTR(firmware_version, S_IRUGO, pod_get_firmware_version,
1064 line6_nop_write);
a3a972a0 1065static DEVICE_ATTR(midi_postprocess, S_IWUSR | S_IRUGO,
e1a164d7 1066 pod_get_midi_postprocess, pod_set_midi_postprocess);
a3a972a0 1067static DEVICE_ATTR(monitor_level, S_IWUSR | S_IRUGO, pod_get_monitor_level,
e1a164d7 1068 pod_set_monitor_level);
705ececd
MG
1069static DEVICE_ATTR(name, S_IRUGO, pod_get_name, line6_nop_write);
1070static DEVICE_ATTR(name_buf, S_IRUGO, pod_get_name_buf, line6_nop_write);
a3a972a0 1071static DEVICE_ATTR(retrieve_amp_setup, S_IWUSR, line6_nop_read,
e1a164d7 1072 pod_set_retrieve_amp_setup);
a3a972a0 1073static DEVICE_ATTR(retrieve_channel, S_IWUSR, line6_nop_read,
e1a164d7 1074 pod_set_retrieve_channel);
a3a972a0 1075static DEVICE_ATTR(retrieve_effects_setup, S_IWUSR, line6_nop_read,
e1a164d7 1076 pod_set_retrieve_effects_setup);
a3a972a0 1077static DEVICE_ATTR(routing, S_IWUSR | S_IRUGO, pod_get_routing,
e1a164d7
MG
1078 pod_set_routing);
1079static DEVICE_ATTR(serial_number, S_IRUGO, pod_get_serial_number,
1080 line6_nop_write);
a3a972a0 1081static DEVICE_ATTR(store_amp_setup, S_IWUSR, line6_nop_read,
e1a164d7 1082 pod_set_store_amp_setup);
a3a972a0 1083static DEVICE_ATTR(store_channel, S_IWUSR, line6_nop_read,
e1a164d7 1084 pod_set_store_channel);
a3a972a0 1085static DEVICE_ATTR(store_effects_setup, S_IWUSR, line6_nop_read,
e1a164d7 1086 pod_set_store_effects_setup);
a3a972a0 1087static DEVICE_ATTR(tuner_freq, S_IWUSR | S_IRUGO, pod_get_tuner_freq,
e1a164d7 1088 pod_set_tuner_freq);
a3a972a0 1089static DEVICE_ATTR(tuner_mute, S_IWUSR | S_IRUGO, pod_get_tuner_mute,
e1a164d7 1090 pod_set_tuner_mute);
705ececd
MG
1091static DEVICE_ATTR(tuner_note, S_IRUGO, pod_get_tuner_note, line6_nop_write);
1092static DEVICE_ATTR(tuner_pitch, S_IRUGO, pod_get_tuner_pitch, line6_nop_write);
1093
1027f476 1094#ifdef CONFIG_LINE6_USB_RAW
a3a972a0 1095static DEVICE_ATTR(raw, S_IWUSR, line6_nop_read, line6_set_raw);
705ececd
MG
1096#endif
1097
1027f476
MG
1098/* control info callback */
1099static int snd_pod_control_monitor_info(struct snd_kcontrol *kcontrol,
1100 struct snd_ctl_elem_info *uinfo)
1101{
1102 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1103 uinfo->count = 1;
1104 uinfo->value.integer.min = 0;
1105 uinfo->value.integer.max = 65535;
1106 return 0;
1107}
1108
1109/* control get callback */
1110static int snd_pod_control_monitor_get(struct snd_kcontrol *kcontrol,
1111 struct snd_ctl_elem_value *ucontrol)
1112{
1113 struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
1114 struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
1115 ucontrol->value.integer.value[0] = pod->monitor_level.value;
1116 return 0;
1117}
1118
1119/* control put callback */
1120static int snd_pod_control_monitor_put(struct snd_kcontrol *kcontrol,
1121 struct snd_ctl_elem_value *ucontrol)
1122{
1123 struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
1124 struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
1125
e1a164d7 1126 if (ucontrol->value.integer.value[0] == pod->monitor_level.value)
1027f476
MG
1127 return 0;
1128
1129 pod->monitor_level.value = ucontrol->value.integer.value[0];
e1a164d7
MG
1130 pod_set_system_param_int(pod, ucontrol->value.integer.value[0],
1131 POD_monitor_level);
1027f476
MG
1132 return 1;
1133}
1134
1135/* control definition */
1136static struct snd_kcontrol_new pod_control_monitor = {
1137 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1138 .name = "Monitor Playback Volume",
1139 .index = 0,
1140 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
1141 .info = snd_pod_control_monitor_info,
1142 .get = snd_pod_control_monitor_get,
1143 .put = snd_pod_control_monitor_put
1144};
1145
705ececd
MG
1146/*
1147 POD destructor.
1148*/
1149static void pod_destruct(struct usb_interface *interface)
1150{
1151 struct usb_line6_pod *pod = usb_get_intfdata(interface);
705ececd 1152
0fdef36a
GKH
1153 if (pod == NULL)
1154 return;
188e6645 1155 line6_cleanup_audio(&pod->line6);
705ececd 1156
e1a164d7
MG
1157 del_timer(&pod->startup_timer);
1158 cancel_work_sync(&pod->startup_work);
1159
705ececd
MG
1160 /* free dump request data: */
1161 line6_dumpreq_destruct(&pod->dumpreq);
705ececd
MG
1162}
1163
1164/*
1165 Create sysfs entries.
1166*/
b702ed25 1167static int pod_create_files2(struct device *dev)
705ececd
MG
1168{
1169 int err;
1170
1171 CHECK_RETURN(device_create_file(dev, &dev_attr_channel));
1172 CHECK_RETURN(device_create_file(dev, &dev_attr_clip));
1173 CHECK_RETURN(device_create_file(dev, &dev_attr_device_id));
1174 CHECK_RETURN(device_create_file(dev, &dev_attr_dirty));
1175 CHECK_RETURN(device_create_file(dev, &dev_attr_dump));
1176 CHECK_RETURN(device_create_file(dev, &dev_attr_dump_buf));
1177 CHECK_RETURN(device_create_file(dev, &dev_attr_finish));
1178 CHECK_RETURN(device_create_file(dev, &dev_attr_firmware_version));
1179 CHECK_RETURN(device_create_file(dev, &dev_attr_midi_postprocess));
1180 CHECK_RETURN(device_create_file(dev, &dev_attr_monitor_level));
1181 CHECK_RETURN(device_create_file(dev, &dev_attr_name));
1182 CHECK_RETURN(device_create_file(dev, &dev_attr_name_buf));
1183 CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_amp_setup));
1184 CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_channel));
1185 CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_effects_setup));
1186 CHECK_RETURN(device_create_file(dev, &dev_attr_routing));
1187 CHECK_RETURN(device_create_file(dev, &dev_attr_serial_number));
1188 CHECK_RETURN(device_create_file(dev, &dev_attr_store_amp_setup));
1189 CHECK_RETURN(device_create_file(dev, &dev_attr_store_channel));
1190 CHECK_RETURN(device_create_file(dev, &dev_attr_store_effects_setup));
1191 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_freq));
1192 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_mute));
1193 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_note));
1194 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_pitch));
1195
1027f476 1196#ifdef CONFIG_LINE6_USB_RAW
705ececd
MG
1197 CHECK_RETURN(device_create_file(dev, &dev_attr_raw));
1198#endif
1199
1200 return 0;
1201}
1202
1203/*
1027f476 1204 Try to init POD device.
705ececd 1205*/
e1a164d7
MG
1206static int pod_try_init(struct usb_interface *interface,
1207 struct usb_line6_pod *pod)
705ececd
MG
1208{
1209 int err;
1210 struct usb_line6 *line6 = &pod->line6;
1211
e1a164d7
MG
1212 init_timer(&pod->startup_timer);
1213 INIT_WORK(&pod->startup_work, pod_startup5);
1214
0fdef36a
GKH
1215 if ((interface == NULL) || (pod == NULL))
1216 return -ENODEV;
705ececd
MG
1217
1218 pod->channel_num = 255;
1219
1220 /* initialize wait queues: */
1221 init_waitqueue_head(&pod->monitor_level.wait);
1222 init_waitqueue_head(&pod->routing.wait);
1223 init_waitqueue_head(&pod->tuner_mute.wait);
1224 init_waitqueue_head(&pod->tuner_freq.wait);
1225 init_waitqueue_head(&pod->tuner_note.wait);
1226 init_waitqueue_head(&pod->tuner_pitch.wait);
1227 init_waitqueue_head(&pod->clipping.wait);
1228
1229 memset(pod->param_dirty, 0xff, sizeof(pod->param_dirty));
1230
1231 /* initialize USB buffers: */
0fdef36a
GKH
1232 err = line6_dumpreq_init(&pod->dumpreq, pod_request_channel,
1233 sizeof(pod_request_channel));
1234 if (err < 0) {
705ececd 1235 dev_err(&interface->dev, "Out of memory\n");
705ececd
MG
1236 return -ENOMEM;
1237 }
1238
705ececd 1239 /* create sysfs entries: */
0fdef36a 1240 err = pod_create_files2(&interface->dev);
027360c5 1241 if (err < 0)
705ececd 1242 return err;
705ececd
MG
1243
1244 /* initialize audio system: */
0fdef36a 1245 err = line6_init_audio(line6);
027360c5 1246 if (err < 0)
705ececd 1247 return err;
705ececd
MG
1248
1249 /* initialize MIDI subsystem: */
0fdef36a 1250 err = line6_init_midi(line6);
027360c5 1251 if (err < 0)
705ececd 1252 return err;
705ececd
MG
1253
1254 /* initialize PCM subsystem: */
0fdef36a 1255 err = line6_init_pcm(line6, &pod_pcm_properties);
027360c5 1256 if (err < 0)
705ececd 1257 return err;
705ececd 1258
1027f476 1259 /* register monitor control: */
027360c5
GKH
1260 err = snd_ctl_add(line6->card,
1261 snd_ctl_new1(&pod_control_monitor, line6->line6pcm));
1262 if (err < 0)
705ececd 1263 return err;
705ececd 1264
1027f476 1265 /*
e1a164d7
MG
1266 When the sound card is registered at this point, the PODxt Live
1267 displays "Invalid Code Error 07", so we do it later in the event
1268 handler.
1269 */
1027f476 1270
0fdef36a 1271 if (pod->line6.properties->capabilities & LINE6_BIT_CONTROL) {
1027f476
MG
1272 pod->monitor_level.value = POD_system_invalid;
1273
1274 /* initiate startup procedure: */
1275 pod_startup1(pod);
705ececd
MG
1276 }
1277
1278 return 0;
1279}
1280
1027f476
MG
1281/*
1282 Init POD device (and clean up in case of failure).
1283*/
1284int line6_pod_init(struct usb_interface *interface, struct usb_line6_pod *pod)
1285{
1286 int err = pod_try_init(interface, pod);
1287
027360c5 1288 if (err < 0)
1027f476 1289 pod_destruct(interface);
1027f476
MG
1290
1291 return err;
1292}
1293
705ececd
MG
1294/*
1295 POD device disconnected.
1296*/
1027f476 1297void line6_pod_disconnect(struct usb_interface *interface)
705ececd
MG
1298{
1299 struct usb_line6_pod *pod;
1300
0fdef36a
GKH
1301 if (interface == NULL)
1302 return;
705ececd
MG
1303 pod = usb_get_intfdata(interface);
1304
0fdef36a 1305 if (pod != NULL) {
705ececd
MG
1306 struct snd_line6_pcm *line6pcm = pod->line6.line6pcm;
1307 struct device *dev = &interface->dev;
1308
027360c5 1309 if (line6pcm != NULL)
1027f476 1310 line6_pcm_disconnect(line6pcm);
705ececd 1311
0fdef36a 1312 if (dev != NULL) {
705ececd 1313 /* remove sysfs entries: */
e1a164d7
MG
1314 line6_pod_remove_files(pod->firmware_version,
1315 pod->line6.
1316 properties->device_bit, dev);
705ececd
MG
1317
1318 device_remove_file(dev, &dev_attr_channel);
1319 device_remove_file(dev, &dev_attr_clip);
1320 device_remove_file(dev, &dev_attr_device_id);
1321 device_remove_file(dev, &dev_attr_dirty);
1322 device_remove_file(dev, &dev_attr_dump);
1323 device_remove_file(dev, &dev_attr_dump_buf);
1324 device_remove_file(dev, &dev_attr_finish);
1325 device_remove_file(dev, &dev_attr_firmware_version);
1326 device_remove_file(dev, &dev_attr_midi_postprocess);
1327 device_remove_file(dev, &dev_attr_monitor_level);
1328 device_remove_file(dev, &dev_attr_name);
1329 device_remove_file(dev, &dev_attr_name_buf);
1330 device_remove_file(dev, &dev_attr_retrieve_amp_setup);
1331 device_remove_file(dev, &dev_attr_retrieve_channel);
e1a164d7
MG
1332 device_remove_file(dev,
1333 &dev_attr_retrieve_effects_setup);
705ececd
MG
1334 device_remove_file(dev, &dev_attr_routing);
1335 device_remove_file(dev, &dev_attr_serial_number);
1336 device_remove_file(dev, &dev_attr_store_amp_setup);
1337 device_remove_file(dev, &dev_attr_store_channel);
1338 device_remove_file(dev, &dev_attr_store_effects_setup);
1339 device_remove_file(dev, &dev_attr_tuner_freq);
1340 device_remove_file(dev, &dev_attr_tuner_mute);
1341 device_remove_file(dev, &dev_attr_tuner_note);
1342 device_remove_file(dev, &dev_attr_tuner_pitch);
1343
1027f476 1344#ifdef CONFIG_LINE6_USB_RAW
705ececd
MG
1345 device_remove_file(dev, &dev_attr_raw);
1346#endif
1347 }
1348 }
1349
1350 pod_destruct(interface);
1351}