xref: /openbmc/linux/sound/usb/line6/pod.c (revision aca514b8)
1 /*
2  * Line 6 Linux USB driver
3  *
4  * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
5  *
6  *	This program is free software; you can redistribute it and/or
7  *	modify it under the terms of the GNU General Public License as
8  *	published by the Free Software Foundation, version 2.
9  *
10  */
11 
12 #include <linux/slab.h>
13 #include <linux/wait.h>
14 #include <linux/interrupt.h>
15 #include <linux/module.h>
16 #include <linux/usb.h>
17 
18 #include <sound/core.h>
19 #include <sound/control.h>
20 
21 #include "capture.h"
22 #include "driver.h"
23 #include "playback.h"
24 #include "usbdefs.h"
25 
26 /*
27 	Locate name in binary program dump
28 */
29 #define	POD_NAME_OFFSET 0
30 #define	POD_NAME_LENGTH 16
31 
32 /*
33 	Other constants
34 */
35 #define POD_CONTROL_SIZE 0x80
36 #define POD_BUFSIZE_DUMPREQ 7
37 #define POD_STARTUP_DELAY 1000
38 
39 /*
40 	Stages of POD startup procedure
41 */
42 enum {
43 	POD_STARTUP_INIT = 1,
44 	POD_STARTUP_VERSIONREQ,
45 	POD_STARTUP_WORKQUEUE,
46 	POD_STARTUP_SETUP,
47 	POD_STARTUP_LAST = POD_STARTUP_SETUP - 1
48 };
49 
50 enum {
51 	LINE6_BASSPODXT,
52 	LINE6_BASSPODXTLIVE,
53 	LINE6_BASSPODXTPRO,
54 	LINE6_POCKETPOD,
55 	LINE6_PODXT,
56 	LINE6_PODXTLIVE_POD,
57 	LINE6_PODXTPRO,
58 };
59 
60 struct usb_line6_pod {
61 	/**
62 		Generic Line 6 USB data.
63 	*/
64 	struct usb_line6 line6;
65 
66 	/**
67 		Instrument monitor level.
68 	*/
69 	int monitor_level;
70 
71 	/**
72 		Timer for device initializaton.
73 	*/
74 	struct timer_list startup_timer;
75 
76 	/**
77 		Work handler for device initializaton.
78 	*/
79 	struct work_struct startup_work;
80 
81 	/**
82 		Current progress in startup procedure.
83 	*/
84 	int startup_progress;
85 
86 	/**
87 		Serial number of device.
88 	*/
89 	int serial_number;
90 
91 	/**
92 		Firmware version (x 100).
93 	*/
94 	int firmware_version;
95 
96 	/**
97 		Device ID.
98 	*/
99 	int device_id;
100 };
101 
102 #define POD_SYSEX_CODE 3
103 #define POD_BYTES_PER_FRAME 6	/* 24bit audio (stereo) */
104 
105 /* *INDENT-OFF* */
106 
107 enum {
108 	POD_SYSEX_SAVE      = 0x24,
109 	POD_SYSEX_SYSTEM    = 0x56,
110 	POD_SYSEX_SYSTEMREQ = 0x57,
111 	/* POD_SYSEX_UPDATE    = 0x6c, */  /* software update! */
112 	POD_SYSEX_STORE     = 0x71,
113 	POD_SYSEX_FINISH    = 0x72,
114 	POD_SYSEX_DUMPMEM   = 0x73,
115 	POD_SYSEX_DUMP      = 0x74,
116 	POD_SYSEX_DUMPREQ   = 0x75
117 
118 	/* dumps entire internal memory of PODxt Pro */
119 	/* POD_SYSEX_DUMPMEM2  = 0x76 */
120 };
121 
122 enum {
123 	POD_MONITOR_LEVEL  = 0x04,
124 	POD_SYSTEM_INVALID = 0x10000
125 };
126 
127 /* *INDENT-ON* */
128 
129 enum {
130 	POD_DUMP_MEMORY = 2
131 };
132 
133 enum {
134 	POD_BUSY_READ,
135 	POD_BUSY_WRITE,
136 	POD_CHANNEL_DIRTY,
137 	POD_SAVE_PRESSED,
138 	POD_BUSY_MIDISEND
139 };
140 
141 static struct snd_ratden pod_ratden = {
142 	.num_min = 78125,
143 	.num_max = 78125,
144 	.num_step = 1,
145 	.den = 2
146 };
147 
148 static struct line6_pcm_properties pod_pcm_properties = {
149 	.snd_line6_playback_hw = {
150 				  .info = (SNDRV_PCM_INFO_MMAP |
151 					   SNDRV_PCM_INFO_INTERLEAVED |
152 					   SNDRV_PCM_INFO_BLOCK_TRANSFER |
153 					   SNDRV_PCM_INFO_MMAP_VALID |
154 					   SNDRV_PCM_INFO_PAUSE |
155 					   SNDRV_PCM_INFO_SYNC_START),
156 				  .formats = SNDRV_PCM_FMTBIT_S24_3LE,
157 				  .rates = SNDRV_PCM_RATE_KNOT,
158 				  .rate_min = 39062,
159 				  .rate_max = 39063,
160 				  .channels_min = 2,
161 				  .channels_max = 2,
162 				  .buffer_bytes_max = 60000,
163 				  .period_bytes_min = 64,
164 				  .period_bytes_max = 8192,
165 				  .periods_min = 1,
166 				  .periods_max = 1024},
167 	.snd_line6_capture_hw = {
168 				 .info = (SNDRV_PCM_INFO_MMAP |
169 					  SNDRV_PCM_INFO_INTERLEAVED |
170 					  SNDRV_PCM_INFO_BLOCK_TRANSFER |
171 					  SNDRV_PCM_INFO_MMAP_VALID |
172 					  SNDRV_PCM_INFO_SYNC_START),
173 				 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
174 				 .rates = SNDRV_PCM_RATE_KNOT,
175 				 .rate_min = 39062,
176 				 .rate_max = 39063,
177 				 .channels_min = 2,
178 				 .channels_max = 2,
179 				 .buffer_bytes_max = 60000,
180 				 .period_bytes_min = 64,
181 				 .period_bytes_max = 8192,
182 				 .periods_min = 1,
183 				 .periods_max = 1024},
184 	.snd_line6_rates = {
185 			    .nrats = 1,
186 			    .rats = &pod_ratden},
187 	.bytes_per_frame = POD_BYTES_PER_FRAME
188 };
189 
190 static const char pod_version_header[] = {
191 	0xf2, 0x7e, 0x7f, 0x06, 0x02
192 };
193 
194 /* forward declarations: */
195 static void pod_startup2(unsigned long data);
196 static void pod_startup3(struct usb_line6_pod *pod);
197 
198 static char *pod_alloc_sysex_buffer(struct usb_line6_pod *pod, int code,
199 				    int size)
200 {
201 	return line6_alloc_sysex_buffer(&pod->line6, POD_SYSEX_CODE, code,
202 					size);
203 }
204 
205 /*
206 	Process a completely received message.
207 */
208 static void line6_pod_process_message(struct usb_line6 *line6)
209 {
210 	struct usb_line6_pod *pod = (struct usb_line6_pod *) line6;
211 	const unsigned char *buf = pod->line6.buffer_message;
212 
213 	if (memcmp(buf, pod_version_header, sizeof(pod_version_header)) == 0) {
214 		pod->firmware_version = buf[13] * 100 + buf[14] * 10 + buf[15];
215 		pod->device_id = ((int)buf[8] << 16) | ((int)buf[9] << 8) |
216 				 (int) buf[10];
217 		pod_startup3(pod);
218 		return;
219 	}
220 
221 	/* Only look for sysex messages from this device */
222 	if (buf[0] != (LINE6_SYSEX_BEGIN | LINE6_CHANNEL_DEVICE) &&
223 	    buf[0] != (LINE6_SYSEX_BEGIN | LINE6_CHANNEL_UNKNOWN)) {
224 		return;
225 	}
226 	if (memcmp(buf + 1, line6_midi_id, sizeof(line6_midi_id)) != 0)
227 		return;
228 
229 	if (buf[5] == POD_SYSEX_SYSTEM && buf[6] == POD_MONITOR_LEVEL) {
230 		short value = ((int)buf[7] << 12) | ((int)buf[8] << 8) |
231 			      ((int)buf[9] << 4) | (int)buf[10];
232 		pod->monitor_level = value;
233 	}
234 }
235 
236 /*
237 	Send system parameter (from integer).
238 */
239 static int pod_set_system_param_int(struct usb_line6_pod *pod, int value,
240 				    int code)
241 {
242 	char *sysex;
243 	static const int size = 5;
244 
245 	sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEM, size);
246 	if (!sysex)
247 		return -ENOMEM;
248 	sysex[SYSEX_DATA_OFS] = code;
249 	sysex[SYSEX_DATA_OFS + 1] = (value >> 12) & 0x0f;
250 	sysex[SYSEX_DATA_OFS + 2] = (value >> 8) & 0x0f;
251 	sysex[SYSEX_DATA_OFS + 3] = (value >> 4) & 0x0f;
252 	sysex[SYSEX_DATA_OFS + 4] = (value) & 0x0f;
253 	line6_send_sysex_message(&pod->line6, sysex, size);
254 	kfree(sysex);
255 	return 0;
256 }
257 
258 /*
259 	"read" request on "serial_number" special file.
260 */
261 static ssize_t serial_number_show(struct device *dev,
262 				  struct device_attribute *attr, char *buf)
263 {
264 	struct usb_interface *interface = to_usb_interface(dev);
265 	struct usb_line6_pod *pod = usb_get_intfdata(interface);
266 
267 	return sprintf(buf, "%d\n", pod->serial_number);
268 }
269 
270 /*
271 	"read" request on "firmware_version" special file.
272 */
273 static ssize_t firmware_version_show(struct device *dev,
274 				     struct device_attribute *attr, char *buf)
275 {
276 	struct usb_interface *interface = to_usb_interface(dev);
277 	struct usb_line6_pod *pod = usb_get_intfdata(interface);
278 
279 	return sprintf(buf, "%d.%02d\n", pod->firmware_version / 100,
280 		       pod->firmware_version % 100);
281 }
282 
283 /*
284 	"read" request on "device_id" special file.
285 */
286 static ssize_t device_id_show(struct device *dev,
287 			      struct device_attribute *attr, char *buf)
288 {
289 	struct usb_interface *interface = to_usb_interface(dev);
290 	struct usb_line6_pod *pod = usb_get_intfdata(interface);
291 
292 	return sprintf(buf, "%d\n", pod->device_id);
293 }
294 
295 /*
296 	POD startup procedure.
297 	This is a sequence of functions with special requirements (e.g., must
298 	not run immediately after initialization, must not run in interrupt
299 	context). After the last one has finished, the device is ready to use.
300 */
301 
302 static void pod_startup1(struct usb_line6_pod *pod)
303 {
304 	CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_INIT);
305 
306 	/* delay startup procedure: */
307 	line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
308 			  (unsigned long)pod);
309 }
310 
311 static void pod_startup2(unsigned long data)
312 {
313 	struct usb_line6_pod *pod = (struct usb_line6_pod *)data;
314 	struct usb_line6 *line6 = &pod->line6;
315 
316 	CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_VERSIONREQ);
317 
318 	/* request firmware version: */
319 	line6_version_request_async(line6);
320 }
321 
322 static void pod_startup3(struct usb_line6_pod *pod)
323 {
324 	CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_WORKQUEUE);
325 
326 	/* schedule work for global work queue: */
327 	schedule_work(&pod->startup_work);
328 }
329 
330 static void pod_startup4(struct work_struct *work)
331 {
332 	struct usb_line6_pod *pod =
333 	    container_of(work, struct usb_line6_pod, startup_work);
334 	struct usb_line6 *line6 = &pod->line6;
335 
336 	CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_SETUP);
337 
338 	/* serial number: */
339 	line6_read_serial_number(&pod->line6, &pod->serial_number);
340 
341 	/* ALSA audio interface: */
342 	snd_card_register(line6->card);
343 }
344 
345 /* POD special files: */
346 static DEVICE_ATTR_RO(device_id);
347 static DEVICE_ATTR_RO(firmware_version);
348 static DEVICE_ATTR_RO(serial_number);
349 
350 /* control info callback */
351 static int snd_pod_control_monitor_info(struct snd_kcontrol *kcontrol,
352 					struct snd_ctl_elem_info *uinfo)
353 {
354 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
355 	uinfo->count = 1;
356 	uinfo->value.integer.min = 0;
357 	uinfo->value.integer.max = 65535;
358 	return 0;
359 }
360 
361 /* control get callback */
362 static int snd_pod_control_monitor_get(struct snd_kcontrol *kcontrol,
363 				       struct snd_ctl_elem_value *ucontrol)
364 {
365 	struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
366 	struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
367 
368 	ucontrol->value.integer.value[0] = pod->monitor_level;
369 	return 0;
370 }
371 
372 /* control put callback */
373 static int snd_pod_control_monitor_put(struct snd_kcontrol *kcontrol,
374 				       struct snd_ctl_elem_value *ucontrol)
375 {
376 	struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
377 	struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
378 
379 	if (ucontrol->value.integer.value[0] == pod->monitor_level)
380 		return 0;
381 
382 	pod->monitor_level = ucontrol->value.integer.value[0];
383 	pod_set_system_param_int(pod, ucontrol->value.integer.value[0],
384 				 POD_MONITOR_LEVEL);
385 	return 1;
386 }
387 
388 /* control definition */
389 static struct snd_kcontrol_new pod_control_monitor = {
390 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
391 	.name = "Monitor Playback Volume",
392 	.index = 0,
393 	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
394 	.info = snd_pod_control_monitor_info,
395 	.get = snd_pod_control_monitor_get,
396 	.put = snd_pod_control_monitor_put
397 };
398 
399 /*
400 	POD device disconnected.
401 */
402 static void line6_pod_disconnect(struct usb_line6 *line6)
403 {
404 	struct usb_line6_pod *pod = (struct usb_line6_pod *)line6;
405 	struct device *dev = line6->ifcdev;
406 
407 	/* remove sysfs entries: */
408 	device_remove_file(dev, &dev_attr_device_id);
409 	device_remove_file(dev, &dev_attr_firmware_version);
410 	device_remove_file(dev, &dev_attr_serial_number);
411 
412 	del_timer_sync(&pod->startup_timer);
413 	cancel_work_sync(&pod->startup_work);
414 }
415 
416 /*
417 	Create sysfs entries.
418 */
419 static int pod_create_files2(struct device *dev)
420 {
421 	int err;
422 
423 	err = device_create_file(dev, &dev_attr_device_id);
424 	if (err < 0)
425 		return err;
426 	err = device_create_file(dev, &dev_attr_firmware_version);
427 	if (err < 0)
428 		return err;
429 	err = device_create_file(dev, &dev_attr_serial_number);
430 	if (err < 0)
431 		return err;
432 	return 0;
433 }
434 
435 /*
436 	 Try to init POD device.
437 */
438 static int pod_init(struct usb_line6 *line6,
439 		    const struct usb_device_id *id)
440 {
441 	int err;
442 	struct usb_line6_pod *pod = (struct usb_line6_pod *) line6;
443 
444 	line6->process_message = line6_pod_process_message;
445 	line6->disconnect = line6_pod_disconnect;
446 
447 	init_timer(&pod->startup_timer);
448 	INIT_WORK(&pod->startup_work, pod_startup4);
449 
450 	/* create sysfs entries: */
451 	err = pod_create_files2(line6->ifcdev);
452 	if (err < 0)
453 		return err;
454 
455 	/* initialize MIDI subsystem: */
456 	err = line6_init_midi(line6);
457 	if (err < 0)
458 		return err;
459 
460 	/* initialize PCM subsystem: */
461 	err = line6_init_pcm(line6, &pod_pcm_properties);
462 	if (err < 0)
463 		return err;
464 
465 	/* register monitor control: */
466 	err = snd_ctl_add(line6->card,
467 			  snd_ctl_new1(&pod_control_monitor, line6->line6pcm));
468 	if (err < 0)
469 		return err;
470 
471 	/*
472 	   When the sound card is registered at this point, the PODxt Live
473 	   displays "Invalid Code Error 07", so we do it later in the event
474 	   handler.
475 	 */
476 
477 	if (pod->line6.properties->capabilities & LINE6_CAP_CONTROL) {
478 		pod->monitor_level = POD_SYSTEM_INVALID;
479 
480 		/* initiate startup procedure: */
481 		pod_startup1(pod);
482 	}
483 
484 	return 0;
485 }
486 
487 #define LINE6_DEVICE(prod) USB_DEVICE(0x0e41, prod)
488 #define LINE6_IF_NUM(prod, n) USB_DEVICE_INTERFACE_NUMBER(0x0e41, prod, n)
489 
490 /* table of devices that work with this driver */
491 static const struct usb_device_id pod_id_table[] = {
492 	{ LINE6_DEVICE(0x4250),    .driver_info = LINE6_BASSPODXT },
493 	{ LINE6_DEVICE(0x4642),    .driver_info = LINE6_BASSPODXTLIVE },
494 	{ LINE6_DEVICE(0x4252),    .driver_info = LINE6_BASSPODXTPRO },
495 	{ LINE6_IF_NUM(0x5051, 1), .driver_info = LINE6_POCKETPOD },
496 	{ LINE6_DEVICE(0x5044),    .driver_info = LINE6_PODXT },
497 	{ LINE6_IF_NUM(0x4650, 0), .driver_info = LINE6_PODXTLIVE_POD },
498 	{ LINE6_DEVICE(0x5050),    .driver_info = LINE6_PODXTPRO },
499 	{}
500 };
501 
502 MODULE_DEVICE_TABLE(usb, pod_id_table);
503 
504 static const struct line6_properties pod_properties_table[] = {
505 	[LINE6_BASSPODXT] = {
506 		.id = "BassPODxt",
507 		.name = "BassPODxt",
508 		.capabilities	= LINE6_CAP_CONTROL
509 				| LINE6_CAP_PCM
510 				| LINE6_CAP_HWMON,
511 		.altsetting = 5,
512 		.ep_ctrl_r = 0x84,
513 		.ep_ctrl_w = 0x03,
514 		.ep_audio_r = 0x82,
515 		.ep_audio_w = 0x01,
516 	},
517 	[LINE6_BASSPODXTLIVE] = {
518 		.id = "BassPODxtLive",
519 		.name = "BassPODxt Live",
520 		.capabilities	= LINE6_CAP_CONTROL
521 				| LINE6_CAP_PCM
522 				| LINE6_CAP_HWMON,
523 		.altsetting = 1,
524 		.ep_ctrl_r = 0x84,
525 		.ep_ctrl_w = 0x03,
526 		.ep_audio_r = 0x82,
527 		.ep_audio_w = 0x01,
528 	},
529 	[LINE6_BASSPODXTPRO] = {
530 		.id = "BassPODxtPro",
531 		.name = "BassPODxt Pro",
532 		.capabilities	= LINE6_CAP_CONTROL
533 				| LINE6_CAP_PCM
534 				| LINE6_CAP_HWMON,
535 		.altsetting = 5,
536 		.ep_ctrl_r = 0x84,
537 		.ep_ctrl_w = 0x03,
538 		.ep_audio_r = 0x82,
539 		.ep_audio_w = 0x01,
540 	},
541 	[LINE6_POCKETPOD] = {
542 		.id = "PocketPOD",
543 		.name = "Pocket POD",
544 		.capabilities	= LINE6_CAP_CONTROL,
545 		.altsetting = 0,
546 		.ep_ctrl_r = 0x82,
547 		.ep_ctrl_w = 0x02,
548 		/* no audio channel */
549 	},
550 	[LINE6_PODXT] = {
551 		.id = "PODxt",
552 		.name = "PODxt",
553 		.capabilities	= LINE6_CAP_CONTROL
554 				| LINE6_CAP_PCM
555 				| LINE6_CAP_HWMON,
556 		.altsetting = 5,
557 		.ep_ctrl_r = 0x84,
558 		.ep_ctrl_w = 0x03,
559 		.ep_audio_r = 0x82,
560 		.ep_audio_w = 0x01,
561 	},
562 	[LINE6_PODXTLIVE_POD] = {
563 		.id = "PODxtLive",
564 		.name = "PODxt Live",
565 		.capabilities	= LINE6_CAP_CONTROL
566 				| LINE6_CAP_PCM
567 				| LINE6_CAP_HWMON,
568 		.altsetting = 1,
569 		.ep_ctrl_r = 0x84,
570 		.ep_ctrl_w = 0x03,
571 		.ep_audio_r = 0x82,
572 		.ep_audio_w = 0x01,
573 	},
574 	[LINE6_PODXTPRO] = {
575 		.id = "PODxtPro",
576 		.name = "PODxt Pro",
577 		.capabilities	= LINE6_CAP_CONTROL
578 				| LINE6_CAP_PCM
579 				| LINE6_CAP_HWMON,
580 		.altsetting = 5,
581 		.ep_ctrl_r = 0x84,
582 		.ep_ctrl_w = 0x03,
583 		.ep_audio_r = 0x82,
584 		.ep_audio_w = 0x01,
585 	},
586 };
587 
588 /*
589 	Probe USB device.
590 */
591 static int pod_probe(struct usb_interface *interface,
592 		     const struct usb_device_id *id)
593 {
594 	return line6_probe(interface, id,
595 			   &pod_properties_table[id->driver_info],
596 			   pod_init, sizeof(struct usb_line6_pod));
597 }
598 
599 static struct usb_driver pod_driver = {
600 	.name = KBUILD_MODNAME,
601 	.probe = pod_probe,
602 	.disconnect = line6_disconnect,
603 #ifdef CONFIG_PM
604 	.suspend = line6_suspend,
605 	.resume = line6_resume,
606 	.reset_resume = line6_resume,
607 #endif
608 	.id_table = pod_id_table,
609 };
610 
611 module_usb_driver(pod_driver);
612 
613 MODULE_DESCRIPTION("Line 6 POD USB driver");
614 MODULE_LICENSE("GPL");
615