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_SAVE = 0x24,
30 POD_SYSEX_SYSTEM = 0x56,
31 POD_SYSEX_SYSTEMREQ = 0x57,
32 /* POD_SYSEX_UPDATE = 0x6c, */ /* software update! */
33 POD_SYSEX_STORE = 0x71,
34 POD_SYSEX_FINISH = 0x72,
35 POD_SYSEX_DUMPMEM = 0x73,
36 POD_SYSEX_DUMP = 0x74,
37 POD_SYSEX_DUMPREQ = 0x75
38 /* POD_SYSEX_DUMPMEM2 = 0x76 */ /* dumps entire internal memory of PODxt Pro */
42 POD_monitor_level = 0x04,
44 POD_tuner_mute = 0x13,
45 POD_tuner_freq = 0x15,
46 POD_tuner_note = 0x16,
47 POD_tuner_pitch = 0x17,
48 POD_system_invalid = 0x10000
65 static struct snd_ratden pod_ratden = {
72 static struct line6_pcm_properties pod_pcm_properties = {
73 .snd_line6_playback_hw = {
74 .info = (SNDRV_PCM_INFO_MMAP |
75 SNDRV_PCM_INFO_INTERLEAVED |
76 SNDRV_PCM_INFO_BLOCK_TRANSFER |
77 SNDRV_PCM_INFO_MMAP_VALID |
78 SNDRV_PCM_INFO_PAUSE |
80 SNDRV_PCM_INFO_RESUME |
82 SNDRV_PCM_INFO_SYNC_START),
83 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
84 .rates = SNDRV_PCM_RATE_KNOT,
89 .buffer_bytes_max = 60000,
90 .period_bytes_min = 64,
91 .period_bytes_max = 8192,
94 .snd_line6_capture_hw = {
95 .info = (SNDRV_PCM_INFO_MMAP |
96 SNDRV_PCM_INFO_INTERLEAVED |
97 SNDRV_PCM_INFO_BLOCK_TRANSFER |
98 SNDRV_PCM_INFO_MMAP_VALID |
100 SNDRV_PCM_INFO_RESUME |
102 SNDRV_PCM_INFO_SYNC_START),
103 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
104 .rates = SNDRV_PCM_RATE_KNOT,
109 .buffer_bytes_max = 60000,
110 .period_bytes_min = 64,
111 .period_bytes_max = 8192,
113 .periods_max = 1024},
116 .rats = &pod_ratden},
117 .bytes_per_frame = POD_BYTES_PER_FRAME
120 static const char pod_request_channel[] = {
121 0xf0, 0x00, 0x01, 0x0c, 0x03, 0x75, 0xf7
124 static const char pod_version_header[] = {
125 0xf2, 0x7e, 0x7f, 0x06, 0x02
128 /* forward declarations: */
129 static void pod_startup2(unsigned long data);
130 static void pod_startup3(struct usb_line6_pod *pod);
131 static void pod_startup4(struct usb_line6_pod *pod);
133 static char *pod_alloc_sysex_buffer(struct usb_line6_pod *pod, int code,
136 return line6_alloc_sysex_buffer(&pod->line6, POD_SYSEX_CODE, code,
141 Store parameter value in driver memory.
143 static void pod_store_parameter(struct usb_line6_pod *pod, int param, int value)
145 pod->prog_data.control[param] = value;
151 static void pod_save_button_pressed(struct usb_line6_pod *pod, int type,
154 set_bit(POD_SAVE_PRESSED, &pod->atomic_flags);
158 Process a completely received message.
160 void line6_pod_process_message(struct usb_line6_pod *pod)
162 const unsigned char *buf = pod->line6.buffer_message;
164 /* filter messages by type */
165 switch (buf[0] & 0xf0) {
166 case LINE6_PARAM_CHANGE:
167 case LINE6_PROGRAM_CHANGE:
168 case LINE6_SYSEX_BEGIN:
169 break; /* handle these further down */
172 return; /* ignore all others */
175 /* process all remaining messages */
177 case LINE6_PARAM_CHANGE | LINE6_CHANNEL_DEVICE:
178 pod_store_parameter(pod, buf[1], buf[2]);
179 /* intentionally no break here! */
181 case LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST:
182 if ((buf[1] == POD_amp_model_setup) ||
183 (buf[1] == POD_effect_setup))
184 /* these also affect other settings */
185 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
190 case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_DEVICE:
191 case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST:
192 set_bit(POD_CHANNEL_DIRTY, &pod->atomic_flags);
193 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
197 case LINE6_SYSEX_BEGIN | LINE6_CHANNEL_DEVICE:
198 case LINE6_SYSEX_BEGIN | LINE6_CHANNEL_UNKNOWN:
199 if (memcmp(buf + 1, line6_midi_id, sizeof(line6_midi_id)) == 0) {
202 if (pod->line6.message_length ==
203 sizeof(pod->prog_data) + 7) {
204 switch (pod->dumpreq.in_progress) {
205 case LINE6_DUMP_CURRENT:
206 memcpy(&pod->prog_data, buf + 7,
207 sizeof(pod->prog_data));
210 case POD_DUMP_MEMORY:
211 memcpy(&pod->prog_data_buf,
214 (pod->prog_data_buf));
218 dev_dbg(pod->line6.ifcdev,
219 "unknown dump code %02X\n",
220 pod->dumpreq.in_progress);
223 line6_dump_finished(&pod->dumpreq);
226 dev_dbg(pod->line6.ifcdev,
227 "wrong size of channel dump message (%d instead of %d)\n",
228 pod->line6.message_length,
229 (int)sizeof(pod->prog_data) +
234 case POD_SYSEX_SYSTEM:{
236 ((int)buf[7] << 12) | ((int)buf[8]
238 ((int)buf[9] << 4) | (int)buf[10];
240 #define PROCESS_SYSTEM_PARAM(x) \
242 pod->x.value = value; \
243 wake_up(&pod->x.wait); \
247 case POD_monitor_level:
248 pod->monitor_level = value;
251 PROCESS_SYSTEM_PARAM(routing);
261 #undef PROCESS_SYSTEM_PARAM
264 dev_dbg(pod->line6.ifcdev,
265 "unknown tuner/system response %02X\n",
272 case POD_SYSEX_FINISH:
273 /* do we need to respond to this? */
277 pod_save_button_pressed(pod, buf[6], buf[7]);
280 case POD_SYSEX_STORE:
281 dev_dbg(pod->line6.ifcdev,
282 "message %02X not yet implemented\n",
287 dev_dbg(pod->line6.ifcdev,
288 "unknown sysex message %02X\n",
293 (buf, pod_version_header,
294 sizeof(pod_version_header)) == 0) {
295 pod->firmware_version =
296 buf[13] * 100 + buf[14] * 10 + buf[15];
298 ((int)buf[8] << 16) | ((int)buf[9] << 8) | (int)
302 dev_dbg(pod->line6.ifcdev, "unknown sysex header\n");
306 case LINE6_SYSEX_END:
310 dev_dbg(pod->line6.ifcdev, "POD: unknown message %02X\n",
316 Detect some cases that require a channel dump after sending a command to the
317 device. Important notes:
318 *) The actual dump request can not be sent here since we are not allowed to
319 wait for the completion of the first message in this context, and sending
320 the dump request before completion of the previous message leaves the POD
321 in an undefined state. The dump request will be sent when the echoed
322 commands are received.
323 *) This method fails if a param change message is "chopped" after the first
326 void line6_pod_midi_postprocess(struct usb_line6_pod *pod, unsigned char *data,
331 if (!pod->midi_postprocess)
334 for (i = 0; i < length; ++i) {
335 if (data[i] == (LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST)) {
336 line6_invalidate_current(&pod->dumpreq);
339 if ((data[i] == (LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST))
341 if ((data[i + 1] == POD_amp_model_setup)
342 || (data[i + 1] == POD_effect_setup)) {
343 line6_invalidate_current(&pod->dumpreq);
350 Transmit PODxt Pro control parameter.
352 void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param,
355 if (line6_transmit_parameter(&pod->line6, param, value) == 0)
356 pod_store_parameter(pod, param, value);
358 if ((param == POD_amp_model_setup) || (param == POD_effect_setup)) /* these also affect other settings */
359 line6_invalidate_current(&pod->dumpreq);
363 Resolve value to memory location.
365 static int pod_resolve(const char *buf, short block0, short block1,
366 unsigned char *location)
372 ret = kstrtou8(buf, 10, &value);
376 block = (value < 0x40) ? block0 : block1;
378 location[0] = block >> 7;
379 location[1] = value | (block & 0x7f);
384 Send command to store channel/effects setup/amp setup to PODxt Pro.
386 static ssize_t pod_send_store_command(struct device *dev, const char *buf,
387 size_t count, short block0, short block1)
389 struct usb_interface *interface = to_usb_interface(dev);
390 struct usb_line6_pod *pod = usb_get_intfdata(interface);
392 int size = 3 + sizeof(pod->prog_data_buf);
393 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_STORE, size);
398 /* Don't know what this is good for, but PODxt Pro transmits it, so we
400 sysex[SYSEX_DATA_OFS] = 5;
401 ret = pod_resolve(buf, block0, block1, sysex + SYSEX_DATA_OFS + 1);
407 memcpy(sysex + SYSEX_DATA_OFS + 3, &pod->prog_data_buf,
408 sizeof(pod->prog_data_buf));
410 line6_send_sysex_message(&pod->line6, sysex, size);
412 /* needs some delay here on AMD64 platform */
417 Send command to retrieve channel/effects setup/amp setup to PODxt Pro.
419 static ssize_t pod_send_retrieve_command(struct device *dev, const char *buf,
420 size_t count, short block0,
423 struct usb_interface *interface = to_usb_interface(dev);
424 struct usb_line6_pod *pod = usb_get_intfdata(interface);
427 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_DUMPMEM, size);
432 ret = pod_resolve(buf, block0, block1, sysex + SYSEX_DATA_OFS);
437 sysex[SYSEX_DATA_OFS + 2] = 0;
438 sysex[SYSEX_DATA_OFS + 3] = 0;
439 line6_dump_started(&pod->dumpreq, POD_DUMP_MEMORY);
441 if (line6_send_sysex_message(&pod->line6, sysex, size) < size)
442 line6_dump_finished(&pod->dumpreq);
445 /* needs some delay here on AMD64 platform */
450 Generic get name function.
452 static ssize_t get_name_generic(struct usb_line6_pod *pod, const char *str,
458 char *last_non_space = buf;
460 int retval = line6_dump_wait_interruptible(&pod->dumpreq);
464 for (p1 = str, p2 = buf; *p1; ++p1, ++p2) {
468 if (++length == POD_NAME_LENGTH)
472 *(last_non_space + 1) = '\n';
473 return last_non_space - buf + 2;
477 "read" request on "name" special file.
479 static ssize_t pod_get_name(struct device *dev, struct device_attribute *attr,
482 struct usb_interface *interface = to_usb_interface(dev);
483 struct usb_line6_pod *pod = usb_get_intfdata(interface);
484 return get_name_generic(pod, pod->prog_data.header + POD_NAME_OFFSET,
489 "read" request on "name" special file.
491 static ssize_t pod_get_name_buf(struct device *dev,
492 struct device_attribute *attr, char *buf)
494 struct usb_interface *interface = to_usb_interface(dev);
495 struct usb_line6_pod *pod = usb_get_intfdata(interface);
496 return get_name_generic(pod,
497 pod->prog_data_buf.header + POD_NAME_OFFSET,
502 Identify system parameters related to the tuner.
504 static bool pod_is_tuner(int code)
507 (code == POD_tuner_mute) ||
508 (code == POD_tuner_freq) ||
509 (code == POD_tuner_note) || (code == POD_tuner_pitch);
513 Get system parameter (as integer).
514 @param tuner non-zero, if code refers to a tuner parameter
516 static int pod_get_system_param_int(struct usb_line6_pod *pod, int *value,
517 int code, struct ValueWait *param, int sign)
520 static const int size = 1;
523 if (((pod->prog_data.control[POD_tuner] & 0x40) == 0)
524 && pod_is_tuner(code))
527 /* send value request to device: */
528 param->value = POD_system_invalid;
529 sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEMREQ, size);
534 sysex[SYSEX_DATA_OFS] = code;
535 line6_send_sysex_message(&pod->line6, sysex, size);
538 /* wait for device to respond: */
540 wait_event_interruptible(param->wait,
541 param->value != POD_system_invalid);
546 *value = sign ? (int)(signed short)param->value : (int)(unsigned short)
549 if (*value == POD_system_invalid)
550 *value = 0; /* don't report uninitialized values */
556 Get system parameter (as string).
557 @param tuner non-zero, if code refers to a tuner parameter
559 static ssize_t pod_get_system_param_string(struct usb_line6_pod *pod, char *buf,
560 int code, struct ValueWait *param,
563 int retval, value = 0;
564 retval = pod_get_system_param_int(pod, &value, code, param, sign);
569 return sprintf(buf, "%d\n", value);
573 Send system parameter (from integer).
574 @param tuner non-zero, if code refers to a tuner parameter
576 static int pod_set_system_param_int(struct usb_line6_pod *pod, int value,
580 static const int size = 5;
582 if (((pod->prog_data.control[POD_tuner] & 0x40) == 0)
583 && pod_is_tuner(code))
586 /* send value to tuner: */
587 sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEM, size);
590 sysex[SYSEX_DATA_OFS] = code;
591 sysex[SYSEX_DATA_OFS + 1] = (value >> 12) & 0x0f;
592 sysex[SYSEX_DATA_OFS + 2] = (value >> 8) & 0x0f;
593 sysex[SYSEX_DATA_OFS + 3] = (value >> 4) & 0x0f;
594 sysex[SYSEX_DATA_OFS + 4] = (value) & 0x0f;
595 line6_send_sysex_message(&pod->line6, sysex, size);
601 Send system parameter (from string).
602 @param tuner non-zero, if code refers to a tuner parameter
604 static ssize_t pod_set_system_param_string(struct usb_line6_pod *pod,
605 const char *buf, int count, int code,
609 unsigned short value = simple_strtoul(buf, NULL, 10) & mask;
610 retval = pod_set_system_param_int(pod, value, code);
611 return (retval < 0) ? retval : count;
615 "write" request on "finish" special file.
617 static ssize_t pod_set_finish(struct device *dev,
618 struct device_attribute *attr,
619 const char *buf, size_t count)
621 struct usb_interface *interface = to_usb_interface(dev);
622 struct usb_line6_pod *pod = usb_get_intfdata(interface);
624 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_FINISH, size);
627 line6_send_sysex_message(&pod->line6, sysex, size);
633 "write" request on "store_channel" special file.
635 static ssize_t pod_set_store_channel(struct device *dev,
636 struct device_attribute *attr,
637 const char *buf, size_t count)
639 return pod_send_store_command(dev, buf, count, 0x0000, 0x00c0);
643 "write" request on "store_effects_setup" special file.
645 static ssize_t pod_set_store_effects_setup(struct device *dev,
646 struct device_attribute *attr,
647 const char *buf, size_t count)
649 return pod_send_store_command(dev, buf, count, 0x0080, 0x0080);
653 "write" request on "store_amp_setup" special file.
655 static ssize_t pod_set_store_amp_setup(struct device *dev,
656 struct device_attribute *attr,
657 const char *buf, size_t count)
659 return pod_send_store_command(dev, buf, count, 0x0040, 0x0100);
663 "write" request on "retrieve_channel" special file.
665 static ssize_t pod_set_retrieve_channel(struct device *dev,
666 struct device_attribute *attr,
667 const char *buf, size_t count)
669 return pod_send_retrieve_command(dev, buf, count, 0x0000, 0x00c0);
673 "write" request on "retrieve_effects_setup" special file.
675 static ssize_t pod_set_retrieve_effects_setup(struct device *dev,
676 struct device_attribute *attr,
677 const char *buf, size_t count)
679 return pod_send_retrieve_command(dev, buf, count, 0x0080, 0x0080);
683 "write" request on "retrieve_amp_setup" special file.
685 static ssize_t pod_set_retrieve_amp_setup(struct device *dev,
686 struct device_attribute *attr,
687 const char *buf, size_t count)
689 return pod_send_retrieve_command(dev, buf, count, 0x0040, 0x0100);
693 "read" request on "midi_postprocess" special file.
695 static ssize_t pod_get_midi_postprocess(struct device *dev,
696 struct device_attribute *attr,
699 struct usb_interface *interface = to_usb_interface(dev);
700 struct usb_line6_pod *pod = usb_get_intfdata(interface);
701 return sprintf(buf, "%d\n", pod->midi_postprocess);
705 "write" request on "midi_postprocess" special file.
707 static ssize_t pod_set_midi_postprocess(struct device *dev,
708 struct device_attribute *attr,
709 const char *buf, size_t count)
711 struct usb_interface *interface = to_usb_interface(dev);
712 struct usb_line6_pod *pod = usb_get_intfdata(interface);
716 ret = kstrtou8(buf, 10, &value);
720 pod->midi_postprocess = value ? 1 : 0;
725 "read" request on "serial_number" special file.
727 static ssize_t pod_get_serial_number(struct device *dev,
728 struct device_attribute *attr, char *buf)
730 struct usb_interface *interface = to_usb_interface(dev);
731 struct usb_line6_pod *pod = usb_get_intfdata(interface);
732 return sprintf(buf, "%d\n", pod->serial_number);
736 "read" request on "firmware_version" special file.
738 static ssize_t pod_get_firmware_version(struct device *dev,
739 struct device_attribute *attr,
742 struct usb_interface *interface = to_usb_interface(dev);
743 struct usb_line6_pod *pod = usb_get_intfdata(interface);
744 return sprintf(buf, "%d.%02d\n", pod->firmware_version / 100,
745 pod->firmware_version % 100);
749 "read" request on "device_id" special file.
751 static ssize_t pod_get_device_id(struct device *dev,
752 struct device_attribute *attr, char *buf)
754 struct usb_interface *interface = to_usb_interface(dev);
755 struct usb_line6_pod *pod = usb_get_intfdata(interface);
756 return sprintf(buf, "%d\n", pod->device_id);
760 POD startup procedure.
761 This is a sequence of functions with special requirements (e.g., must
762 not run immediately after initialization, must not run in interrupt
763 context). After the last one has finished, the device is ready to use.
766 static void pod_startup1(struct usb_line6_pod *pod)
768 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_INIT);
770 /* delay startup procedure: */
771 line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
775 static void pod_startup2(unsigned long data)
777 struct usb_line6_pod *pod = (struct usb_line6_pod *)data;
779 /* schedule another startup procedure until startup is complete: */
780 if (pod->startup_progress >= POD_STARTUP_LAST)
783 pod->startup_progress = POD_STARTUP_DUMPREQ;
784 line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
787 /* current channel dump: */
788 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
792 static void pod_startup3(struct usb_line6_pod *pod)
794 struct usb_line6 *line6 = &pod->line6;
795 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_VERSIONREQ);
797 /* request firmware version: */
798 line6_version_request_async(line6);
801 static void pod_startup4(struct usb_line6_pod *pod)
803 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_WORKQUEUE);
805 /* schedule work for global work queue: */
806 schedule_work(&pod->startup_work);
809 static void pod_startup5(struct work_struct *work)
811 struct usb_line6_pod *pod =
812 container_of(work, struct usb_line6_pod, startup_work);
813 struct usb_line6 *line6 = &pod->line6;
815 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_SETUP);
818 line6_read_serial_number(&pod->line6, &pod->serial_number);
820 /* ALSA audio interface: */
821 line6_register_audio(line6);
824 line6_pod_create_files(pod->firmware_version,
825 line6->properties->device_bit, line6->ifcdev);
828 #define POD_GET_SYSTEM_PARAM(code, sign) \
829 static ssize_t pod_get_ ## code(struct device *dev, \
830 struct device_attribute *attr, char *buf) \
832 struct usb_interface *interface = to_usb_interface(dev); \
833 struct usb_line6_pod *pod = usb_get_intfdata(interface); \
834 return pod_get_system_param_string(pod, buf, POD_ ## code, \
838 #define POD_GET_SET_SYSTEM_PARAM(code, mask, sign) \
839 POD_GET_SYSTEM_PARAM(code, sign) \
840 static ssize_t pod_set_ ## code(struct device *dev, \
841 struct device_attribute *attr, \
842 const char *buf, size_t count) \
844 struct usb_interface *interface = to_usb_interface(dev); \
845 struct usb_line6_pod *pod = usb_get_intfdata(interface); \
846 return pod_set_system_param_string(pod, buf, count, POD_ ## code, mask); \
849 POD_GET_SET_SYSTEM_PARAM(routing, 0x0003, 0);
850 POD_GET_SET_SYSTEM_PARAM(tuner_mute, 0x0001, 0);
851 POD_GET_SET_SYSTEM_PARAM(tuner_freq, 0xffff, 0);
852 POD_GET_SYSTEM_PARAM(tuner_note, 1);
853 POD_GET_SYSTEM_PARAM(tuner_pitch, 1);
855 #undef GET_SET_SYSTEM_PARAM
856 #undef GET_SYSTEM_PARAM
858 /* POD special files: */
859 static DEVICE_ATTR(device_id, S_IRUGO, pod_get_device_id, line6_nop_write);
860 static DEVICE_ATTR(finish, S_IWUSR, line6_nop_read, pod_set_finish);
861 static DEVICE_ATTR(firmware_version, S_IRUGO, pod_get_firmware_version,
863 static DEVICE_ATTR(midi_postprocess, S_IWUSR | S_IRUGO,
864 pod_get_midi_postprocess, pod_set_midi_postprocess);
865 static DEVICE_ATTR(name, S_IRUGO, pod_get_name, line6_nop_write);
866 static DEVICE_ATTR(name_buf, S_IRUGO, pod_get_name_buf, line6_nop_write);
867 static DEVICE_ATTR(retrieve_amp_setup, S_IWUSR, line6_nop_read,
868 pod_set_retrieve_amp_setup);
869 static DEVICE_ATTR(retrieve_channel, S_IWUSR, line6_nop_read,
870 pod_set_retrieve_channel);
871 static DEVICE_ATTR(retrieve_effects_setup, S_IWUSR, line6_nop_read,
872 pod_set_retrieve_effects_setup);
873 static DEVICE_ATTR(routing, S_IWUSR | S_IRUGO, pod_get_routing,
875 static DEVICE_ATTR(serial_number, S_IRUGO, pod_get_serial_number,
877 static DEVICE_ATTR(store_amp_setup, S_IWUSR, line6_nop_read,
878 pod_set_store_amp_setup);
879 static DEVICE_ATTR(store_channel, S_IWUSR, line6_nop_read,
880 pod_set_store_channel);
881 static DEVICE_ATTR(store_effects_setup, S_IWUSR, line6_nop_read,
882 pod_set_store_effects_setup);
883 static DEVICE_ATTR(tuner_freq, S_IWUSR | S_IRUGO, pod_get_tuner_freq,
885 static DEVICE_ATTR(tuner_mute, S_IWUSR | S_IRUGO, pod_get_tuner_mute,
887 static DEVICE_ATTR(tuner_note, S_IRUGO, pod_get_tuner_note, line6_nop_write);
888 static DEVICE_ATTR(tuner_pitch, S_IRUGO, pod_get_tuner_pitch, line6_nop_write);
890 #ifdef CONFIG_LINE6_USB_RAW
891 static DEVICE_ATTR(raw, S_IWUSR, line6_nop_read, line6_set_raw);
894 /* control info callback */
895 static int snd_pod_control_monitor_info(struct snd_kcontrol *kcontrol,
896 struct snd_ctl_elem_info *uinfo)
898 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
900 uinfo->value.integer.min = 0;
901 uinfo->value.integer.max = 65535;
905 /* control get callback */
906 static int snd_pod_control_monitor_get(struct snd_kcontrol *kcontrol,
907 struct snd_ctl_elem_value *ucontrol)
909 struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
910 struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
911 ucontrol->value.integer.value[0] = pod->monitor_level;
915 /* control put callback */
916 static int snd_pod_control_monitor_put(struct snd_kcontrol *kcontrol,
917 struct snd_ctl_elem_value *ucontrol)
919 struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
920 struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
922 if (ucontrol->value.integer.value[0] == pod->monitor_level)
925 pod->monitor_level = ucontrol->value.integer.value[0];
926 pod_set_system_param_int(pod, ucontrol->value.integer.value[0],
931 /* control definition */
932 static struct snd_kcontrol_new pod_control_monitor = {
933 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
934 .name = "Monitor Playback Volume",
936 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
937 .info = snd_pod_control_monitor_info,
938 .get = snd_pod_control_monitor_get,
939 .put = snd_pod_control_monitor_put
945 static void pod_destruct(struct usb_interface *interface)
947 struct usb_line6_pod *pod = usb_get_intfdata(interface);
951 line6_cleanup_audio(&pod->line6);
953 del_timer(&pod->startup_timer);
954 cancel_work_sync(&pod->startup_work);
956 /* free dump request data: */
957 line6_dumpreq_destruct(&pod->dumpreq);
961 Create sysfs entries.
963 static int pod_create_files2(struct device *dev)
967 CHECK_RETURN(device_create_file(dev, &dev_attr_device_id));
968 CHECK_RETURN(device_create_file(dev, &dev_attr_finish));
969 CHECK_RETURN(device_create_file(dev, &dev_attr_firmware_version));
970 CHECK_RETURN(device_create_file(dev, &dev_attr_midi_postprocess));
971 CHECK_RETURN(device_create_file(dev, &dev_attr_name));
972 CHECK_RETURN(device_create_file(dev, &dev_attr_name_buf));
973 CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_amp_setup));
974 CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_channel));
975 CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_effects_setup));
976 CHECK_RETURN(device_create_file(dev, &dev_attr_routing));
977 CHECK_RETURN(device_create_file(dev, &dev_attr_serial_number));
978 CHECK_RETURN(device_create_file(dev, &dev_attr_store_amp_setup));
979 CHECK_RETURN(device_create_file(dev, &dev_attr_store_channel));
980 CHECK_RETURN(device_create_file(dev, &dev_attr_store_effects_setup));
981 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_freq));
982 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_mute));
983 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_note));
984 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_pitch));
986 #ifdef CONFIG_LINE6_USB_RAW
987 CHECK_RETURN(device_create_file(dev, &dev_attr_raw));
994 Try to init POD device.
996 static int pod_try_init(struct usb_interface *interface,
997 struct usb_line6_pod *pod)
1000 struct usb_line6 *line6 = &pod->line6;
1002 init_timer(&pod->startup_timer);
1003 INIT_WORK(&pod->startup_work, pod_startup5);
1005 if ((interface == NULL) || (pod == NULL))
1008 /* initialize wait queues: */
1009 init_waitqueue_head(&pod->routing.wait);
1010 init_waitqueue_head(&pod->tuner_mute.wait);
1011 init_waitqueue_head(&pod->tuner_freq.wait);
1012 init_waitqueue_head(&pod->tuner_note.wait);
1013 init_waitqueue_head(&pod->tuner_pitch.wait);
1015 /* initialize USB buffers: */
1016 err = line6_dumpreq_init(&pod->dumpreq, pod_request_channel,
1017 sizeof(pod_request_channel));
1019 dev_err(&interface->dev, "Out of memory\n");
1023 /* create sysfs entries: */
1024 err = pod_create_files2(&interface->dev);
1028 /* initialize audio system: */
1029 err = line6_init_audio(line6);
1033 /* initialize MIDI subsystem: */
1034 err = line6_init_midi(line6);
1038 /* initialize PCM subsystem: */
1039 err = line6_init_pcm(line6, &pod_pcm_properties);
1043 /* register monitor control: */
1044 err = snd_ctl_add(line6->card,
1045 snd_ctl_new1(&pod_control_monitor, line6->line6pcm));
1050 When the sound card is registered at this point, the PODxt Live
1051 displays "Invalid Code Error 07", so we do it later in the event
1055 if (pod->line6.properties->capabilities & LINE6_BIT_CONTROL) {
1056 pod->monitor_level = POD_system_invalid;
1058 /* initiate startup procedure: */
1066 Init POD device (and clean up in case of failure).
1068 int line6_pod_init(struct usb_interface *interface, struct usb_line6_pod *pod)
1070 int err = pod_try_init(interface, pod);
1073 pod_destruct(interface);
1079 POD device disconnected.
1081 void line6_pod_disconnect(struct usb_interface *interface)
1083 struct usb_line6_pod *pod;
1085 if (interface == NULL)
1087 pod = usb_get_intfdata(interface);
1090 struct snd_line6_pcm *line6pcm = pod->line6.line6pcm;
1091 struct device *dev = &interface->dev;
1093 if (line6pcm != NULL)
1094 line6_pcm_disconnect(line6pcm);
1097 /* remove sysfs entries: */
1098 line6_pod_remove_files(pod->firmware_version,
1100 properties->device_bit, dev);
1102 device_remove_file(dev, &dev_attr_device_id);
1103 device_remove_file(dev, &dev_attr_finish);
1104 device_remove_file(dev, &dev_attr_firmware_version);
1105 device_remove_file(dev, &dev_attr_midi_postprocess);
1106 device_remove_file(dev, &dev_attr_name);
1107 device_remove_file(dev, &dev_attr_name_buf);
1108 device_remove_file(dev, &dev_attr_retrieve_amp_setup);
1109 device_remove_file(dev, &dev_attr_retrieve_channel);
1110 device_remove_file(dev,
1111 &dev_attr_retrieve_effects_setup);
1112 device_remove_file(dev, &dev_attr_routing);
1113 device_remove_file(dev, &dev_attr_serial_number);
1114 device_remove_file(dev, &dev_attr_store_amp_setup);
1115 device_remove_file(dev, &dev_attr_store_channel);
1116 device_remove_file(dev, &dev_attr_store_effects_setup);
1117 device_remove_file(dev, &dev_attr_tuner_freq);
1118 device_remove_file(dev, &dev_attr_tuner_mute);
1119 device_remove_file(dev, &dev_attr_tuner_note);
1120 device_remove_file(dev, &dev_attr_tuner_pitch);
1122 #ifdef CONFIG_LINE6_USB_RAW
1123 device_remove_file(dev, &dev_attr_raw);
1128 pod_destruct(interface);