1
2
3
4
5
6
7
8
9
10
11
12#include <linux/slab.h>
13#include <linux/wait.h>
14#include <sound/control.h>
15
16#include "audio.h"
17#include "capture.h"
18#include "control.h"
19#include "driver.h"
20#include "playback.h"
21#include "pod.h"
22
23#define POD_SYSEX_CODE 3
24#define POD_BYTES_PER_FRAME 6
25
26
27
28enum {
29 POD_SYSEX_CLIP = 0x0f,
30 POD_SYSEX_SAVE = 0x24,
31 POD_SYSEX_SYSTEM = 0x56,
32 POD_SYSEX_SYSTEMREQ = 0x57,
33
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
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,
49 POD_system_invalid = 0x10000
50};
51
52
53
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
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 = {
74 .snd_line6_playback_hw = {
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 |
80#ifdef CONFIG_PM
81 SNDRV_PCM_INFO_RESUME |
82#endif
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},
95 .snd_line6_capture_hw = {
96 .info = (SNDRV_PCM_INFO_MMAP |
97 SNDRV_PCM_INFO_INTERLEAVED |
98 SNDRV_PCM_INFO_BLOCK_TRANSFER |
99 SNDRV_PCM_INFO_MMAP_VALID |
100#ifdef CONFIG_PM
101 SNDRV_PCM_INFO_RESUME |
102#endif
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},
115 .snd_line6_rates = {
116 .nrats = 1,
117 .rats = &pod_ratden},
118 .bytes_per_frame = POD_BYTES_PER_FRAME
119};
120
121static const char pod_request_channel[] = {
122 0xf0, 0x00, 0x01, 0x0c, 0x03, 0x75, 0xf7
123};
124
125static const char pod_version_header[] = {
126 0xf2, 0x7e, 0x7f, 0x06, 0x02
127};
128
129
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);
133
134
135
136
137static void pod_mark_batch_all_dirty(struct usb_line6_pod *pod)
138{
139 int i;
140
141 for (i = 0; i < POD_CONTROL_SIZE; i++)
142 set_bit(i, pod->param_dirty);
143}
144
145static char *pod_alloc_sysex_buffer(struct usb_line6_pod *pod, int code,
146 int size)
147{
148 return line6_alloc_sysex_buffer(&pod->line6, POD_SYSEX_CODE, code,
149 size);
150}
151
152
153
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);
159 if (!sysex)
160 return;
161
162
163 sysex[SYSEX_DATA_OFS] = 5;
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
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
182
183
184static void pod_save_button_pressed(struct usb_line6_pod *pod, int type,
185 int index)
186{
187 pod->dirty = 0;
188 set_bit(POD_SAVE_PRESSED, &pod->atomic_flags);
189}
190
191
192
193
194void line6_pod_process_message(struct usb_line6_pod *pod)
195{
196 const unsigned char *buf = pod->line6.buffer_message;
197
198
199 switch (buf[0] & 0xf0) {
200 case LINE6_PARAM_CHANGE:
201 case LINE6_PROGRAM_CHANGE:
202 case LINE6_SYSEX_BEGIN:
203 break;
204
205 default:
206 return;
207 }
208
209
210 switch (buf[0]) {
211 case LINE6_PARAM_CHANGE | LINE6_CHANNEL_DEVICE:
212 pod_store_parameter(pod, buf[1], buf[2]);
213
214
215 case LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST:
216 if ((buf[1] == POD_amp_model_setup) ||
217 (buf[1] == POD_effect_setup))
218
219 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
220 LINE6_DUMP_CURRENT);
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);
229 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
230 LINE6_DUMP_CURRENT);
231 break;
232
233 case LINE6_SYSEX_BEGIN | LINE6_CHANNEL_DEVICE:
234 case LINE6_SYSEX_BEGIN | LINE6_CHANNEL_UNKNOWN:
235 if (memcmp(buf + 1, line6_midi_id, sizeof(line6_midi_id)) == 0) {
236 switch (buf[5]) {
237 case POD_SYSEX_DUMP:
238 if (pod->line6.message_length ==
239 sizeof(pod->prog_data) + 7) {
240 switch (pod->dumpreq.in_progress) {
241 case LINE6_DUMP_CURRENT:
242 memcpy(&pod->prog_data, buf + 7,
243 sizeof(pod->prog_data));
244 pod_mark_batch_all_dirty(pod);
245 break;
246
247 case POD_DUMP_MEMORY:
248 memcpy(&pod->prog_data_buf,
249 buf + 7,
250 sizeof
251 (pod->prog_data_buf));
252 break;
253
254 default:
255 DEBUG_MESSAGES(dev_err
256 (pod->
257 line6.ifcdev,
258 "unknown dump code %02X\n",
259 pod->
260 dumpreq.in_progress));
261 }
262
263 line6_dump_finished(&pod->dumpreq);
264 pod_startup3(pod);
265 } else
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));
274
275 break;
276
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];
282
283#define PROCESS_SYSTEM_PARAM(x) \
284 case POD_ ## x: \
285 pod->x.value = value; \
286 wake_up(&pod->x.wait); \
287 break;
288
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);
301
302#undef PROCESS_SYSTEM_PARAM
303
304 default:
305 DEBUG_MESSAGES(dev_err
306 (pod->
307 line6.ifcdev,
308 "unknown tuner/system response %02X\n",
309 buf[6]));
310 }
311
312 break;
313 }
314
315 case POD_SYSEX_FINISH:
316
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:
324 DEBUG_MESSAGES(dev_err
325 (pod->line6.ifcdev,
326 "audio clipped\n"));
327 pod->clipping.value = 1;
328 wake_up(&pod->clipping.wait);
329 break;
330
331 case POD_SYSEX_STORE:
332 DEBUG_MESSAGES(dev_err
333 (pod->line6.ifcdev,
334 "message %02X not yet implemented\n",
335 buf[5]));
336 break;
337
338 default:
339 DEBUG_MESSAGES(dev_err
340 (pod->line6.ifcdev,
341 "unknown sysex message %02X\n",
342 buf[5]));
343 }
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];
353 pod_startup4(pod);
354 } else
355 DEBUG_MESSAGES(dev_err
356 (pod->line6.ifcdev,
357 "unknown sysex header\n"));
358
359 break;
360
361 case LINE6_SYSEX_END:
362 break;
363
364 default:
365 DEBUG_MESSAGES(dev_err
366 (pod->line6.ifcdev,
367 "POD: unknown message %02X\n", buf[0]));
368 }
369}
370
371
372
373
374
375
376
377
378
379
380
381
382void line6_pod_midi_postprocess(struct usb_line6_pod *pod, unsigned char *data,
383 int length)
384{
385 int i;
386
387 if (!pod->midi_postprocess)
388 return;
389
390 for (i = 0; i < length; ++i) {
391 if (data[i] == (LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST)) {
392 line6_invalidate_current(&pod->dumpreq);
393 break;
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)) {
399 line6_invalidate_current(&pod->dumpreq);
400 break;
401 }
402 }
403}
404
405
406
407
408static void pod_send_channel(struct usb_line6_pod *pod, int value)
409{
410 line6_invalidate_current(&pod->dumpreq);
411
412 if (line6_send_program(&pod->line6, value) == 0)
413 pod->channel_num = value;
414 else
415 line6_dump_finished(&pod->dumpreq);
416}
417
418
419
420
421void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param,
422 int value)
423{
424 if (line6_transmit_parameter(&pod->line6, param, value) == 0)
425 pod_store_parameter(pod, param, value);
426
427 if ((param == POD_amp_model_setup) || (param == POD_effect_setup))
428 line6_invalidate_current(&pod->dumpreq);
429}
430
431
432
433
434static int pod_resolve(const char *buf, short block0, short block1,
435 unsigned char *location)
436{
437 unsigned long value;
438 short block;
439 int ret;
440
441 ret = strict_strtoul(buf, 10, &value);
442 if (ret)
443 return ret;
444
445 block = (value < 0x40) ? block0 : block1;
446 value &= 0x3f;
447 location[0] = block >> 7;
448 location[1] = value | (block & 0x7f);
449 return 0;
450}
451
452
453
454
455static ssize_t pod_send_store_command(struct device *dev, const char *buf,
456 size_t count, short block0, short block1)
457{
458 struct usb_interface *interface = to_usb_interface(dev);
459 struct usb_line6_pod *pod = usb_get_intfdata(interface);
460 int ret;
461 int size = 3 + sizeof(pod->prog_data_buf);
462 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_STORE, size);
463
464 if (!sysex)
465 return 0;
466
467 sysex[SYSEX_DATA_OFS] = 5;
468 ret = pod_resolve(buf, block0, block1, sysex + SYSEX_DATA_OFS + 1);
469 if (ret) {
470 kfree(sysex);
471 return ret;
472 }
473
474 memcpy(sysex + SYSEX_DATA_OFS + 3, &pod->prog_data_buf,
475 sizeof(pod->prog_data_buf));
476
477 line6_send_sysex_message(&pod->line6, sysex, size);
478 kfree(sysex);
479
480 return count;
481}
482
483
484
485
486static ssize_t pod_send_retrieve_command(struct device *dev, const char *buf,
487 size_t count, short block0,
488 short block1)
489{
490 struct usb_interface *interface = to_usb_interface(dev);
491 struct usb_line6_pod *pod = usb_get_intfdata(interface);
492 int ret;
493 int size = 4;
494 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_DUMPMEM, size);
495
496 if (!sysex)
497 return 0;
498
499 ret = pod_resolve(buf, block0, block1, sysex + SYSEX_DATA_OFS);
500 if (ret) {
501 kfree(sysex);
502 return ret;
503 }
504 sysex[SYSEX_DATA_OFS + 2] = 0;
505 sysex[SYSEX_DATA_OFS + 3] = 0;
506 line6_dump_started(&pod->dumpreq, POD_DUMP_MEMORY);
507
508 if (line6_send_sysex_message(&pod->line6, sysex, size) < size)
509 line6_dump_finished(&pod->dumpreq);
510
511 kfree(sysex);
512
513 return count;
514}
515
516
517
518
519static ssize_t get_name_generic(struct usb_line6_pod *pod, const char *str,
520 char *buf)
521{
522 int length = 0;
523 const char *p1;
524 char *p2;
525 char *last_non_space = buf;
526
527 int retval = line6_dump_wait_interruptible(&pod->dumpreq);
528 if (retval < 0)
529 return retval;
530
531 for (p1 = str, p2 = buf; *p1; ++p1, ++p2) {
532 *p2 = *p1;
533 if (*p2 != ' ')
534 last_non_space = p2;
535 if (++length == POD_NAME_LENGTH)
536 break;
537 }
538
539 *(last_non_space + 1) = '\n';
540 return last_non_space - buf + 2;
541}
542
543
544
545
546static ssize_t pod_get_channel(struct device *dev,
547 struct device_attribute *attr, char *buf)
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
556
557static ssize_t pod_set_channel(struct device *dev,
558 struct device_attribute *attr,
559 const char *buf, size_t count)
560{
561 struct usb_interface *interface = to_usb_interface(dev);
562 struct usb_line6_pod *pod = usb_get_intfdata(interface);
563 unsigned long value;
564 int ret;
565
566 ret = strict_strtoul(buf, 10, &value);
567 if (ret)
568 return ret;
569
570 pod_send_channel(pod, value);
571 return count;
572}
573
574
575
576
577static ssize_t pod_get_name(struct device *dev, struct device_attribute *attr,
578 char *buf)
579{
580 struct usb_interface *interface = to_usb_interface(dev);
581 struct usb_line6_pod *pod = usb_get_intfdata(interface);
582 return get_name_generic(pod, pod->prog_data.header + POD_NAME_OFFSET,
583 buf);
584}
585
586
587
588
589static ssize_t pod_get_name_buf(struct device *dev,
590 struct device_attribute *attr, char *buf)
591{
592 struct usb_interface *interface = to_usb_interface(dev);
593 struct usb_line6_pod *pod = usb_get_intfdata(interface);
594 return get_name_generic(pod,
595 pod->prog_data_buf.header + POD_NAME_OFFSET,
596 buf);
597}
598
599
600
601
602static ssize_t pod_get_dump(struct device *dev, struct device_attribute *attr,
603 char *buf)
604{
605 struct usb_interface *interface = to_usb_interface(dev);
606 struct usb_line6_pod *pod = usb_get_intfdata(interface);
607 int retval = line6_dump_wait_interruptible(&pod->dumpreq);
608 if (retval < 0)
609 return retval;
610 memcpy(buf, &pod->prog_data, sizeof(pod->prog_data));
611 return sizeof(pod->prog_data);
612}
613
614
615
616
617static ssize_t pod_set_dump(struct device *dev, struct device_attribute *attr,
618 const char *buf, size_t count)
619{
620 struct usb_interface *interface = to_usb_interface(dev);
621 struct usb_line6_pod *pod = usb_get_intfdata(interface);
622
623 if (count != sizeof(pod->prog_data)) {
624 dev_err(pod->line6.ifcdev,
625 "data block must be exactly %d bytes\n",
626 (int)sizeof(pod->prog_data));
627 return -EINVAL;
628 }
629
630 pod_dump(pod, buf);
631 return sizeof(pod->prog_data);
632}
633
634
635
636
637static bool pod_is_tuner(int code)
638{
639 return
640 (code == POD_tuner_mute) ||
641 (code == POD_tuner_freq) ||
642 (code == POD_tuner_note) || (code == POD_tuner_pitch);
643}
644
645
646
647
648
649static int pod_get_system_param_int(struct usb_line6_pod *pod, int *value,
650 int code, struct ValueWait *param, int sign)
651{
652 char *sysex;
653 static const int size = 1;
654 int retval = 0;
655
656 if (((pod->prog_data.control[POD_tuner] & 0x40) == 0)
657 && pod_is_tuner(code))
658 return -ENODEV;
659
660
661 param->value = POD_system_invalid;
662 sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEMREQ, size);
663
664 if (!sysex)
665 return -ENOMEM;
666
667 sysex[SYSEX_DATA_OFS] = code;
668 line6_send_sysex_message(&pod->line6, sysex, size);
669 kfree(sysex);
670
671
672 retval =
673 wait_event_interruptible(param->wait,
674 param->value != POD_system_invalid);
675
676 if (retval < 0)
677 return retval;
678
679 *value = sign ? (int)(signed short)param->value : (int)(unsigned short)
680 param->value;
681
682 if (*value == POD_system_invalid)
683 *value = 0;
684
685 return 0;
686}
687
688
689
690
691
692static ssize_t pod_get_system_param_string(struct usb_line6_pod *pod, char *buf,
693 int code, struct ValueWait *param,
694 int sign)
695{
696 int retval, value = 0;
697 retval = pod_get_system_param_int(pod, &value, code, param, sign);
698
699 if (retval < 0)
700 return retval;
701
702 return sprintf(buf, "%d\n", value);
703}
704
705
706
707
708
709static int pod_set_system_param_int(struct usb_line6_pod *pod, int value,
710 int code)
711{
712 char *sysex;
713 static const int size = 5;
714
715 if (((pod->prog_data.control[POD_tuner] & 0x40) == 0)
716 && pod_is_tuner(code))
717 return -EINVAL;
718
719
720 sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEM, size);
721 if (!sysex)
722 return -ENOMEM;
723 sysex[SYSEX_DATA_OFS] = code;
724 sysex[SYSEX_DATA_OFS + 1] = (value >> 12) & 0x0f;
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;
728 line6_send_sysex_message(&pod->line6, sysex, size);
729 kfree(sysex);
730 return 0;
731}
732
733
734
735
736
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)
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;
745}
746
747
748
749
750static ssize_t pod_get_dump_buf(struct device *dev,
751 struct device_attribute *attr, char *buf)
752{
753 struct usb_interface *interface = to_usb_interface(dev);
754 struct usb_line6_pod *pod = usb_get_intfdata(interface);
755 int retval = line6_dump_wait_interruptible(&pod->dumpreq);
756 if (retval < 0)
757 return retval;
758 memcpy(buf, &pod->prog_data_buf, sizeof(pod->prog_data_buf));
759 return sizeof(pod->prog_data_buf);
760}
761
762
763
764
765static ssize_t pod_set_dump_buf(struct device *dev,
766 struct device_attribute *attr,
767 const char *buf, size_t count)
768{
769 struct usb_interface *interface = to_usb_interface(dev);
770 struct usb_line6_pod *pod = usb_get_intfdata(interface);
771
772 if (count != sizeof(pod->prog_data)) {
773 dev_err(pod->line6.ifcdev,
774 "data block must be exactly %d bytes\n",
775 (int)sizeof(pod->prog_data));
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
785
786static ssize_t pod_set_finish(struct device *dev,
787 struct device_attribute *attr,
788 const char *buf, size_t count)
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);
794 if (!sysex)
795 return 0;
796 line6_send_sysex_message(&pod->line6, sysex, size);
797 kfree(sysex);
798 return count;
799}
800
801
802
803
804static ssize_t pod_set_store_channel(struct device *dev,
805 struct device_attribute *attr,
806 const char *buf, size_t count)
807{
808 return pod_send_store_command(dev, buf, count, 0x0000, 0x00c0);
809}
810
811
812
813
814static ssize_t pod_set_store_effects_setup(struct device *dev,
815 struct device_attribute *attr,
816 const char *buf, size_t count)
817{
818 return pod_send_store_command(dev, buf, count, 0x0080, 0x0080);
819}
820
821
822
823
824static ssize_t pod_set_store_amp_setup(struct device *dev,
825 struct device_attribute *attr,
826 const char *buf, size_t count)
827{
828 return pod_send_store_command(dev, buf, count, 0x0040, 0x0100);
829}
830
831
832
833
834static ssize_t pod_set_retrieve_channel(struct device *dev,
835 struct device_attribute *attr,
836 const char *buf, size_t count)
837{
838 return pod_send_retrieve_command(dev, buf, count, 0x0000, 0x00c0);
839}
840
841
842
843
844static ssize_t pod_set_retrieve_effects_setup(struct device *dev,
845 struct device_attribute *attr,
846 const char *buf, size_t count)
847{
848 return pod_send_retrieve_command(dev, buf, count, 0x0080, 0x0080);
849}
850
851
852
853
854static ssize_t pod_set_retrieve_amp_setup(struct device *dev,
855 struct device_attribute *attr,
856 const char *buf, size_t count)
857{
858 return pod_send_retrieve_command(dev, buf, count, 0x0040, 0x0100);
859}
860
861
862
863
864static ssize_t pod_get_dirty(struct device *dev, struct device_attribute *attr,
865 char *buf)
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
876
877static ssize_t pod_get_midi_postprocess(struct device *dev,
878 struct device_attribute *attr,
879 char *buf)
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
888
889static ssize_t pod_set_midi_postprocess(struct device *dev,
890 struct device_attribute *attr,
891 const char *buf, size_t count)
892{
893 struct usb_interface *interface = to_usb_interface(dev);
894 struct usb_line6_pod *pod = usb_get_intfdata(interface);
895 unsigned long value;
896 int ret;
897
898 ret = strict_strtoul(buf, 10, &value);
899 if (ret)
900 return ret;
901
902 pod->midi_postprocess = value ? 1 : 0;
903 return count;
904}
905
906
907
908
909static ssize_t pod_get_serial_number(struct device *dev,
910 struct device_attribute *attr, char *buf)
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
919
920static ssize_t pod_get_firmware_version(struct device *dev,
921 struct device_attribute *attr,
922 char *buf)
923{
924 struct usb_interface *interface = to_usb_interface(dev);
925 struct usb_line6_pod *pod = usb_get_intfdata(interface);
926 return sprintf(buf, "%d.%02d\n", pod->firmware_version / 100,
927 pod->firmware_version % 100);
928}
929
930
931
932
933static ssize_t pod_get_device_id(struct device *dev,
934 struct device_attribute *attr, char *buf)
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
943
944static ssize_t pod_wait_for_clip(struct device *dev,
945 struct device_attribute *attr, char *buf)
946{
947 struct usb_interface *interface = to_usb_interface(dev);
948 struct usb_line6_pod *pod = usb_get_intfdata(interface);
949 return wait_event_interruptible(pod->clipping.wait,
950 pod->clipping.value != 0);
951}
952
953
954
955
956
957
958
959
960static void pod_startup1(struct usb_line6_pod *pod)
961{
962 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_INIT);
963
964
965 line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
966 (unsigned long)pod);
967}
968
969static void pod_startup2(unsigned long data)
970{
971 struct usb_line6_pod *pod = (struct usb_line6_pod *)data;
972
973
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);
980
981
982 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
983 LINE6_DUMP_CURRENT);
984}
985
986static void pod_startup3(struct usb_line6_pod *pod)
987{
988 struct usb_line6 *line6 = &pod->line6;
989 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_VERSIONREQ);
990
991
992 line6_version_request_async(line6);
993}
994
995static void pod_startup4(struct usb_line6_pod *pod)
996{
997 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_WORKQUEUE);
998
999
1000 schedule_work(&pod->startup_work);
1001}
1002
1003static void pod_startup5(struct work_struct *work)
1004{
1005 struct usb_line6_pod *pod =
1006 container_of(work, struct usb_line6_pod, startup_work);
1007 struct usb_line6 *line6 = &pod->line6;
1008
1009 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_SETUP);
1010
1011
1012 line6_read_serial_number(&pod->line6, &pod->serial_number);
1013
1014
1015 line6_register_audio(line6);
1016
1017
1018 line6_pod_create_files(pod->firmware_version,
1019 line6->properties->device_bit, line6->ifcdev);
1020}
1021
1022#define POD_GET_SYSTEM_PARAM(code, sign) \
1023static ssize_t pod_get_ ## code(struct device *dev, \
1024 struct device_attribute *attr, char *buf) \
1025{ \
1026 struct usb_interface *interface = to_usb_interface(dev); \
1027 struct usb_line6_pod *pod = usb_get_intfdata(interface); \
1028 return pod_get_system_param_string(pod, buf, POD_ ## code, \
1029 &pod->code, sign); \
1030}
1031
1032#define POD_GET_SET_SYSTEM_PARAM(code, mask, sign) \
1033POD_GET_SYSTEM_PARAM(code, sign) \
1034static ssize_t pod_set_ ## code(struct device *dev, \
1035 struct device_attribute *attr, \
1036 const char *buf, size_t count) \
1037{ \
1038 struct usb_interface *interface = to_usb_interface(dev); \
1039 struct usb_line6_pod *pod = usb_get_intfdata(interface); \
1040 return pod_set_system_param_string(pod, buf, count, POD_ ## code, mask); \
1041}
1042
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);
1049
1050#undef GET_SET_SYSTEM_PARAM
1051#undef GET_SYSTEM_PARAM
1052
1053
1054static DEVICE_ATTR(channel, S_IWUSR | S_IRUGO, pod_get_channel,
1055 pod_set_channel);
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);
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,
1061 pod_set_dump_buf);
1062static DEVICE_ATTR(finish, S_IWUSR, line6_nop_read, pod_set_finish);
1063static DEVICE_ATTR(firmware_version, S_IRUGO, pod_get_firmware_version,
1064 line6_nop_write);
1065static DEVICE_ATTR(midi_postprocess, S_IWUSR | S_IRUGO,
1066 pod_get_midi_postprocess, pod_set_midi_postprocess);
1067static DEVICE_ATTR(monitor_level, S_IWUSR | S_IRUGO, pod_get_monitor_level,
1068 pod_set_monitor_level);
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);
1071static DEVICE_ATTR(retrieve_amp_setup, S_IWUSR, line6_nop_read,
1072 pod_set_retrieve_amp_setup);
1073static DEVICE_ATTR(retrieve_channel, S_IWUSR, line6_nop_read,
1074 pod_set_retrieve_channel);
1075static DEVICE_ATTR(retrieve_effects_setup, S_IWUSR, line6_nop_read,
1076 pod_set_retrieve_effects_setup);
1077static DEVICE_ATTR(routing, S_IWUSR | S_IRUGO, pod_get_routing,
1078 pod_set_routing);
1079static DEVICE_ATTR(serial_number, S_IRUGO, pod_get_serial_number,
1080 line6_nop_write);
1081static DEVICE_ATTR(store_amp_setup, S_IWUSR, line6_nop_read,
1082 pod_set_store_amp_setup);
1083static DEVICE_ATTR(store_channel, S_IWUSR, line6_nop_read,
1084 pod_set_store_channel);
1085static DEVICE_ATTR(store_effects_setup, S_IWUSR, line6_nop_read,
1086 pod_set_store_effects_setup);
1087static DEVICE_ATTR(tuner_freq, S_IWUSR | S_IRUGO, pod_get_tuner_freq,
1088 pod_set_tuner_freq);
1089static DEVICE_ATTR(tuner_mute, S_IWUSR | S_IRUGO, pod_get_tuner_mute,
1090 pod_set_tuner_mute);
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
1094#ifdef CONFIG_LINE6_USB_RAW
1095static DEVICE_ATTR(raw, S_IWUSR, line6_nop_read, line6_set_raw);
1096#endif
1097
1098
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
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
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
1126 if (ucontrol->value.integer.value[0] == pod->monitor_level.value)
1127 return 0;
1128
1129 pod->monitor_level.value = ucontrol->value.integer.value[0];
1130 pod_set_system_param_int(pod, ucontrol->value.integer.value[0],
1131 POD_monitor_level);
1132 return 1;
1133}
1134
1135
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
1146
1147
1148
1149static void pod_destruct(struct usb_interface *interface)
1150{
1151 struct usb_line6_pod *pod = usb_get_intfdata(interface);
1152
1153 if (pod == NULL)
1154 return;
1155 line6_cleanup_audio(&pod->line6);
1156
1157 del_timer(&pod->startup_timer);
1158 cancel_work_sync(&pod->startup_work);
1159
1160
1161 line6_dumpreq_destruct(&pod->dumpreq);
1162}
1163
1164
1165
1166
1167static int pod_create_files2(struct device *dev)
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
1196#ifdef CONFIG_LINE6_USB_RAW
1197 CHECK_RETURN(device_create_file(dev, &dev_attr_raw));
1198#endif
1199
1200 return 0;
1201}
1202
1203
1204
1205
1206static int pod_try_init(struct usb_interface *interface,
1207 struct usb_line6_pod *pod)
1208{
1209 int err;
1210 struct usb_line6 *line6 = &pod->line6;
1211
1212 init_timer(&pod->startup_timer);
1213 INIT_WORK(&pod->startup_work, pod_startup5);
1214
1215 if ((interface == NULL) || (pod == NULL))
1216 return -ENODEV;
1217
1218 pod->channel_num = 255;
1219
1220
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
1232 err = line6_dumpreq_init(&pod->dumpreq, pod_request_channel,
1233 sizeof(pod_request_channel));
1234 if (err < 0) {
1235 dev_err(&interface->dev, "Out of memory\n");
1236 return -ENOMEM;
1237 }
1238
1239
1240 err = pod_create_files2(&interface->dev);
1241 if (err < 0)
1242 return err;
1243
1244
1245 err = line6_init_audio(line6);
1246 if (err < 0)
1247 return err;
1248
1249
1250 err = line6_init_midi(line6);
1251 if (err < 0)
1252 return err;
1253
1254
1255 err = line6_init_pcm(line6, &pod_pcm_properties);
1256 if (err < 0)
1257 return err;
1258
1259
1260 err = snd_ctl_add(line6->card,
1261 snd_ctl_new1(&pod_control_monitor, line6->line6pcm));
1262 if (err < 0)
1263 return err;
1264
1265
1266
1267
1268
1269
1270
1271 if (pod->line6.properties->capabilities & LINE6_BIT_CONTROL) {
1272 pod->monitor_level.value = POD_system_invalid;
1273
1274
1275 pod_startup1(pod);
1276 }
1277
1278 return 0;
1279}
1280
1281
1282
1283
1284int line6_pod_init(struct usb_interface *interface, struct usb_line6_pod *pod)
1285{
1286 int err = pod_try_init(interface, pod);
1287
1288 if (err < 0)
1289 pod_destruct(interface);
1290
1291 return err;
1292}
1293
1294
1295
1296
1297void line6_pod_disconnect(struct usb_interface *interface)
1298{
1299 struct usb_line6_pod *pod;
1300
1301 if (interface == NULL)
1302 return;
1303 pod = usb_get_intfdata(interface);
1304
1305 if (pod != NULL) {
1306 struct snd_line6_pcm *line6pcm = pod->line6.line6pcm;
1307 struct device *dev = &interface->dev;
1308
1309 if (line6pcm != NULL)
1310 line6_pcm_disconnect(line6pcm);
1311
1312 if (dev != NULL) {
1313
1314 line6_pod_remove_files(pod->firmware_version,
1315 pod->line6.
1316 properties->device_bit, dev);
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);
1332 device_remove_file(dev,
1333 &dev_attr_retrieve_effects_setup);
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
1344#ifdef CONFIG_LINE6_USB_RAW
1345 device_remove_file(dev, &dev_attr_raw);
1346#endif
1347 }
1348 }
1349
1350 pod_destruct(interface);
1351}
1352