GNU Linux-libre 4.9.309-gnu1
[releases.git] / sound / usb / line6 / podhd.c
1 /*
2  * Line 6 Pod HD
3  *
4  * Copyright (C) 2011 Stefan Hajnoczi <stefanha@gmail.com>
5  * Copyright (C) 2015 Andrej Krutak <dev@andree.sk>
6  *
7  *      This program is free software; you can redistribute it and/or
8  *      modify it under the terms of the GNU General Public License as
9  *      published by the Free Software Foundation, version 2.
10  *
11  */
12
13 #include <linux/usb.h>
14 #include <linux/slab.h>
15 #include <linux/module.h>
16 #include <sound/core.h>
17 #include <sound/pcm.h>
18
19 #include "driver.h"
20 #include "pcm.h"
21
22 #define PODHD_STARTUP_DELAY 500
23
24 /*
25  * Stages of POD startup procedure
26  */
27 enum {
28         PODHD_STARTUP_INIT = 1,
29         PODHD_STARTUP_SCHEDULE_WORKQUEUE,
30         PODHD_STARTUP_SETUP,
31         PODHD_STARTUP_LAST = PODHD_STARTUP_SETUP - 1
32 };
33
34 enum {
35         LINE6_PODHD300,
36         LINE6_PODHD400,
37         LINE6_PODHD500_0,
38         LINE6_PODHD500_1,
39         LINE6_PODX3,
40         LINE6_PODX3LIVE
41 };
42
43 struct usb_line6_podhd {
44         /* Generic Line 6 USB data */
45         struct usb_line6 line6;
46
47         /* Timer for device initialization */
48         struct timer_list startup_timer;
49
50         /* Work handler for device initialization */
51         struct work_struct startup_work;
52
53         /* Current progress in startup procedure */
54         int startup_progress;
55
56         /* Serial number of device */
57         u32 serial_number;
58
59         /* Firmware version */
60         int firmware_version;
61 };
62
63 static struct snd_ratden podhd_ratden = {
64         .num_min = 48000,
65         .num_max = 48000,
66         .num_step = 1,
67         .den = 1,
68 };
69
70 static struct line6_pcm_properties podhd_pcm_properties = {
71         .playback_hw = {
72                                   .info = (SNDRV_PCM_INFO_MMAP |
73                                            SNDRV_PCM_INFO_INTERLEAVED |
74                                            SNDRV_PCM_INFO_BLOCK_TRANSFER |
75                                            SNDRV_PCM_INFO_MMAP_VALID |
76                                            SNDRV_PCM_INFO_PAUSE |
77                                            SNDRV_PCM_INFO_SYNC_START),
78                                   .formats = SNDRV_PCM_FMTBIT_S24_3LE,
79                                   .rates = SNDRV_PCM_RATE_48000,
80                                   .rate_min = 48000,
81                                   .rate_max = 48000,
82                                   .channels_min = 2,
83                                   .channels_max = 2,
84                                   .buffer_bytes_max = 60000,
85                                   .period_bytes_min = 64,
86                                   .period_bytes_max = 8192,
87                                   .periods_min = 1,
88                                   .periods_max = 1024},
89         .capture_hw = {
90                                  .info = (SNDRV_PCM_INFO_MMAP |
91                                           SNDRV_PCM_INFO_INTERLEAVED |
92                                           SNDRV_PCM_INFO_BLOCK_TRANSFER |
93                                           SNDRV_PCM_INFO_MMAP_VALID |
94                                           SNDRV_PCM_INFO_SYNC_START),
95                                  .formats = SNDRV_PCM_FMTBIT_S24_3LE,
96                                  .rates = SNDRV_PCM_RATE_48000,
97                                  .rate_min = 48000,
98                                  .rate_max = 48000,
99                                  .channels_min = 2,
100                                  .channels_max = 2,
101                                  .buffer_bytes_max = 60000,
102                                  .period_bytes_min = 64,
103                                  .period_bytes_max = 8192,
104                                  .periods_min = 1,
105                                  .periods_max = 1024},
106         .rates = {
107                             .nrats = 1,
108                             .rats = &podhd_ratden},
109         .bytes_per_channel = 3 /* SNDRV_PCM_FMTBIT_S24_3LE */
110 };
111
112 static struct line6_pcm_properties podx3_pcm_properties = {
113         .playback_hw = {
114                                   .info = (SNDRV_PCM_INFO_MMAP |
115                                            SNDRV_PCM_INFO_INTERLEAVED |
116                                            SNDRV_PCM_INFO_BLOCK_TRANSFER |
117                                            SNDRV_PCM_INFO_MMAP_VALID |
118                                            SNDRV_PCM_INFO_PAUSE |
119                                            SNDRV_PCM_INFO_SYNC_START),
120                                   .formats = SNDRV_PCM_FMTBIT_S24_3LE,
121                                   .rates = SNDRV_PCM_RATE_48000,
122                                   .rate_min = 48000,
123                                   .rate_max = 48000,
124                                   .channels_min = 2,
125                                   .channels_max = 2,
126                                   .buffer_bytes_max = 60000,
127                                   .period_bytes_min = 64,
128                                   .period_bytes_max = 8192,
129                                   .periods_min = 1,
130                                   .periods_max = 1024},
131         .capture_hw = {
132                                  .info = (SNDRV_PCM_INFO_MMAP |
133                                           SNDRV_PCM_INFO_INTERLEAVED |
134                                           SNDRV_PCM_INFO_BLOCK_TRANSFER |
135                                           SNDRV_PCM_INFO_MMAP_VALID |
136                                           SNDRV_PCM_INFO_SYNC_START),
137                                  .formats = SNDRV_PCM_FMTBIT_S24_3LE,
138                                  .rates = SNDRV_PCM_RATE_48000,
139                                  .rate_min = 48000,
140                                  .rate_max = 48000,
141                                  /* 1+2: Main signal (out), 3+4: Tone 1,
142                                   * 5+6: Tone 2, 7+8: raw
143                                   */
144                                  .channels_min = 8,
145                                  .channels_max = 8,
146                                  .buffer_bytes_max = 60000,
147                                  .period_bytes_min = 64,
148                                  .period_bytes_max = 8192,
149                                  .periods_min = 1,
150                                  .periods_max = 1024},
151         .rates = {
152                             .nrats = 1,
153                             .rats = &podhd_ratden},
154         .bytes_per_channel = 3 /* SNDRV_PCM_FMTBIT_S24_3LE */
155 };
156
157 static void podhd_startup_start_workqueue(unsigned long data);
158 static void podhd_startup_workqueue(struct work_struct *work);
159 static int podhd_startup_finalize(struct usb_line6_podhd *pod);
160
161 static ssize_t serial_number_show(struct device *dev,
162                                   struct device_attribute *attr, char *buf)
163 {
164         struct snd_card *card = dev_to_snd_card(dev);
165         struct usb_line6_podhd *pod = card->private_data;
166
167         return sprintf(buf, "%u\n", pod->serial_number);
168 }
169
170 static ssize_t firmware_version_show(struct device *dev,
171                                      struct device_attribute *attr, char *buf)
172 {
173         struct snd_card *card = dev_to_snd_card(dev);
174         struct usb_line6_podhd *pod = card->private_data;
175
176         return sprintf(buf, "%06x\n", pod->firmware_version);
177 }
178
179 static DEVICE_ATTR_RO(firmware_version);
180 static DEVICE_ATTR_RO(serial_number);
181
182 static struct attribute *podhd_dev_attrs[] = {
183         &dev_attr_firmware_version.attr,
184         &dev_attr_serial_number.attr,
185         NULL
186 };
187
188 static const struct attribute_group podhd_dev_attr_group = {
189         .name = "podhd",
190         .attrs = podhd_dev_attrs,
191 };
192
193 /*
194  * POD X3 startup procedure.
195  *
196  * May be compatible with other POD HD's, since it's also similar to the
197  * previous POD setup. In any case, it doesn't seem to be required for the
198  * audio nor bulk interfaces to work.
199  */
200
201 static void podhd_startup(struct usb_line6_podhd *pod)
202 {
203         CHECK_STARTUP_PROGRESS(pod->startup_progress, PODHD_STARTUP_INIT);
204
205         /* delay startup procedure: */
206         line6_start_timer(&pod->startup_timer, PODHD_STARTUP_DELAY,
207                 podhd_startup_start_workqueue, (unsigned long)pod);
208 }
209
210 static void podhd_startup_start_workqueue(unsigned long data)
211 {
212         struct usb_line6_podhd *pod = (struct usb_line6_podhd *)data;
213
214         CHECK_STARTUP_PROGRESS(pod->startup_progress,
215                 PODHD_STARTUP_SCHEDULE_WORKQUEUE);
216
217         /* schedule work for global work queue: */
218         schedule_work(&pod->startup_work);
219 }
220
221 static int podhd_dev_start(struct usb_line6_podhd *pod)
222 {
223         int ret;
224         u8 *init_bytes;
225         int i;
226         struct usb_device *usbdev = pod->line6.usbdev;
227
228         init_bytes = kmalloc(8, GFP_KERNEL);
229         if (!init_bytes)
230                 return -ENOMEM;
231
232         ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0),
233                                         0x67, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
234                                         0x11, 0,
235                                         NULL, 0, LINE6_TIMEOUT);
236         if (ret < 0) {
237                 dev_err(pod->line6.ifcdev, "read request failed (error %d)\n", ret);
238                 goto exit;
239         }
240
241         /* NOTE: looks like some kind of ping message */
242         ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67,
243                                         USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
244                                         0x11, 0x0,
245                                         init_bytes, 3, LINE6_TIMEOUT);
246         if (ret < 0) {
247                 dev_err(pod->line6.ifcdev,
248                         "receive length failed (error %d)\n", ret);
249                 goto exit;
250         }
251
252         pod->firmware_version =
253                 (init_bytes[0] << 16) | (init_bytes[1] << 8) | (init_bytes[2] << 0);
254
255         for (i = 0; i <= 16; i++) {
256                 ret = line6_read_data(&pod->line6, 0xf000 + 0x08 * i, init_bytes, 8);
257                 if (ret < 0)
258                         goto exit;
259         }
260
261         ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0),
262                                         USB_REQ_SET_FEATURE,
263                                         USB_TYPE_STANDARD | USB_RECIP_DEVICE | USB_DIR_OUT,
264                                         1, 0,
265                                         NULL, 0, LINE6_TIMEOUT);
266 exit:
267         kfree(init_bytes);
268         return ret;
269 }
270
271 static void podhd_startup_workqueue(struct work_struct *work)
272 {
273         struct usb_line6_podhd *pod =
274             container_of(work, struct usb_line6_podhd, startup_work);
275
276         CHECK_STARTUP_PROGRESS(pod->startup_progress, PODHD_STARTUP_SETUP);
277
278         podhd_dev_start(pod);
279         line6_read_serial_number(&pod->line6, &pod->serial_number);
280
281         podhd_startup_finalize(pod);
282 }
283
284 static int podhd_startup_finalize(struct usb_line6_podhd *pod)
285 {
286         struct usb_line6 *line6 = &pod->line6;
287
288         /* ALSA audio interface: */
289         return snd_card_register(line6->card);
290 }
291
292 static void podhd_disconnect(struct usb_line6 *line6)
293 {
294         struct usb_line6_podhd *pod = (struct usb_line6_podhd *)line6;
295
296         if (pod->line6.properties->capabilities & LINE6_CAP_CONTROL) {
297                 del_timer_sync(&pod->startup_timer);
298                 cancel_work_sync(&pod->startup_work);
299         }
300 }
301
302 /*
303         Try to init POD HD device.
304 */
305 static int podhd_init(struct usb_line6 *line6,
306                       const struct usb_device_id *id)
307 {
308         int err;
309         struct usb_line6_podhd *pod = (struct usb_line6_podhd *) line6;
310
311         line6->disconnect = podhd_disconnect;
312
313         init_timer(&pod->startup_timer);
314         INIT_WORK(&pod->startup_work, podhd_startup_workqueue);
315
316         if (pod->line6.properties->capabilities & LINE6_CAP_CONTROL) {
317                 /* create sysfs entries: */
318                 err = snd_card_add_dev_attr(line6->card, &podhd_dev_attr_group);
319                 if (err < 0)
320                         return err;
321         }
322
323         if (pod->line6.properties->capabilities & LINE6_CAP_PCM) {
324                 /* initialize PCM subsystem: */
325                 err = line6_init_pcm(line6,
326                         (id->driver_info == LINE6_PODX3 ||
327                         id->driver_info == LINE6_PODX3LIVE) ? &podx3_pcm_properties :
328                         &podhd_pcm_properties);
329                 if (err < 0)
330                         return err;
331         }
332
333         if (!(pod->line6.properties->capabilities & LINE6_CAP_CONTROL)) {
334                 /* register USB audio system directly */
335                 return podhd_startup_finalize(pod);
336         }
337
338         /* init device and delay registering */
339         podhd_startup(pod);
340         return 0;
341 }
342
343 #define LINE6_DEVICE(prod) USB_DEVICE(0x0e41, prod)
344 #define LINE6_IF_NUM(prod, n) USB_DEVICE_INTERFACE_NUMBER(0x0e41, prod, n)
345
346 /* table of devices that work with this driver */
347 static const struct usb_device_id podhd_id_table[] = {
348         /* TODO: no need to alloc data interfaces when only audio is used */
349         { LINE6_DEVICE(0x5057),    .driver_info = LINE6_PODHD300 },
350         { LINE6_DEVICE(0x5058),    .driver_info = LINE6_PODHD400 },
351         { LINE6_IF_NUM(0x414D, 0), .driver_info = LINE6_PODHD500_0 },
352         { LINE6_IF_NUM(0x414D, 1), .driver_info = LINE6_PODHD500_1 },
353         { LINE6_IF_NUM(0x414A, 0), .driver_info = LINE6_PODX3 },
354         { LINE6_IF_NUM(0x414B, 0), .driver_info = LINE6_PODX3LIVE },
355         {}
356 };
357
358 MODULE_DEVICE_TABLE(usb, podhd_id_table);
359
360 static const struct line6_properties podhd_properties_table[] = {
361         [LINE6_PODHD300] = {
362                 .id = "PODHD300",
363                 .name = "POD HD300",
364                 .capabilities   = LINE6_CAP_PCM
365                                 | LINE6_CAP_HWMON,
366                 .altsetting = 5,
367                 .ep_ctrl_r = 0x84,
368                 .ep_ctrl_w = 0x03,
369                 .ep_audio_r = 0x82,
370                 .ep_audio_w = 0x01,
371         },
372         [LINE6_PODHD400] = {
373                 .id = "PODHD400",
374                 .name = "POD HD400",
375                 .capabilities   = LINE6_CAP_PCM
376                                 | LINE6_CAP_HWMON,
377                 .altsetting = 5,
378                 .ep_ctrl_r = 0x84,
379                 .ep_ctrl_w = 0x03,
380                 .ep_audio_r = 0x82,
381                 .ep_audio_w = 0x01,
382         },
383         [LINE6_PODHD500_0] = {
384                 .id = "PODHD500",
385                 .name = "POD HD500",
386                 .capabilities   = LINE6_CAP_PCM
387                                 | LINE6_CAP_HWMON,
388                 .altsetting = 1,
389                 .ep_ctrl_r = 0x81,
390                 .ep_ctrl_w = 0x01,
391                 .ep_audio_r = 0x86,
392                 .ep_audio_w = 0x02,
393         },
394         [LINE6_PODHD500_1] = {
395                 .id = "PODHD500",
396                 .name = "POD HD500",
397                 .capabilities   = LINE6_CAP_PCM
398                                 | LINE6_CAP_HWMON,
399                 .altsetting = 0,
400                 .ep_ctrl_r = 0x81,
401                 .ep_ctrl_w = 0x01,
402                 .ep_audio_r = 0x86,
403                 .ep_audio_w = 0x02,
404         },
405         [LINE6_PODX3] = {
406                 .id = "PODX3",
407                 .name = "POD X3",
408                 .capabilities   = LINE6_CAP_CONTROL
409                                 | LINE6_CAP_PCM | LINE6_CAP_HWMON | LINE6_CAP_IN_NEEDS_OUT,
410                 .altsetting = 1,
411                 .ep_ctrl_r = 0x81,
412                 .ep_ctrl_w = 0x01,
413                 .ep_audio_r = 0x86,
414                 .ep_audio_w = 0x02,
415         },
416         [LINE6_PODX3LIVE] = {
417                 .id = "PODX3LIVE",
418                 .name = "POD X3 LIVE",
419                 .capabilities   = LINE6_CAP_CONTROL
420                                 | LINE6_CAP_PCM | LINE6_CAP_HWMON | LINE6_CAP_IN_NEEDS_OUT,
421                 .altsetting = 1,
422                 .ep_ctrl_r = 0x81,
423                 .ep_ctrl_w = 0x01,
424                 .ep_audio_r = 0x86,
425                 .ep_audio_w = 0x02,
426         },
427 };
428
429 /*
430         Probe USB device.
431 */
432 static int podhd_probe(struct usb_interface *interface,
433                        const struct usb_device_id *id)
434 {
435         return line6_probe(interface, id, "Line6-PODHD",
436                            &podhd_properties_table[id->driver_info],
437                            podhd_init, sizeof(struct usb_line6_podhd));
438 }
439
440 static struct usb_driver podhd_driver = {
441         .name = KBUILD_MODNAME,
442         .probe = podhd_probe,
443         .disconnect = line6_disconnect,
444 #ifdef CONFIG_PM
445         .suspend = line6_suspend,
446         .resume = line6_resume,
447         .reset_resume = line6_resume,
448 #endif
449         .id_table = podhd_id_table,
450 };
451
452 module_usb_driver(podhd_driver);
453
454 MODULE_DESCRIPTION("Line 6 PODHD USB driver");
455 MODULE_LICENSE("GPL");