2 * Line6 Linux USB driver - 0.9.1beta
4 * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
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.
12 #include <linux/slab.h>
13 #include <linux/wait.h>
14 #include <sound/control.h>
23 #define POD_SYSEX_CODE 3
24 #define POD_BYTES_PER_FRAME 6 /* 24bit audio (stereo) */
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 */
43 POD_monitor_level
= 0x04,
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
66 static struct snd_ratden pod_ratden
= {
73 static 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
|
81 SNDRV_PCM_INFO_RESUME
|
83 SNDRV_PCM_INFO_SYNC_START
),
84 .formats
= SNDRV_PCM_FMTBIT_S24_3LE
,
85 .rates
= SNDRV_PCM_RATE_KNOT
,
90 .buffer_bytes_max
= 60000,
91 .period_bytes_min
= 64,
92 .period_bytes_max
= 8192,
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
|
101 SNDRV_PCM_INFO_RESUME
|
103 SNDRV_PCM_INFO_SYNC_START
),
104 .formats
= SNDRV_PCM_FMTBIT_S24_3LE
,
105 .rates
= SNDRV_PCM_RATE_KNOT
,
110 .buffer_bytes_max
= 60000,
111 .period_bytes_min
= 64,
112 .period_bytes_max
= 8192,
114 .periods_max
= 1024},
117 .rats
= &pod_ratden
},
118 .bytes_per_frame
= POD_BYTES_PER_FRAME
121 static const char pod_request_channel
[] = {
122 0xf0, 0x00, 0x01, 0x0c, 0x03, 0x75, 0xf7
125 static const char pod_version_header
[] = {
126 0xf2, 0x7e, 0x7f, 0x06, 0x02
129 /* forward declarations: */
130 static void pod_startup2(unsigned long data
);
131 static void pod_startup3(struct usb_line6_pod
*pod
);
132 static void pod_startup4(struct usb_line6_pod
*pod
);
135 Mark all parameters as dirty and notify waiting processes.
137 static void pod_mark_batch_all_dirty(struct usb_line6_pod
*pod
)
141 for (i
= 0; i
< POD_CONTROL_SIZE
; i
++)
142 set_bit(i
, pod
->param_dirty
);
145 static char *pod_alloc_sysex_buffer(struct usb_line6_pod
*pod
, int code
,
148 return line6_alloc_sysex_buffer(&pod
->line6
, POD_SYSEX_CODE
, code
,
153 Send channel dump data to the PODxt Pro.
155 static void pod_dump(struct usb_line6_pod
*pod
, const unsigned char *data
)
157 int size
= 1 + sizeof(pod
->prog_data
);
158 char *sysex
= pod_alloc_sysex_buffer(pod
, POD_SYSEX_DUMP
, size
);
161 /* Don't know what this is good for, but PODxt Pro transmits it, so we
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
);
172 Store parameter value in driver memory and mark it as dirty.
174 static void pod_store_parameter(struct usb_line6_pod
*pod
, int param
, int value
)
176 pod
->prog_data
.control
[param
] = value
;
177 set_bit(param
, pod
->param_dirty
);
184 static void pod_save_button_pressed(struct usb_line6_pod
*pod
, int type
,
188 set_bit(POD_SAVE_PRESSED
, &pod
->atomic_flags
);
192 Process a completely received message.
194 void line6_pod_process_message(struct usb_line6_pod
*pod
)
196 const unsigned char *buf
= pod
->line6
.buffer_message
;
198 /* filter messages by type */
199 switch (buf
[0] & 0xf0) {
200 case LINE6_PARAM_CHANGE
:
201 case LINE6_PROGRAM_CHANGE
:
202 case LINE6_SYSEX_BEGIN
:
203 break; /* handle these further down */
206 return; /* ignore all others */
209 /* process all remaining messages */
211 case LINE6_PARAM_CHANGE
| LINE6_CHANNEL_DEVICE
:
212 pod_store_parameter(pod
, buf
[1], buf
[2]);
213 /* intentionally no break here! */
215 case LINE6_PARAM_CHANGE
| LINE6_CHANNEL_HOST
:
216 if ((buf
[1] == POD_amp_model_setup
) ||
217 (buf
[1] == POD_effect_setup
))
218 /* these also affect other settings */
219 line6_dump_request_async(&pod
->dumpreq
, &pod
->line6
, 0,
224 case LINE6_PROGRAM_CHANGE
| LINE6_CHANNEL_DEVICE
:
225 case LINE6_PROGRAM_CHANGE
| LINE6_CHANNEL_HOST
:
226 pod
->channel_num
= buf
[1];
228 set_bit(POD_CHANNEL_DIRTY
, &pod
->atomic_flags
);
229 line6_dump_request_async(&pod
->dumpreq
, &pod
->line6
, 0,
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) {
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
);
247 case POD_DUMP_MEMORY
:
248 memcpy(&pod
->prog_data_buf
,
251 (pod
->prog_data_buf
));
255 DEBUG_MESSAGES(dev_err
258 "unknown dump code %02X\n",
260 dumpreq
.in_progress
));
263 line6_dump_finished(&pod
->dumpreq
);
266 DEBUG_MESSAGES(dev_err
268 "wrong size of channel dump message (%d instead of %d)\n",
270 line6
.message_length
,
272 sizeof(pod
->prog_data
) +
277 case POD_SYSEX_SYSTEM
:{
279 ((int)buf
[7] << 12) | ((int)buf
[8]
281 ((int)buf
[9] << 4) | (int)buf
[10];
283 #define PROCESS_SYSTEM_PARAM(x) \
285 pod->x.value = value; \
286 wake_up(&pod->x.wait); \
292 PROCESS_SYSTEM_PARAM(routing
);
302 #undef PROCESS_SYSTEM_PARAM
305 DEBUG_MESSAGES(dev_err
308 "unknown tuner/system response %02X\n",
315 case POD_SYSEX_FINISH
:
316 /* do we need to respond to this? */
320 pod_save_button_pressed(pod
, buf
[6], buf
[7]);
324 DEBUG_MESSAGES(dev_err
327 pod
->clipping
.value
= 1;
328 wake_up(&pod
->clipping
.wait
);
331 case POD_SYSEX_STORE
:
332 DEBUG_MESSAGES(dev_err
334 "message %02X not yet implemented\n",
339 DEBUG_MESSAGES(dev_err
341 "unknown sysex message %02X\n",
346 (buf
, pod_version_header
,
347 sizeof(pod_version_header
)) == 0) {
348 pod
->firmware_version
=
349 buf
[13] * 100 + buf
[14] * 10 + buf
[15];
351 ((int)buf
[8] << 16) | ((int)buf
[9] << 8) | (int)
355 DEBUG_MESSAGES(dev_err
357 "unknown sysex header\n"));
361 case LINE6_SYSEX_END
:
365 DEBUG_MESSAGES(dev_err
367 "POD: unknown message %02X\n", buf
[0]));
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
382 void line6_pod_midi_postprocess(struct usb_line6_pod
*pod
, unsigned char *data
,
387 if (!pod
->midi_postprocess
)
390 for (i
= 0; i
< length
; ++i
) {
391 if (data
[i
] == (LINE6_PROGRAM_CHANGE
| LINE6_CHANNEL_HOST
)) {
392 line6_invalidate_current(&pod
->dumpreq
);
395 if ((data
[i
] == (LINE6_PARAM_CHANGE
| LINE6_CHANNEL_HOST
))
397 if ((data
[i
+ 1] == POD_amp_model_setup
)
398 || (data
[i
+ 1] == POD_effect_setup
)) {
399 line6_invalidate_current(&pod
->dumpreq
);
406 Send channel number (i.e., switch to a different sound).
408 static void pod_send_channel(struct usb_line6_pod
*pod
, int value
)
410 line6_invalidate_current(&pod
->dumpreq
);
412 if (line6_send_program(&pod
->line6
, value
) == 0)
413 pod
->channel_num
= value
;
415 line6_dump_finished(&pod
->dumpreq
);
419 Transmit PODxt Pro control parameter.
421 void line6_pod_transmit_parameter(struct usb_line6_pod
*pod
, int param
,
424 if (line6_transmit_parameter(&pod
->line6
, param
, value
) == 0)
425 pod_store_parameter(pod
, param
, value
);
427 if ((param
== POD_amp_model_setup
) || (param
== POD_effect_setup
)) /* these also affect other settings */
428 line6_invalidate_current(&pod
->dumpreq
);
432 Resolve value to memory location.
434 static int pod_resolve(const char *buf
, short block0
, short block1
,
435 unsigned char *location
)
441 ret
= strict_strtoul(buf
, 10, &value
);
445 block
= (value
< 0x40) ? block0
: block1
;
447 location
[0] = block
>> 7;
448 location
[1] = value
| (block
& 0x7f);
453 Send command to store channel/effects setup/amp setup to PODxt Pro.
455 static ssize_t
pod_send_store_command(struct device
*dev
, const char *buf
,
456 size_t count
, short block0
, short block1
)
458 struct usb_interface
*interface
= to_usb_interface(dev
);
459 struct usb_line6_pod
*pod
= usb_get_intfdata(interface
);
461 int size
= 3 + sizeof(pod
->prog_data_buf
);
462 char *sysex
= pod_alloc_sysex_buffer(pod
, POD_SYSEX_STORE
, size
);
467 sysex
[SYSEX_DATA_OFS
] = 5; /* see pod_dump() */
468 ret
= pod_resolve(buf
, block0
, block1
, sysex
+ SYSEX_DATA_OFS
+ 1);
474 memcpy(sysex
+ SYSEX_DATA_OFS
+ 3, &pod
->prog_data_buf
,
475 sizeof(pod
->prog_data_buf
));
477 line6_send_sysex_message(&pod
->line6
, sysex
, size
);
479 /* needs some delay here on AMD64 platform */
484 Send command to retrieve channel/effects setup/amp setup to PODxt Pro.
486 static ssize_t
pod_send_retrieve_command(struct device
*dev
, const char *buf
,
487 size_t count
, short block0
,
490 struct usb_interface
*interface
= to_usb_interface(dev
);
491 struct usb_line6_pod
*pod
= usb_get_intfdata(interface
);
494 char *sysex
= pod_alloc_sysex_buffer(pod
, POD_SYSEX_DUMPMEM
, size
);
499 ret
= pod_resolve(buf
, block0
, block1
, sysex
+ SYSEX_DATA_OFS
);
504 sysex
[SYSEX_DATA_OFS
+ 2] = 0;
505 sysex
[SYSEX_DATA_OFS
+ 3] = 0;
506 line6_dump_started(&pod
->dumpreq
, POD_DUMP_MEMORY
);
508 if (line6_send_sysex_message(&pod
->line6
, sysex
, size
) < size
)
509 line6_dump_finished(&pod
->dumpreq
);
512 /* needs some delay here on AMD64 platform */
517 Generic get name function.
519 static ssize_t
get_name_generic(struct usb_line6_pod
*pod
, const char *str
,
525 char *last_non_space
= buf
;
527 int retval
= line6_dump_wait_interruptible(&pod
->dumpreq
);
531 for (p1
= str
, p2
= buf
; *p1
; ++p1
, ++p2
) {
535 if (++length
== POD_NAME_LENGTH
)
539 *(last_non_space
+ 1) = '\n';
540 return last_non_space
- buf
+ 2;
544 "read" request on "channel" special file.
546 static ssize_t
pod_get_channel(struct device
*dev
,
547 struct device_attribute
*attr
, char *buf
)
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
);
555 "write" request on "channel" special file.
557 static ssize_t
pod_set_channel(struct device
*dev
,
558 struct device_attribute
*attr
,
559 const char *buf
, size_t count
)
561 struct usb_interface
*interface
= to_usb_interface(dev
);
562 struct usb_line6_pod
*pod
= usb_get_intfdata(interface
);
566 ret
= strict_strtoul(buf
, 10, &value
);
570 pod_send_channel(pod
, value
);
575 "read" request on "name" special file.
577 static ssize_t
pod_get_name(struct device
*dev
, struct device_attribute
*attr
,
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
,
587 "read" request on "name" special file.
589 static ssize_t
pod_get_name_buf(struct device
*dev
,
590 struct device_attribute
*attr
, char *buf
)
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
,
600 "read" request on "dump" special file.
602 static ssize_t
pod_get_dump(struct device
*dev
, struct device_attribute
*attr
,
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
);
610 memcpy(buf
, &pod
->prog_data
, sizeof(pod
->prog_data
));
611 return sizeof(pod
->prog_data
);
615 "write" request on "dump" special file.
617 static ssize_t
pod_set_dump(struct device
*dev
, struct device_attribute
*attr
,
618 const char *buf
, size_t count
)
620 struct usb_interface
*interface
= to_usb_interface(dev
);
621 struct usb_line6_pod
*pod
= usb_get_intfdata(interface
);
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
));
631 return sizeof(pod
->prog_data
);
635 Identify system parameters related to the tuner.
637 static bool pod_is_tuner(int code
)
640 (code
== POD_tuner_mute
) ||
641 (code
== POD_tuner_freq
) ||
642 (code
== POD_tuner_note
) || (code
== POD_tuner_pitch
);
646 Get system parameter (as integer).
647 @param tuner non-zero, if code refers to a tuner parameter
649 static int pod_get_system_param_int(struct usb_line6_pod
*pod
, int *value
,
650 int code
, struct ValueWait
*param
, int sign
)
653 static const int size
= 1;
656 if (((pod
->prog_data
.control
[POD_tuner
] & 0x40) == 0)
657 && pod_is_tuner(code
))
660 /* send value request to device: */
661 param
->value
= POD_system_invalid
;
662 sysex
= pod_alloc_sysex_buffer(pod
, POD_SYSEX_SYSTEMREQ
, size
);
667 sysex
[SYSEX_DATA_OFS
] = code
;
668 line6_send_sysex_message(&pod
->line6
, sysex
, size
);
671 /* wait for device to respond: */
673 wait_event_interruptible(param
->wait
,
674 param
->value
!= POD_system_invalid
);
679 *value
= sign
? (int)(signed short)param
->value
: (int)(unsigned short)
682 if (*value
== POD_system_invalid
)
683 *value
= 0; /* don't report uninitialized values */
689 Get system parameter (as string).
690 @param tuner non-zero, if code refers to a tuner parameter
692 static ssize_t
pod_get_system_param_string(struct usb_line6_pod
*pod
, char *buf
,
693 int code
, struct ValueWait
*param
,
696 int retval
, value
= 0;
697 retval
= pod_get_system_param_int(pod
, &value
, code
, param
, sign
);
702 return sprintf(buf
, "%d\n", value
);
706 Send system parameter (from integer).
707 @param tuner non-zero, if code refers to a tuner parameter
709 static int pod_set_system_param_int(struct usb_line6_pod
*pod
, int value
,
713 static const int size
= 5;
715 if (((pod
->prog_data
.control
[POD_tuner
] & 0x40) == 0)
716 && pod_is_tuner(code
))
719 /* send value to tuner: */
720 sysex
= pod_alloc_sysex_buffer(pod
, POD_SYSEX_SYSTEM
, size
);
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
);
734 Send system parameter (from string).
735 @param tuner non-zero, if code refers to a tuner parameter
737 static ssize_t
pod_set_system_param_string(struct usb_line6_pod
*pod
,
738 const char *buf
, int count
, int code
,
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
;
748 "read" request on "dump_buf" special file.
750 static ssize_t
pod_get_dump_buf(struct device
*dev
,
751 struct device_attribute
*attr
, char *buf
)
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
);
758 memcpy(buf
, &pod
->prog_data_buf
, sizeof(pod
->prog_data_buf
));
759 return sizeof(pod
->prog_data_buf
);
763 "write" request on "dump_buf" special file.
765 static ssize_t
pod_set_dump_buf(struct device
*dev
,
766 struct device_attribute
*attr
,
767 const char *buf
, size_t count
)
769 struct usb_interface
*interface
= to_usb_interface(dev
);
770 struct usb_line6_pod
*pod
= usb_get_intfdata(interface
);
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
));
779 memcpy(&pod
->prog_data_buf
, buf
, sizeof(pod
->prog_data
));
780 return sizeof(pod
->prog_data
);
784 "write" request on "finish" special file.
786 static ssize_t
pod_set_finish(struct device
*dev
,
787 struct device_attribute
*attr
,
788 const char *buf
, size_t count
)
790 struct usb_interface
*interface
= to_usb_interface(dev
);
791 struct usb_line6_pod
*pod
= usb_get_intfdata(interface
);
793 char *sysex
= pod_alloc_sysex_buffer(pod
, POD_SYSEX_FINISH
, size
);
796 line6_send_sysex_message(&pod
->line6
, sysex
, size
);
802 "write" request on "store_channel" special file.
804 static ssize_t
pod_set_store_channel(struct device
*dev
,
805 struct device_attribute
*attr
,
806 const char *buf
, size_t count
)
808 return pod_send_store_command(dev
, buf
, count
, 0x0000, 0x00c0);
812 "write" request on "store_effects_setup" special file.
814 static ssize_t
pod_set_store_effects_setup(struct device
*dev
,
815 struct device_attribute
*attr
,
816 const char *buf
, size_t count
)
818 return pod_send_store_command(dev
, buf
, count
, 0x0080, 0x0080);
822 "write" request on "store_amp_setup" special file.
824 static ssize_t
pod_set_store_amp_setup(struct device
*dev
,
825 struct device_attribute
*attr
,
826 const char *buf
, size_t count
)
828 return pod_send_store_command(dev
, buf
, count
, 0x0040, 0x0100);
832 "write" request on "retrieve_channel" special file.
834 static ssize_t
pod_set_retrieve_channel(struct device
*dev
,
835 struct device_attribute
*attr
,
836 const char *buf
, size_t count
)
838 return pod_send_retrieve_command(dev
, buf
, count
, 0x0000, 0x00c0);
842 "write" request on "retrieve_effects_setup" special file.
844 static ssize_t
pod_set_retrieve_effects_setup(struct device
*dev
,
845 struct device_attribute
*attr
,
846 const char *buf
, size_t count
)
848 return pod_send_retrieve_command(dev
, buf
, count
, 0x0080, 0x0080);
852 "write" request on "retrieve_amp_setup" special file.
854 static ssize_t
pod_set_retrieve_amp_setup(struct device
*dev
,
855 struct device_attribute
*attr
,
856 const char *buf
, size_t count
)
858 return pod_send_retrieve_command(dev
, buf
, count
, 0x0040, 0x0100);
862 "read" request on "dirty" special file.
864 static ssize_t
pod_get_dirty(struct device
*dev
, struct device_attribute
*attr
,
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';
875 "read" request on "midi_postprocess" special file.
877 static ssize_t
pod_get_midi_postprocess(struct device
*dev
,
878 struct device_attribute
*attr
,
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
);
887 "write" request on "midi_postprocess" special file.
889 static ssize_t
pod_set_midi_postprocess(struct device
*dev
,
890 struct device_attribute
*attr
,
891 const char *buf
, size_t count
)
893 struct usb_interface
*interface
= to_usb_interface(dev
);
894 struct usb_line6_pod
*pod
= usb_get_intfdata(interface
);
898 ret
= strict_strtoul(buf
, 10, &value
);
902 pod
->midi_postprocess
= value
? 1 : 0;
907 "read" request on "serial_number" special file.
909 static ssize_t
pod_get_serial_number(struct device
*dev
,
910 struct device_attribute
*attr
, char *buf
)
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
);
918 "read" request on "firmware_version" special file.
920 static ssize_t
pod_get_firmware_version(struct device
*dev
,
921 struct device_attribute
*attr
,
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);
931 "read" request on "device_id" special file.
933 static ssize_t
pod_get_device_id(struct device
*dev
,
934 struct device_attribute
*attr
, char *buf
)
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
);
942 "read" request on "clip" special file.
944 static ssize_t
pod_wait_for_clip(struct device
*dev
,
945 struct device_attribute
*attr
, char *buf
)
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);
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.
960 static void pod_startup1(struct usb_line6_pod
*pod
)
962 CHECK_STARTUP_PROGRESS(pod
->startup_progress
, POD_STARTUP_INIT
);
964 /* delay startup procedure: */
965 line6_start_timer(&pod
->startup_timer
, POD_STARTUP_DELAY
, pod_startup2
,
969 static void pod_startup2(unsigned long data
)
971 struct usb_line6_pod
*pod
= (struct usb_line6_pod
*)data
;
973 /* schedule another startup procedure until startup is complete: */
974 if (pod
->startup_progress
>= POD_STARTUP_LAST
)
977 pod
->startup_progress
= POD_STARTUP_DUMPREQ
;
978 line6_start_timer(&pod
->startup_timer
, POD_STARTUP_DELAY
, pod_startup2
,
981 /* current channel dump: */
982 line6_dump_request_async(&pod
->dumpreq
, &pod
->line6
, 0,
986 static void pod_startup3(struct usb_line6_pod
*pod
)
988 struct usb_line6
*line6
= &pod
->line6
;
989 CHECK_STARTUP_PROGRESS(pod
->startup_progress
, POD_STARTUP_VERSIONREQ
);
991 /* request firmware version: */
992 line6_version_request_async(line6
);
995 static void pod_startup4(struct usb_line6_pod
*pod
)
997 CHECK_STARTUP_PROGRESS(pod
->startup_progress
, POD_STARTUP_WORKQUEUE
);
999 /* schedule work for global work queue: */
1000 schedule_work(&pod
->startup_work
);
1003 static void pod_startup5(struct work_struct
*work
)
1005 struct usb_line6_pod
*pod
=
1006 container_of(work
, struct usb_line6_pod
, startup_work
);
1007 struct usb_line6
*line6
= &pod
->line6
;
1009 CHECK_STARTUP_PROGRESS(pod
->startup_progress
, POD_STARTUP_SETUP
);
1011 /* serial number: */
1012 line6_read_serial_number(&pod
->line6
, &pod
->serial_number
);
1014 /* ALSA audio interface: */
1015 line6_register_audio(line6
);
1018 line6_pod_create_files(pod
->firmware_version
,
1019 line6
->properties
->device_bit
, line6
->ifcdev
);
1022 #define POD_GET_SYSTEM_PARAM(code, sign) \
1023 static ssize_t pod_get_ ## code(struct device *dev, \
1024 struct device_attribute *attr, char *buf) \
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); \
1032 #define POD_GET_SET_SYSTEM_PARAM(code, mask, sign) \
1033 POD_GET_SYSTEM_PARAM(code, sign) \
1034 static ssize_t pod_set_ ## code(struct device *dev, \
1035 struct device_attribute *attr, \
1036 const char *buf, size_t count) \
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); \
1043 POD_GET_SET_SYSTEM_PARAM(monitor_level
, 0xffff, 0);
1044 POD_GET_SET_SYSTEM_PARAM(routing
, 0x0003, 0);
1045 POD_GET_SET_SYSTEM_PARAM(tuner_mute
, 0x0001, 0);
1046 POD_GET_SET_SYSTEM_PARAM(tuner_freq
, 0xffff, 0);
1047 POD_GET_SYSTEM_PARAM(tuner_note
, 1);
1048 POD_GET_SYSTEM_PARAM(tuner_pitch
, 1);
1050 #undef GET_SET_SYSTEM_PARAM
1051 #undef GET_SYSTEM_PARAM
1053 /* POD special files: */
1054 static DEVICE_ATTR(channel
, S_IWUSR
| S_IRUGO
, pod_get_channel
,
1056 static DEVICE_ATTR(clip
, S_IRUGO
, pod_wait_for_clip
, line6_nop_write
);
1057 static DEVICE_ATTR(device_id
, S_IRUGO
, pod_get_device_id
, line6_nop_write
);
1058 static DEVICE_ATTR(dirty
, S_IRUGO
, pod_get_dirty
, line6_nop_write
);
1059 static DEVICE_ATTR(dump
, S_IWUSR
| S_IRUGO
, pod_get_dump
, pod_set_dump
);
1060 static DEVICE_ATTR(dump_buf
, S_IWUSR
| S_IRUGO
, pod_get_dump_buf
,
1062 static DEVICE_ATTR(finish
, S_IWUSR
, line6_nop_read
, pod_set_finish
);
1063 static DEVICE_ATTR(firmware_version
, S_IRUGO
, pod_get_firmware_version
,
1065 static DEVICE_ATTR(midi_postprocess
, S_IWUSR
| S_IRUGO
,
1066 pod_get_midi_postprocess
, pod_set_midi_postprocess
);
1067 static DEVICE_ATTR(monitor_level
, S_IWUSR
| S_IRUGO
, pod_get_monitor_level
,
1068 pod_set_monitor_level
);
1069 static DEVICE_ATTR(name
, S_IRUGO
, pod_get_name
, line6_nop_write
);
1070 static DEVICE_ATTR(name_buf
, S_IRUGO
, pod_get_name_buf
, line6_nop_write
);
1071 static DEVICE_ATTR(retrieve_amp_setup
, S_IWUSR
, line6_nop_read
,
1072 pod_set_retrieve_amp_setup
);
1073 static DEVICE_ATTR(retrieve_channel
, S_IWUSR
, line6_nop_read
,
1074 pod_set_retrieve_channel
);
1075 static DEVICE_ATTR(retrieve_effects_setup
, S_IWUSR
, line6_nop_read
,
1076 pod_set_retrieve_effects_setup
);
1077 static DEVICE_ATTR(routing
, S_IWUSR
| S_IRUGO
, pod_get_routing
,
1079 static DEVICE_ATTR(serial_number
, S_IRUGO
, pod_get_serial_number
,
1081 static DEVICE_ATTR(store_amp_setup
, S_IWUSR
, line6_nop_read
,
1082 pod_set_store_amp_setup
);
1083 static DEVICE_ATTR(store_channel
, S_IWUSR
, line6_nop_read
,
1084 pod_set_store_channel
);
1085 static DEVICE_ATTR(store_effects_setup
, S_IWUSR
, line6_nop_read
,
1086 pod_set_store_effects_setup
);
1087 static DEVICE_ATTR(tuner_freq
, S_IWUSR
| S_IRUGO
, pod_get_tuner_freq
,
1088 pod_set_tuner_freq
);
1089 static DEVICE_ATTR(tuner_mute
, S_IWUSR
| S_IRUGO
, pod_get_tuner_mute
,
1090 pod_set_tuner_mute
);
1091 static DEVICE_ATTR(tuner_note
, S_IRUGO
, pod_get_tuner_note
, line6_nop_write
);
1092 static DEVICE_ATTR(tuner_pitch
, S_IRUGO
, pod_get_tuner_pitch
, line6_nop_write
);
1094 #ifdef CONFIG_LINE6_USB_RAW
1095 static DEVICE_ATTR(raw
, S_IWUSR
, line6_nop_read
, line6_set_raw
);
1098 /* control info callback */
1099 static int snd_pod_control_monitor_info(struct snd_kcontrol
*kcontrol
,
1100 struct snd_ctl_elem_info
*uinfo
)
1102 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
1104 uinfo
->value
.integer
.min
= 0;
1105 uinfo
->value
.integer
.max
= 65535;
1109 /* control get callback */
1110 static int snd_pod_control_monitor_get(struct snd_kcontrol
*kcontrol
,
1111 struct snd_ctl_elem_value
*ucontrol
)
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
;
1119 /* control put callback */
1120 static int snd_pod_control_monitor_put(struct snd_kcontrol
*kcontrol
,
1121 struct snd_ctl_elem_value
*ucontrol
)
1123 struct snd_line6_pcm
*line6pcm
= snd_kcontrol_chip(kcontrol
);
1124 struct usb_line6_pod
*pod
= (struct usb_line6_pod
*)line6pcm
->line6
;
1126 if (ucontrol
->value
.integer
.value
[0] == pod
->monitor_level
.value
)
1129 pod
->monitor_level
.value
= ucontrol
->value
.integer
.value
[0];
1130 pod_set_system_param_int(pod
, ucontrol
->value
.integer
.value
[0],
1135 /* control definition */
1136 static struct snd_kcontrol_new pod_control_monitor
= {
1137 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
1138 .name
= "Monitor Playback Volume",
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
1149 static void pod_destruct(struct usb_interface
*interface
)
1151 struct usb_line6_pod
*pod
= usb_get_intfdata(interface
);
1152 struct usb_line6
*line6
;
1156 line6
= &pod
->line6
;
1159 line6_cleanup_audio(line6
);
1161 del_timer(&pod
->startup_timer
);
1162 cancel_work_sync(&pod
->startup_work
);
1164 /* free dump request data: */
1165 line6_dumpreq_destruct(&pod
->dumpreq
);
1169 Create sysfs entries.
1171 static int pod_create_files2(struct device
*dev
)
1175 CHECK_RETURN(device_create_file(dev
, &dev_attr_channel
));
1176 CHECK_RETURN(device_create_file(dev
, &dev_attr_clip
));
1177 CHECK_RETURN(device_create_file(dev
, &dev_attr_device_id
));
1178 CHECK_RETURN(device_create_file(dev
, &dev_attr_dirty
));
1179 CHECK_RETURN(device_create_file(dev
, &dev_attr_dump
));
1180 CHECK_RETURN(device_create_file(dev
, &dev_attr_dump_buf
));
1181 CHECK_RETURN(device_create_file(dev
, &dev_attr_finish
));
1182 CHECK_RETURN(device_create_file(dev
, &dev_attr_firmware_version
));
1183 CHECK_RETURN(device_create_file(dev
, &dev_attr_midi_postprocess
));
1184 CHECK_RETURN(device_create_file(dev
, &dev_attr_monitor_level
));
1185 CHECK_RETURN(device_create_file(dev
, &dev_attr_name
));
1186 CHECK_RETURN(device_create_file(dev
, &dev_attr_name_buf
));
1187 CHECK_RETURN(device_create_file(dev
, &dev_attr_retrieve_amp_setup
));
1188 CHECK_RETURN(device_create_file(dev
, &dev_attr_retrieve_channel
));
1189 CHECK_RETURN(device_create_file(dev
, &dev_attr_retrieve_effects_setup
));
1190 CHECK_RETURN(device_create_file(dev
, &dev_attr_routing
));
1191 CHECK_RETURN(device_create_file(dev
, &dev_attr_serial_number
));
1192 CHECK_RETURN(device_create_file(dev
, &dev_attr_store_amp_setup
));
1193 CHECK_RETURN(device_create_file(dev
, &dev_attr_store_channel
));
1194 CHECK_RETURN(device_create_file(dev
, &dev_attr_store_effects_setup
));
1195 CHECK_RETURN(device_create_file(dev
, &dev_attr_tuner_freq
));
1196 CHECK_RETURN(device_create_file(dev
, &dev_attr_tuner_mute
));
1197 CHECK_RETURN(device_create_file(dev
, &dev_attr_tuner_note
));
1198 CHECK_RETURN(device_create_file(dev
, &dev_attr_tuner_pitch
));
1200 #ifdef CONFIG_LINE6_USB_RAW
1201 CHECK_RETURN(device_create_file(dev
, &dev_attr_raw
));
1208 Try to init POD device.
1210 static int pod_try_init(struct usb_interface
*interface
,
1211 struct usb_line6_pod
*pod
)
1214 struct usb_line6
*line6
= &pod
->line6
;
1216 init_timer(&pod
->startup_timer
);
1217 INIT_WORK(&pod
->startup_work
, pod_startup5
);
1219 if ((interface
== NULL
) || (pod
== NULL
))
1222 pod
->channel_num
= 255;
1224 /* initialize wait queues: */
1225 init_waitqueue_head(&pod
->monitor_level
.wait
);
1226 init_waitqueue_head(&pod
->routing
.wait
);
1227 init_waitqueue_head(&pod
->tuner_mute
.wait
);
1228 init_waitqueue_head(&pod
->tuner_freq
.wait
);
1229 init_waitqueue_head(&pod
->tuner_note
.wait
);
1230 init_waitqueue_head(&pod
->tuner_pitch
.wait
);
1231 init_waitqueue_head(&pod
->clipping
.wait
);
1233 memset(pod
->param_dirty
, 0xff, sizeof(pod
->param_dirty
));
1235 /* initialize USB buffers: */
1236 err
= line6_dumpreq_init(&pod
->dumpreq
, pod_request_channel
,
1237 sizeof(pod_request_channel
));
1239 dev_err(&interface
->dev
, "Out of memory\n");
1243 /* create sysfs entries: */
1244 err
= pod_create_files2(&interface
->dev
);
1248 /* initialize audio system: */
1249 err
= line6_init_audio(line6
);
1253 /* initialize MIDI subsystem: */
1254 err
= line6_init_midi(line6
);
1258 /* initialize PCM subsystem: */
1259 err
= line6_init_pcm(line6
, &pod_pcm_properties
);
1263 /* register monitor control: */
1264 err
= snd_ctl_add(line6
->card
,
1265 snd_ctl_new1(&pod_control_monitor
, line6
->line6pcm
));
1270 When the sound card is registered at this point, the PODxt Live
1271 displays "Invalid Code Error 07", so we do it later in the event
1275 if (pod
->line6
.properties
->capabilities
& LINE6_BIT_CONTROL
) {
1276 pod
->monitor_level
.value
= POD_system_invalid
;
1278 /* initiate startup procedure: */
1286 Init POD device (and clean up in case of failure).
1288 int line6_pod_init(struct usb_interface
*interface
, struct usb_line6_pod
*pod
)
1290 int err
= pod_try_init(interface
, pod
);
1293 pod_destruct(interface
);
1299 POD device disconnected.
1301 void line6_pod_disconnect(struct usb_interface
*interface
)
1303 struct usb_line6_pod
*pod
;
1305 if (interface
== NULL
)
1307 pod
= usb_get_intfdata(interface
);
1310 struct snd_line6_pcm
*line6pcm
= pod
->line6
.line6pcm
;
1311 struct device
*dev
= &interface
->dev
;
1313 if (line6pcm
!= NULL
)
1314 line6_pcm_disconnect(line6pcm
);
1317 /* remove sysfs entries: */
1318 line6_pod_remove_files(pod
->firmware_version
,
1320 properties
->device_bit
, dev
);
1322 device_remove_file(dev
, &dev_attr_channel
);
1323 device_remove_file(dev
, &dev_attr_clip
);
1324 device_remove_file(dev
, &dev_attr_device_id
);
1325 device_remove_file(dev
, &dev_attr_dirty
);
1326 device_remove_file(dev
, &dev_attr_dump
);
1327 device_remove_file(dev
, &dev_attr_dump_buf
);
1328 device_remove_file(dev
, &dev_attr_finish
);
1329 device_remove_file(dev
, &dev_attr_firmware_version
);
1330 device_remove_file(dev
, &dev_attr_midi_postprocess
);
1331 device_remove_file(dev
, &dev_attr_monitor_level
);
1332 device_remove_file(dev
, &dev_attr_name
);
1333 device_remove_file(dev
, &dev_attr_name_buf
);
1334 device_remove_file(dev
, &dev_attr_retrieve_amp_setup
);
1335 device_remove_file(dev
, &dev_attr_retrieve_channel
);
1336 device_remove_file(dev
,
1337 &dev_attr_retrieve_effects_setup
);
1338 device_remove_file(dev
, &dev_attr_routing
);
1339 device_remove_file(dev
, &dev_attr_serial_number
);
1340 device_remove_file(dev
, &dev_attr_store_amp_setup
);
1341 device_remove_file(dev
, &dev_attr_store_channel
);
1342 device_remove_file(dev
, &dev_attr_store_effects_setup
);
1343 device_remove_file(dev
, &dev_attr_tuner_freq
);
1344 device_remove_file(dev
, &dev_attr_tuner_mute
);
1345 device_remove_file(dev
, &dev_attr_tuner_note
);
1346 device_remove_file(dev
, &dev_attr_tuner_pitch
);
1348 #ifdef CONFIG_LINE6_USB_RAW
1349 device_remove_file(dev
, &dev_attr_raw
);
1354 pod_destruct(interface
);