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 dev_dbg(pod->line6.ifcdev,
256 "unknown dump code %02X\n",
257 pod->dumpreq.in_progress);
260 line6_dump_finished(&pod->dumpreq);
263 dev_dbg(pod->line6.ifcdev,
264 "wrong size of channel dump message (%d instead of %d)\n",
265 pod->line6.message_length,
266 (int)sizeof(pod->prog_data) +
271 case POD_SYSEX_SYSTEM:{
273 ((int)buf[7] << 12) | ((int)buf[8]
275 ((int)buf[9] << 4) | (int)buf[10];
277 #define PROCESS_SYSTEM_PARAM(x) \
279 pod->x.value = value; \
280 wake_up(&pod->x.wait); \
286 PROCESS_SYSTEM_PARAM(routing);
296 #undef PROCESS_SYSTEM_PARAM
299 dev_dbg(pod->line6.ifcdev,
300 "unknown tuner/system response %02X\n",
307 case POD_SYSEX_FINISH:
308 /* do we need to respond to this? */
312 pod_save_button_pressed(pod, buf[6], buf[7]);
316 dev_dbg(pod->line6.ifcdev, "audio clipped\n");
317 pod->clipping.value = 1;
318 wake_up(&pod->clipping.wait);
321 case POD_SYSEX_STORE:
322 dev_dbg(pod->line6.ifcdev,
323 "message %02X not yet implemented\n",
328 dev_dbg(pod->line6.ifcdev,
329 "unknown sysex message %02X\n",
334 (buf, pod_version_header,
335 sizeof(pod_version_header)) == 0) {
336 pod->firmware_version =
337 buf[13] * 100 + buf[14] * 10 + buf[15];
339 ((int)buf[8] << 16) | ((int)buf[9] << 8) | (int)
343 dev_dbg(pod->line6.ifcdev, "unknown sysex header\n");
347 case LINE6_SYSEX_END:
351 dev_dbg(pod->line6.ifcdev, "POD: unknown message %02X\n",
357 Detect some cases that require a channel dump after sending a command to the
358 device. Important notes:
359 *) The actual dump request can not be sent here since we are not allowed to
360 wait for the completion of the first message in this context, and sending
361 the dump request before completion of the previous message leaves the POD
362 in an undefined state. The dump request will be sent when the echoed
363 commands are received.
364 *) This method fails if a param change message is "chopped" after the first
367 void line6_pod_midi_postprocess(struct usb_line6_pod *pod, unsigned char *data,
372 if (!pod->midi_postprocess)
375 for (i = 0; i < length; ++i) {
376 if (data[i] == (LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST)) {
377 line6_invalidate_current(&pod->dumpreq);
380 if ((data[i] == (LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST))
382 if ((data[i + 1] == POD_amp_model_setup)
383 || (data[i + 1] == POD_effect_setup)) {
384 line6_invalidate_current(&pod->dumpreq);
391 Send channel number (i.e., switch to a different sound).
393 static void pod_send_channel(struct usb_line6_pod *pod, u8 value)
395 line6_invalidate_current(&pod->dumpreq);
397 if (line6_send_program(&pod->line6, value) == 0)
398 pod->channel_num = value;
400 line6_dump_finished(&pod->dumpreq);
404 Transmit PODxt Pro control parameter.
406 void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param,
409 if (line6_transmit_parameter(&pod->line6, param, value) == 0)
410 pod_store_parameter(pod, param, value);
412 if ((param == POD_amp_model_setup) || (param == POD_effect_setup)) /* these also affect other settings */
413 line6_invalidate_current(&pod->dumpreq);
417 Resolve value to memory location.
419 static int pod_resolve(const char *buf, short block0, short block1,
420 unsigned char *location)
426 ret = kstrtou8(buf, 10, &value);
430 block = (value < 0x40) ? block0 : block1;
432 location[0] = block >> 7;
433 location[1] = value | (block & 0x7f);
438 Send command to store channel/effects setup/amp setup to PODxt Pro.
440 static ssize_t pod_send_store_command(struct device *dev, const char *buf,
441 size_t count, short block0, short block1)
443 struct usb_interface *interface = to_usb_interface(dev);
444 struct usb_line6_pod *pod = usb_get_intfdata(interface);
446 int size = 3 + sizeof(pod->prog_data_buf);
447 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_STORE, size);
452 sysex[SYSEX_DATA_OFS] = 5; /* see pod_dump() */
453 ret = pod_resolve(buf, block0, block1, sysex + SYSEX_DATA_OFS + 1);
459 memcpy(sysex + SYSEX_DATA_OFS + 3, &pod->prog_data_buf,
460 sizeof(pod->prog_data_buf));
462 line6_send_sysex_message(&pod->line6, sysex, size);
464 /* needs some delay here on AMD64 platform */
469 Send command to retrieve channel/effects setup/amp setup to PODxt Pro.
471 static ssize_t pod_send_retrieve_command(struct device *dev, const char *buf,
472 size_t count, short block0,
475 struct usb_interface *interface = to_usb_interface(dev);
476 struct usb_line6_pod *pod = usb_get_intfdata(interface);
479 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_DUMPMEM, size);
484 ret = pod_resolve(buf, block0, block1, sysex + SYSEX_DATA_OFS);
489 sysex[SYSEX_DATA_OFS + 2] = 0;
490 sysex[SYSEX_DATA_OFS + 3] = 0;
491 line6_dump_started(&pod->dumpreq, POD_DUMP_MEMORY);
493 if (line6_send_sysex_message(&pod->line6, sysex, size) < size)
494 line6_dump_finished(&pod->dumpreq);
497 /* needs some delay here on AMD64 platform */
502 Generic get name function.
504 static ssize_t get_name_generic(struct usb_line6_pod *pod, const char *str,
510 char *last_non_space = buf;
512 int retval = line6_dump_wait_interruptible(&pod->dumpreq);
516 for (p1 = str, p2 = buf; *p1; ++p1, ++p2) {
520 if (++length == POD_NAME_LENGTH)
524 *(last_non_space + 1) = '\n';
525 return last_non_space - buf + 2;
529 "read" request on "channel" special file.
531 static ssize_t pod_get_channel(struct device *dev,
532 struct device_attribute *attr, char *buf)
534 struct usb_interface *interface = to_usb_interface(dev);
535 struct usb_line6_pod *pod = usb_get_intfdata(interface);
536 return sprintf(buf, "%d\n", pod->channel_num);
540 "write" request on "channel" special file.
542 static ssize_t pod_set_channel(struct device *dev,
543 struct device_attribute *attr,
544 const char *buf, size_t count)
546 struct usb_interface *interface = to_usb_interface(dev);
547 struct usb_line6_pod *pod = usb_get_intfdata(interface);
551 ret = kstrtou8(buf, 10, &value);
555 pod_send_channel(pod, value);
560 "read" request on "name" special file.
562 static ssize_t pod_get_name(struct device *dev, struct device_attribute *attr,
565 struct usb_interface *interface = to_usb_interface(dev);
566 struct usb_line6_pod *pod = usb_get_intfdata(interface);
567 return get_name_generic(pod, pod->prog_data.header + POD_NAME_OFFSET,
572 "read" request on "name" special file.
574 static ssize_t pod_get_name_buf(struct device *dev,
575 struct device_attribute *attr, char *buf)
577 struct usb_interface *interface = to_usb_interface(dev);
578 struct usb_line6_pod *pod = usb_get_intfdata(interface);
579 return get_name_generic(pod,
580 pod->prog_data_buf.header + POD_NAME_OFFSET,
585 "read" request on "dump" special file.
587 static ssize_t pod_get_dump(struct device *dev, struct device_attribute *attr,
590 struct usb_interface *interface = to_usb_interface(dev);
591 struct usb_line6_pod *pod = usb_get_intfdata(interface);
592 int retval = line6_dump_wait_interruptible(&pod->dumpreq);
595 memcpy(buf, &pod->prog_data, sizeof(pod->prog_data));
596 return sizeof(pod->prog_data);
600 "write" request on "dump" special file.
602 static ssize_t pod_set_dump(struct device *dev, struct device_attribute *attr,
603 const char *buf, size_t count)
605 struct usb_interface *interface = to_usb_interface(dev);
606 struct usb_line6_pod *pod = usb_get_intfdata(interface);
608 if (count != sizeof(pod->prog_data)) {
609 dev_err(pod->line6.ifcdev,
610 "data block must be exactly %d bytes\n",
611 (int)sizeof(pod->prog_data));
616 return sizeof(pod->prog_data);
620 Identify system parameters related to the tuner.
622 static bool pod_is_tuner(int code)
625 (code == POD_tuner_mute) ||
626 (code == POD_tuner_freq) ||
627 (code == POD_tuner_note) || (code == POD_tuner_pitch);
631 Get system parameter (as integer).
632 @param tuner non-zero, if code refers to a tuner parameter
634 static int pod_get_system_param_int(struct usb_line6_pod *pod, int *value,
635 int code, struct ValueWait *param, int sign)
638 static const int size = 1;
641 if (((pod->prog_data.control[POD_tuner] & 0x40) == 0)
642 && pod_is_tuner(code))
645 /* send value request to device: */
646 param->value = POD_system_invalid;
647 sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEMREQ, size);
652 sysex[SYSEX_DATA_OFS] = code;
653 line6_send_sysex_message(&pod->line6, sysex, size);
656 /* wait for device to respond: */
658 wait_event_interruptible(param->wait,
659 param->value != POD_system_invalid);
664 *value = sign ? (int)(signed short)param->value : (int)(unsigned short)
667 if (*value == POD_system_invalid)
668 *value = 0; /* don't report uninitialized values */
674 Get system parameter (as string).
675 @param tuner non-zero, if code refers to a tuner parameter
677 static ssize_t pod_get_system_param_string(struct usb_line6_pod *pod, char *buf,
678 int code, struct ValueWait *param,
681 int retval, value = 0;
682 retval = pod_get_system_param_int(pod, &value, code, param, sign);
687 return sprintf(buf, "%d\n", value);
691 Send system parameter (from integer).
692 @param tuner non-zero, if code refers to a tuner parameter
694 static int pod_set_system_param_int(struct usb_line6_pod *pod, int value,
698 static const int size = 5;
700 if (((pod->prog_data.control[POD_tuner] & 0x40) == 0)
701 && pod_is_tuner(code))
704 /* send value to tuner: */
705 sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEM, size);
708 sysex[SYSEX_DATA_OFS] = code;
709 sysex[SYSEX_DATA_OFS + 1] = (value >> 12) & 0x0f;
710 sysex[SYSEX_DATA_OFS + 2] = (value >> 8) & 0x0f;
711 sysex[SYSEX_DATA_OFS + 3] = (value >> 4) & 0x0f;
712 sysex[SYSEX_DATA_OFS + 4] = (value) & 0x0f;
713 line6_send_sysex_message(&pod->line6, sysex, size);
719 Send system parameter (from string).
720 @param tuner non-zero, if code refers to a tuner parameter
722 static ssize_t pod_set_system_param_string(struct usb_line6_pod *pod,
723 const char *buf, int count, int code,
727 unsigned short value = simple_strtoul(buf, NULL, 10) & mask;
728 retval = pod_set_system_param_int(pod, value, code);
729 return (retval < 0) ? retval : count;
733 "read" request on "dump_buf" special file.
735 static ssize_t pod_get_dump_buf(struct device *dev,
736 struct device_attribute *attr, char *buf)
738 struct usb_interface *interface = to_usb_interface(dev);
739 struct usb_line6_pod *pod = usb_get_intfdata(interface);
740 int retval = line6_dump_wait_interruptible(&pod->dumpreq);
743 memcpy(buf, &pod->prog_data_buf, sizeof(pod->prog_data_buf));
744 return sizeof(pod->prog_data_buf);
748 "write" request on "dump_buf" special file.
750 static ssize_t pod_set_dump_buf(struct device *dev,
751 struct device_attribute *attr,
752 const char *buf, size_t count)
754 struct usb_interface *interface = to_usb_interface(dev);
755 struct usb_line6_pod *pod = usb_get_intfdata(interface);
757 if (count != sizeof(pod->prog_data)) {
758 dev_err(pod->line6.ifcdev,
759 "data block must be exactly %d bytes\n",
760 (int)sizeof(pod->prog_data));
764 memcpy(&pod->prog_data_buf, buf, sizeof(pod->prog_data));
765 return sizeof(pod->prog_data);
769 "write" request on "finish" special file.
771 static ssize_t pod_set_finish(struct device *dev,
772 struct device_attribute *attr,
773 const char *buf, size_t count)
775 struct usb_interface *interface = to_usb_interface(dev);
776 struct usb_line6_pod *pod = usb_get_intfdata(interface);
778 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_FINISH, size);
781 line6_send_sysex_message(&pod->line6, sysex, size);
787 "write" request on "store_channel" special file.
789 static ssize_t pod_set_store_channel(struct device *dev,
790 struct device_attribute *attr,
791 const char *buf, size_t count)
793 return pod_send_store_command(dev, buf, count, 0x0000, 0x00c0);
797 "write" request on "store_effects_setup" special file.
799 static ssize_t pod_set_store_effects_setup(struct device *dev,
800 struct device_attribute *attr,
801 const char *buf, size_t count)
803 return pod_send_store_command(dev, buf, count, 0x0080, 0x0080);
807 "write" request on "store_amp_setup" special file.
809 static ssize_t pod_set_store_amp_setup(struct device *dev,
810 struct device_attribute *attr,
811 const char *buf, size_t count)
813 return pod_send_store_command(dev, buf, count, 0x0040, 0x0100);
817 "write" request on "retrieve_channel" special file.
819 static ssize_t pod_set_retrieve_channel(struct device *dev,
820 struct device_attribute *attr,
821 const char *buf, size_t count)
823 return pod_send_retrieve_command(dev, buf, count, 0x0000, 0x00c0);
827 "write" request on "retrieve_effects_setup" special file.
829 static ssize_t pod_set_retrieve_effects_setup(struct device *dev,
830 struct device_attribute *attr,
831 const char *buf, size_t count)
833 return pod_send_retrieve_command(dev, buf, count, 0x0080, 0x0080);
837 "write" request on "retrieve_amp_setup" special file.
839 static ssize_t pod_set_retrieve_amp_setup(struct device *dev,
840 struct device_attribute *attr,
841 const char *buf, size_t count)
843 return pod_send_retrieve_command(dev, buf, count, 0x0040, 0x0100);
847 "read" request on "dirty" special file.
849 static ssize_t pod_get_dirty(struct device *dev, struct device_attribute *attr,
852 struct usb_interface *interface = to_usb_interface(dev);
853 struct usb_line6_pod *pod = usb_get_intfdata(interface);
854 buf[0] = pod->dirty ? '1' : '0';
860 "read" request on "midi_postprocess" special file.
862 static ssize_t pod_get_midi_postprocess(struct device *dev,
863 struct device_attribute *attr,
866 struct usb_interface *interface = to_usb_interface(dev);
867 struct usb_line6_pod *pod = usb_get_intfdata(interface);
868 return sprintf(buf, "%d\n", pod->midi_postprocess);
872 "write" request on "midi_postprocess" special file.
874 static ssize_t pod_set_midi_postprocess(struct device *dev,
875 struct device_attribute *attr,
876 const char *buf, size_t count)
878 struct usb_interface *interface = to_usb_interface(dev);
879 struct usb_line6_pod *pod = usb_get_intfdata(interface);
883 ret = kstrtou8(buf, 10, &value);
887 pod->midi_postprocess = value ? 1 : 0;
892 "read" request on "serial_number" special file.
894 static ssize_t pod_get_serial_number(struct device *dev,
895 struct device_attribute *attr, char *buf)
897 struct usb_interface *interface = to_usb_interface(dev);
898 struct usb_line6_pod *pod = usb_get_intfdata(interface);
899 return sprintf(buf, "%d\n", pod->serial_number);
903 "read" request on "firmware_version" special file.
905 static ssize_t pod_get_firmware_version(struct device *dev,
906 struct device_attribute *attr,
909 struct usb_interface *interface = to_usb_interface(dev);
910 struct usb_line6_pod *pod = usb_get_intfdata(interface);
911 return sprintf(buf, "%d.%02d\n", pod->firmware_version / 100,
912 pod->firmware_version % 100);
916 "read" request on "device_id" special file.
918 static ssize_t pod_get_device_id(struct device *dev,
919 struct device_attribute *attr, char *buf)
921 struct usb_interface *interface = to_usb_interface(dev);
922 struct usb_line6_pod *pod = usb_get_intfdata(interface);
923 return sprintf(buf, "%d\n", pod->device_id);
927 "read" request on "clip" special file.
929 static ssize_t pod_wait_for_clip(struct device *dev,
930 struct device_attribute *attr, char *buf)
932 struct usb_interface *interface = to_usb_interface(dev);
933 struct usb_line6_pod *pod = usb_get_intfdata(interface);
934 return wait_event_interruptible(pod->clipping.wait,
935 pod->clipping.value != 0);
939 POD startup procedure.
940 This is a sequence of functions with special requirements (e.g., must
941 not run immediately after initialization, must not run in interrupt
942 context). After the last one has finished, the device is ready to use.
945 static void pod_startup1(struct usb_line6_pod *pod)
947 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_INIT);
949 /* delay startup procedure: */
950 line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
954 static void pod_startup2(unsigned long data)
956 struct usb_line6_pod *pod = (struct usb_line6_pod *)data;
958 /* schedule another startup procedure until startup is complete: */
959 if (pod->startup_progress >= POD_STARTUP_LAST)
962 pod->startup_progress = POD_STARTUP_DUMPREQ;
963 line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
966 /* current channel dump: */
967 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
971 static void pod_startup3(struct usb_line6_pod *pod)
973 struct usb_line6 *line6 = &pod->line6;
974 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_VERSIONREQ);
976 /* request firmware version: */
977 line6_version_request_async(line6);
980 static void pod_startup4(struct usb_line6_pod *pod)
982 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_WORKQUEUE);
984 /* schedule work for global work queue: */
985 schedule_work(&pod->startup_work);
988 static void pod_startup5(struct work_struct *work)
990 struct usb_line6_pod *pod =
991 container_of(work, struct usb_line6_pod, startup_work);
992 struct usb_line6 *line6 = &pod->line6;
994 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_SETUP);
997 line6_read_serial_number(&pod->line6, &pod->serial_number);
999 /* ALSA audio interface: */
1000 line6_register_audio(line6);
1003 line6_pod_create_files(pod->firmware_version,
1004 line6->properties->device_bit, line6->ifcdev);
1007 #define POD_GET_SYSTEM_PARAM(code, sign) \
1008 static ssize_t pod_get_ ## code(struct device *dev, \
1009 struct device_attribute *attr, char *buf) \
1011 struct usb_interface *interface = to_usb_interface(dev); \
1012 struct usb_line6_pod *pod = usb_get_intfdata(interface); \
1013 return pod_get_system_param_string(pod, buf, POD_ ## code, \
1014 &pod->code, sign); \
1017 #define POD_GET_SET_SYSTEM_PARAM(code, mask, sign) \
1018 POD_GET_SYSTEM_PARAM(code, sign) \
1019 static ssize_t pod_set_ ## code(struct device *dev, \
1020 struct device_attribute *attr, \
1021 const char *buf, size_t count) \
1023 struct usb_interface *interface = to_usb_interface(dev); \
1024 struct usb_line6_pod *pod = usb_get_intfdata(interface); \
1025 return pod_set_system_param_string(pod, buf, count, POD_ ## code, mask); \
1028 POD_GET_SET_SYSTEM_PARAM(monitor_level, 0xffff, 0);
1029 POD_GET_SET_SYSTEM_PARAM(routing, 0x0003, 0);
1030 POD_GET_SET_SYSTEM_PARAM(tuner_mute, 0x0001, 0);
1031 POD_GET_SET_SYSTEM_PARAM(tuner_freq, 0xffff, 0);
1032 POD_GET_SYSTEM_PARAM(tuner_note, 1);
1033 POD_GET_SYSTEM_PARAM(tuner_pitch, 1);
1035 #undef GET_SET_SYSTEM_PARAM
1036 #undef GET_SYSTEM_PARAM
1038 /* POD special files: */
1039 static DEVICE_ATTR(channel, S_IWUSR | S_IRUGO, pod_get_channel,
1041 static DEVICE_ATTR(clip, S_IRUGO, pod_wait_for_clip, line6_nop_write);
1042 static DEVICE_ATTR(device_id, S_IRUGO, pod_get_device_id, line6_nop_write);
1043 static DEVICE_ATTR(dirty, S_IRUGO, pod_get_dirty, line6_nop_write);
1044 static DEVICE_ATTR(dump, S_IWUSR | S_IRUGO, pod_get_dump, pod_set_dump);
1045 static DEVICE_ATTR(dump_buf, S_IWUSR | S_IRUGO, pod_get_dump_buf,
1047 static DEVICE_ATTR(finish, S_IWUSR, line6_nop_read, pod_set_finish);
1048 static DEVICE_ATTR(firmware_version, S_IRUGO, pod_get_firmware_version,
1050 static DEVICE_ATTR(midi_postprocess, S_IWUSR | S_IRUGO,
1051 pod_get_midi_postprocess, pod_set_midi_postprocess);
1052 static DEVICE_ATTR(monitor_level, S_IWUSR | S_IRUGO, pod_get_monitor_level,
1053 pod_set_monitor_level);
1054 static DEVICE_ATTR(name, S_IRUGO, pod_get_name, line6_nop_write);
1055 static DEVICE_ATTR(name_buf, S_IRUGO, pod_get_name_buf, line6_nop_write);
1056 static DEVICE_ATTR(retrieve_amp_setup, S_IWUSR, line6_nop_read,
1057 pod_set_retrieve_amp_setup);
1058 static DEVICE_ATTR(retrieve_channel, S_IWUSR, line6_nop_read,
1059 pod_set_retrieve_channel);
1060 static DEVICE_ATTR(retrieve_effects_setup, S_IWUSR, line6_nop_read,
1061 pod_set_retrieve_effects_setup);
1062 static DEVICE_ATTR(routing, S_IWUSR | S_IRUGO, pod_get_routing,
1064 static DEVICE_ATTR(serial_number, S_IRUGO, pod_get_serial_number,
1066 static DEVICE_ATTR(store_amp_setup, S_IWUSR, line6_nop_read,
1067 pod_set_store_amp_setup);
1068 static DEVICE_ATTR(store_channel, S_IWUSR, line6_nop_read,
1069 pod_set_store_channel);
1070 static DEVICE_ATTR(store_effects_setup, S_IWUSR, line6_nop_read,
1071 pod_set_store_effects_setup);
1072 static DEVICE_ATTR(tuner_freq, S_IWUSR | S_IRUGO, pod_get_tuner_freq,
1073 pod_set_tuner_freq);
1074 static DEVICE_ATTR(tuner_mute, S_IWUSR | S_IRUGO, pod_get_tuner_mute,
1075 pod_set_tuner_mute);
1076 static DEVICE_ATTR(tuner_note, S_IRUGO, pod_get_tuner_note, line6_nop_write);
1077 static DEVICE_ATTR(tuner_pitch, S_IRUGO, pod_get_tuner_pitch, line6_nop_write);
1079 #ifdef CONFIG_LINE6_USB_RAW
1080 static DEVICE_ATTR(raw, S_IWUSR, line6_nop_read, line6_set_raw);
1083 /* control info callback */
1084 static int snd_pod_control_monitor_info(struct snd_kcontrol *kcontrol,
1085 struct snd_ctl_elem_info *uinfo)
1087 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1089 uinfo->value.integer.min = 0;
1090 uinfo->value.integer.max = 65535;
1094 /* control get callback */
1095 static int snd_pod_control_monitor_get(struct snd_kcontrol *kcontrol,
1096 struct snd_ctl_elem_value *ucontrol)
1098 struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
1099 struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
1100 ucontrol->value.integer.value[0] = pod->monitor_level.value;
1104 /* control put callback */
1105 static int snd_pod_control_monitor_put(struct snd_kcontrol *kcontrol,
1106 struct snd_ctl_elem_value *ucontrol)
1108 struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
1109 struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
1111 if (ucontrol->value.integer.value[0] == pod->monitor_level.value)
1114 pod->monitor_level.value = ucontrol->value.integer.value[0];
1115 pod_set_system_param_int(pod, ucontrol->value.integer.value[0],
1120 /* control definition */
1121 static struct snd_kcontrol_new pod_control_monitor = {
1122 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1123 .name = "Monitor Playback Volume",
1125 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
1126 .info = snd_pod_control_monitor_info,
1127 .get = snd_pod_control_monitor_get,
1128 .put = snd_pod_control_monitor_put
1134 static void pod_destruct(struct usb_interface *interface)
1136 struct usb_line6_pod *pod = usb_get_intfdata(interface);
1140 line6_cleanup_audio(&pod->line6);
1142 del_timer(&pod->startup_timer);
1143 cancel_work_sync(&pod->startup_work);
1145 /* free dump request data: */
1146 line6_dumpreq_destruct(&pod->dumpreq);
1150 Create sysfs entries.
1152 static int pod_create_files2(struct device *dev)
1156 CHECK_RETURN(device_create_file(dev, &dev_attr_channel));
1157 CHECK_RETURN(device_create_file(dev, &dev_attr_clip));
1158 CHECK_RETURN(device_create_file(dev, &dev_attr_device_id));
1159 CHECK_RETURN(device_create_file(dev, &dev_attr_dirty));
1160 CHECK_RETURN(device_create_file(dev, &dev_attr_dump));
1161 CHECK_RETURN(device_create_file(dev, &dev_attr_dump_buf));
1162 CHECK_RETURN(device_create_file(dev, &dev_attr_finish));
1163 CHECK_RETURN(device_create_file(dev, &dev_attr_firmware_version));
1164 CHECK_RETURN(device_create_file(dev, &dev_attr_midi_postprocess));
1165 CHECK_RETURN(device_create_file(dev, &dev_attr_monitor_level));
1166 CHECK_RETURN(device_create_file(dev, &dev_attr_name));
1167 CHECK_RETURN(device_create_file(dev, &dev_attr_name_buf));
1168 CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_amp_setup));
1169 CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_channel));
1170 CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_effects_setup));
1171 CHECK_RETURN(device_create_file(dev, &dev_attr_routing));
1172 CHECK_RETURN(device_create_file(dev, &dev_attr_serial_number));
1173 CHECK_RETURN(device_create_file(dev, &dev_attr_store_amp_setup));
1174 CHECK_RETURN(device_create_file(dev, &dev_attr_store_channel));
1175 CHECK_RETURN(device_create_file(dev, &dev_attr_store_effects_setup));
1176 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_freq));
1177 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_mute));
1178 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_note));
1179 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_pitch));
1181 #ifdef CONFIG_LINE6_USB_RAW
1182 CHECK_RETURN(device_create_file(dev, &dev_attr_raw));
1189 Try to init POD device.
1191 static int pod_try_init(struct usb_interface *interface,
1192 struct usb_line6_pod *pod)
1195 struct usb_line6 *line6 = &pod->line6;
1197 init_timer(&pod->startup_timer);
1198 INIT_WORK(&pod->startup_work, pod_startup5);
1200 if ((interface == NULL) || (pod == NULL))
1203 pod->channel_num = 255;
1205 /* initialize wait queues: */
1206 init_waitqueue_head(&pod->monitor_level.wait);
1207 init_waitqueue_head(&pod->routing.wait);
1208 init_waitqueue_head(&pod->tuner_mute.wait);
1209 init_waitqueue_head(&pod->tuner_freq.wait);
1210 init_waitqueue_head(&pod->tuner_note.wait);
1211 init_waitqueue_head(&pod->tuner_pitch.wait);
1212 init_waitqueue_head(&pod->clipping.wait);
1214 memset(pod->param_dirty, 0xff, sizeof(pod->param_dirty));
1216 /* initialize USB buffers: */
1217 err = line6_dumpreq_init(&pod->dumpreq, pod_request_channel,
1218 sizeof(pod_request_channel));
1220 dev_err(&interface->dev, "Out of memory\n");
1224 /* create sysfs entries: */
1225 err = pod_create_files2(&interface->dev);
1229 /* initialize audio system: */
1230 err = line6_init_audio(line6);
1234 /* initialize MIDI subsystem: */
1235 err = line6_init_midi(line6);
1239 /* initialize PCM subsystem: */
1240 err = line6_init_pcm(line6, &pod_pcm_properties);
1244 /* register monitor control: */
1245 err = snd_ctl_add(line6->card,
1246 snd_ctl_new1(&pod_control_monitor, line6->line6pcm));
1251 When the sound card is registered at this point, the PODxt Live
1252 displays "Invalid Code Error 07", so we do it later in the event
1256 if (pod->line6.properties->capabilities & LINE6_BIT_CONTROL) {
1257 pod->monitor_level.value = POD_system_invalid;
1259 /* initiate startup procedure: */
1267 Init POD device (and clean up in case of failure).
1269 int line6_pod_init(struct usb_interface *interface, struct usb_line6_pod *pod)
1271 int err = pod_try_init(interface, pod);
1274 pod_destruct(interface);
1280 POD device disconnected.
1282 void line6_pod_disconnect(struct usb_interface *interface)
1284 struct usb_line6_pod *pod;
1286 if (interface == NULL)
1288 pod = usb_get_intfdata(interface);
1291 struct snd_line6_pcm *line6pcm = pod->line6.line6pcm;
1292 struct device *dev = &interface->dev;
1294 if (line6pcm != NULL)
1295 line6_pcm_disconnect(line6pcm);
1298 /* remove sysfs entries: */
1299 line6_pod_remove_files(pod->firmware_version,
1301 properties->device_bit, dev);
1303 device_remove_file(dev, &dev_attr_channel);
1304 device_remove_file(dev, &dev_attr_clip);
1305 device_remove_file(dev, &dev_attr_device_id);
1306 device_remove_file(dev, &dev_attr_dirty);
1307 device_remove_file(dev, &dev_attr_dump);
1308 device_remove_file(dev, &dev_attr_dump_buf);
1309 device_remove_file(dev, &dev_attr_finish);
1310 device_remove_file(dev, &dev_attr_firmware_version);
1311 device_remove_file(dev, &dev_attr_midi_postprocess);
1312 device_remove_file(dev, &dev_attr_monitor_level);
1313 device_remove_file(dev, &dev_attr_name);
1314 device_remove_file(dev, &dev_attr_name_buf);
1315 device_remove_file(dev, &dev_attr_retrieve_amp_setup);
1316 device_remove_file(dev, &dev_attr_retrieve_channel);
1317 device_remove_file(dev,
1318 &dev_attr_retrieve_effects_setup);
1319 device_remove_file(dev, &dev_attr_routing);
1320 device_remove_file(dev, &dev_attr_serial_number);
1321 device_remove_file(dev, &dev_attr_store_amp_setup);
1322 device_remove_file(dev, &dev_attr_store_channel);
1323 device_remove_file(dev, &dev_attr_store_effects_setup);
1324 device_remove_file(dev, &dev_attr_tuner_freq);
1325 device_remove_file(dev, &dev_attr_tuner_mute);
1326 device_remove_file(dev, &dev_attr_tuner_note);
1327 device_remove_file(dev, &dev_attr_tuner_pitch);
1329 #ifdef CONFIG_LINE6_USB_RAW
1330 device_remove_file(dev, &dev_attr_raw);
1335 pod_destruct(interface);