Linux Audio

Check our new training course

Loading...
  1/*
  2 * Copyright (C) 2007, 2008 Karsten Wiese <fzu@wemgehoertderstaat.de>
  3 *
  4 * This program is free software; you can redistribute it and/or modify it
  5 * under the terms of the GNU General Public License as published by the
  6 * Free Software Foundation; either version 2 of the License, or (at your
  7 * option) any later version.
  8 *
  9 * This program is distributed in the hope that it will be useful, but
 10 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 11 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12 * for more details.
 13 *
 14 * You should have received a copy of the GNU General Public License
 15 * along with this program; if not, write to the Free Software Foundation,
 16 * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 17 */
 18
 19#include <linux/slab.h>
 20#include <linux/usb.h>
 21#include <linux/usb/audio.h>
 22#include <linux/module.h>
 23#include <sound/core.h>
 24#include <sound/hwdep.h>
 25#include <sound/pcm.h>
 26#include <sound/initval.h>
 27#define MODNAME "US122L"
 28#include "usb_stream.c"
 29#include "../usbaudio.h"
 30#include "../midi.h"
 31#include "us122l.h"
 32
 33MODULE_AUTHOR("Karsten Wiese <fzu@wemgehoertderstaat.de>");
 34MODULE_DESCRIPTION("TASCAM "NAME_ALLCAPS" Version 0.5");
 35MODULE_LICENSE("GPL");
 36
 37static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-max */
 38static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* Id for this card */
 39							/* Enable this card */
 40static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
 41
 42module_param_array(index, int, NULL, 0444);
 43MODULE_PARM_DESC(index, "Index value for "NAME_ALLCAPS".");
 44module_param_array(id, charp, NULL, 0444);
 45MODULE_PARM_DESC(id, "ID string for "NAME_ALLCAPS".");
 46module_param_array(enable, bool, NULL, 0444);
 47MODULE_PARM_DESC(enable, "Enable "NAME_ALLCAPS".");
 48
 49static int snd_us122l_card_used[SNDRV_CARDS];
 50
 51
 52static int us122l_create_usbmidi(struct snd_card *card)
 53{
 54	static struct snd_usb_midi_endpoint_info quirk_data = {
 55		.out_ep = 4,
 56		.in_ep = 3,
 57		.out_cables =	0x001,
 58		.in_cables =	0x001
 59	};
 60	static struct snd_usb_audio_quirk quirk = {
 61		.vendor_name =	"US122L",
 62		.product_name =	NAME_ALLCAPS,
 63		.ifnum = 	1,
 64		.type = QUIRK_MIDI_US122L,
 65		.data = &quirk_data
 66	};
 67	struct usb_device *dev = US122L(card)->dev;
 68	struct usb_interface *iface = usb_ifnum_to_if(dev, 1);
 69
 70	return snd_usbmidi_create(card, iface,
 71				  &US122L(card)->midi_list, &quirk);
 72}
 73
 74static int us144_create_usbmidi(struct snd_card *card)
 75{
 76	static struct snd_usb_midi_endpoint_info quirk_data = {
 77		.out_ep = 4,
 78		.in_ep = 3,
 79		.out_cables =	0x001,
 80		.in_cables =	0x001
 81	};
 82	static struct snd_usb_audio_quirk quirk = {
 83		.vendor_name =	"US144",
 84		.product_name =	NAME_ALLCAPS,
 85		.ifnum = 	0,
 86		.type = QUIRK_MIDI_US122L,
 87		.data = &quirk_data
 88	};
 89	struct usb_device *dev = US122L(card)->dev;
 90	struct usb_interface *iface = usb_ifnum_to_if(dev, 0);
 91
 92	return snd_usbmidi_create(card, iface,
 93				  &US122L(card)->midi_list, &quirk);
 94}
 95
 96/*
 97 * Wrapper for usb_control_msg().
 98 * Allocates a temp buffer to prevent dmaing from/to the stack.
 99 */
100static int us122l_ctl_msg(struct usb_device *dev, unsigned int pipe,
101			  __u8 request, __u8 requesttype,
102			  __u16 value, __u16 index, void *data,
103			  __u16 size, int timeout)
104{
105	int err;
106	void *buf = NULL;
107
108	if (size > 0) {
109		buf = kmemdup(data, size, GFP_KERNEL);
110		if (!buf)
111			return -ENOMEM;
112	}
113	err = usb_control_msg(dev, pipe, request, requesttype,
114			      value, index, buf, size, timeout);
115	if (size > 0) {
116		memcpy(data, buf, size);
117		kfree(buf);
118	}
119	return err;
120}
121
122static void pt_info_set(struct usb_device *dev, u8 v)
123{
124	int ret;
125
126	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
127			      'I',
128			      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
129			      v, 0, NULL, 0, 1000);
130	snd_printdd(KERN_DEBUG "%i\n", ret);
131}
132
133static void usb_stream_hwdep_vm_open(struct vm_area_struct *area)
134{
135	struct us122l *us122l = area->vm_private_data;
136	atomic_inc(&us122l->mmap_count);
137	snd_printdd(KERN_DEBUG "%i\n", atomic_read(&us122l->mmap_count));
138}
139
140static int usb_stream_hwdep_vm_fault(struct vm_area_struct *area,
141				     struct vm_fault *vmf)
142{
143	unsigned long offset;
144	struct page *page;
145	void *vaddr;
146	struct us122l *us122l = area->vm_private_data;
147	struct usb_stream *s;
148
149	mutex_lock(&us122l->mutex);
150	s = us122l->sk.s;
151	if (!s)
152		goto unlock;
153
154	offset = vmf->pgoff << PAGE_SHIFT;
155	if (offset < PAGE_ALIGN(s->read_size))
156		vaddr = (char *)s + offset;
157	else {
158		offset -= PAGE_ALIGN(s->read_size);
159		if (offset >= PAGE_ALIGN(s->write_size))
160			goto unlock;
161
162		vaddr = us122l->sk.write_page + offset;
163	}
164	page = virt_to_page(vaddr);
165
166	get_page(page);
167	mutex_unlock(&us122l->mutex);
168
169	vmf->page = page;
170
171	return 0;
172unlock:
173	mutex_unlock(&us122l->mutex);
174	return VM_FAULT_SIGBUS;
175}
176
177static void usb_stream_hwdep_vm_close(struct vm_area_struct *area)
178{
179	struct us122l *us122l = area->vm_private_data;
180	atomic_dec(&us122l->mmap_count);
181	snd_printdd(KERN_DEBUG "%i\n", atomic_read(&us122l->mmap_count));
182}
183
184static const struct vm_operations_struct usb_stream_hwdep_vm_ops = {
185	.open = usb_stream_hwdep_vm_open,
186	.fault = usb_stream_hwdep_vm_fault,
187	.close = usb_stream_hwdep_vm_close,
188};
189
190
191static int usb_stream_hwdep_open(struct snd_hwdep *hw, struct file *file)
192{
193	struct us122l	*us122l = hw->private_data;
194	struct usb_interface *iface;
195	snd_printdd(KERN_DEBUG "%p %p\n", hw, file);
196	if (hw->used >= 2)
197		return -EBUSY;
198
199	if (!us122l->first)
200		us122l->first = file;
201
202	if (us122l->dev->descriptor.idProduct == USB_ID_US144 ||
203	    us122l->dev->descriptor.idProduct == USB_ID_US144MKII) {
204		iface = usb_ifnum_to_if(us122l->dev, 0);
205		usb_autopm_get_interface(iface);
206	}
207	iface = usb_ifnum_to_if(us122l->dev, 1);
208	usb_autopm_get_interface(iface);
209	return 0;
210}
211
212static int usb_stream_hwdep_release(struct snd_hwdep *hw, struct file *file)
213{
214	struct us122l	*us122l = hw->private_data;
215	struct usb_interface *iface;
216	snd_printdd(KERN_DEBUG "%p %p\n", hw, file);
217
218	if (us122l->dev->descriptor.idProduct == USB_ID_US144 ||
219	    us122l->dev->descriptor.idProduct == USB_ID_US144MKII) {
220		iface = usb_ifnum_to_if(us122l->dev, 0);
221		usb_autopm_put_interface(iface);
222	}
223	iface = usb_ifnum_to_if(us122l->dev, 1);
224	usb_autopm_put_interface(iface);
225	if (us122l->first == file)
226		us122l->first = NULL;
227	mutex_lock(&us122l->mutex);
228	if (us122l->master == file)
229		us122l->master = us122l->slave;
230
231	us122l->slave = NULL;
232	mutex_unlock(&us122l->mutex);
233	return 0;
234}
235
236static int usb_stream_hwdep_mmap(struct snd_hwdep *hw,
237				 struct file *filp, struct vm_area_struct *area)
238{
239	unsigned long	size = area->vm_end - area->vm_start;
240	struct us122l	*us122l = hw->private_data;
241	unsigned long offset;
242	struct usb_stream *s;
243	int err = 0;
244	bool read;
245
246	offset = area->vm_pgoff << PAGE_SHIFT;
247	mutex_lock(&us122l->mutex);
248	s = us122l->sk.s;
249	read = offset < s->read_size;
250	if (read && area->vm_flags & VM_WRITE) {
251		err = -EPERM;
252		goto out;
253	}
254	snd_printdd(KERN_DEBUG "%lu %u\n", size,
255		    read ? s->read_size : s->write_size);
256	/* if userspace tries to mmap beyond end of our buffer, fail */
257	if (size > PAGE_ALIGN(read ? s->read_size : s->write_size)) {
258		snd_printk(KERN_WARNING "%lu > %u\n", size,
259			   read ? s->read_size : s->write_size);
260		err = -EINVAL;
261		goto out;
262	}
263
264	area->vm_ops = &usb_stream_hwdep_vm_ops;
265	area->vm_flags |= VM_RESERVED;
266	area->vm_private_data = us122l;
267	atomic_inc(&us122l->mmap_count);
268out:
269	mutex_unlock(&us122l->mutex);
270	return err;
271}
272
273static unsigned int usb_stream_hwdep_poll(struct snd_hwdep *hw,
274					  struct file *file, poll_table *wait)
275{
276	struct us122l	*us122l = hw->private_data;
277	unsigned	*polled;
278	unsigned int	mask;
279
280	poll_wait(file, &us122l->sk.sleep, wait);
281
282	mask = POLLIN | POLLOUT | POLLWRNORM | POLLERR;
283	if (mutex_trylock(&us122l->mutex)) {
284		struct usb_stream *s = us122l->sk.s;
285		if (s && s->state == usb_stream_ready) {
286			if (us122l->first == file)
287				polled = &s->periods_polled;
288			else
289				polled = &us122l->second_periods_polled;
290			if (*polled != s->periods_done) {
291				*polled = s->periods_done;
292				mask = POLLIN | POLLOUT | POLLWRNORM;
293			} else
294				mask = 0;
295		}
296		mutex_unlock(&us122l->mutex);
297	}
298	return mask;
299}
300
301static void us122l_stop(struct us122l *us122l)
302{
303	struct list_head *p;
304	list_for_each(p, &us122l->midi_list)
305		snd_usbmidi_input_stop(p);
306
307	usb_stream_stop(&us122l->sk);
308	usb_stream_free(&us122l->sk);
309}
310
311static int us122l_set_sample_rate(struct usb_device *dev, int rate)
312{
313	unsigned int ep = 0x81;
314	unsigned char data[3];
315	int err;
316
317	data[0] = rate;
318	data[1] = rate >> 8;
319	data[2] = rate >> 16;
320	err = us122l_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC_SET_CUR,
321			     USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT,
322			     UAC_EP_CS_ATTR_SAMPLE_RATE << 8, ep, data, 3, 1000);
323	if (err < 0)
324		snd_printk(KERN_ERR "%d: cannot set freq %d to ep 0x%x\n",
325			   dev->devnum, rate, ep);
326	return err;
327}
328
329static bool us122l_start(struct us122l *us122l,
330			 unsigned rate, unsigned period_frames)
331{
332	struct list_head *p;
333	int err;
334	unsigned use_packsize = 0;
335	bool success = false;
336
337	if (us122l->dev->speed == USB_SPEED_HIGH) {
338		/* The us-122l's descriptor defaults to iso max_packsize 78,
339		   which isn't needed for samplerates <= 48000.
340		   Lets save some memory:
341		*/
342		switch (rate) {
343		case 44100:
344			use_packsize = 36;
345			break;
346		case 48000:
347			use_packsize = 42;
348			break;
349		case 88200:
350			use_packsize = 72;
351			break;
352		}
353	}
354	if (!usb_stream_new(&us122l->sk, us122l->dev, 1, 2,
355			    rate, use_packsize, period_frames, 6))
356		goto out;
357
358	err = us122l_set_sample_rate(us122l->dev, rate);
359	if (err < 0) {
360		us122l_stop(us122l);
361		snd_printk(KERN_ERR "us122l_set_sample_rate error \n");
362		goto out;
363	}
364	err = usb_stream_start(&us122l->sk);
365	if (err < 0) {
366		us122l_stop(us122l);
367		snd_printk(KERN_ERR "us122l_start error %i \n", err);
368		goto out;
369	}
370	list_for_each(p, &us122l->midi_list)
371		snd_usbmidi_input_start(p);
372	success = true;
373out:
374	return success;
375}
376
377static int usb_stream_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
378				  unsigned cmd, unsigned long arg)
379{
380	struct usb_stream_config *cfg;
381	struct us122l *us122l = hw->private_data;
382	struct usb_stream *s;
383	unsigned min_period_frames;
384	int err = 0;
385	bool high_speed;
386
387	if (cmd != SNDRV_USB_STREAM_IOCTL_SET_PARAMS)
388		return -ENOTTY;
389
390	cfg = memdup_user((void *)arg, sizeof(*cfg));
391	if (IS_ERR(cfg))
392		return PTR_ERR(cfg);
393
394	if (cfg->version != USB_STREAM_INTERFACE_VERSION) {
395		err = -ENXIO;
396		goto free;
397	}
398	high_speed = us122l->dev->speed == USB_SPEED_HIGH;
399	if ((cfg->sample_rate != 44100 && cfg->sample_rate != 48000  &&
400	     (!high_speed ||
401	      (cfg->sample_rate != 88200 && cfg->sample_rate != 96000))) ||
402	    cfg->frame_size != 6 ||
403	    cfg->period_frames > 0x3000) {
404		err = -EINVAL;
405		goto free;
406	}
407	switch (cfg->sample_rate) {
408	case 44100:
409		min_period_frames = 48;
410		break;
411	case 48000:
412		min_period_frames = 52;
413		break;
414	default:
415		min_period_frames = 104;
416		break;
417	}
418	if (!high_speed)
419		min_period_frames <<= 1;
420	if (cfg->period_frames < min_period_frames) {
421		err = -EINVAL;
422		goto free;
423	}
424
425	snd_power_wait(hw->card, SNDRV_CTL_POWER_D0);
426
427	mutex_lock(&us122l->mutex);
428	s = us122l->sk.s;
429	if (!us122l->master)
430		us122l->master = file;
431	else if (us122l->master != file) {
432		if (!s || memcmp(cfg, &s->cfg, sizeof(*cfg))) {
433			err = -EIO;
434			goto unlock;
435		}
436		us122l->slave = file;
437	}
438	if (!s || memcmp(cfg, &s->cfg, sizeof(*cfg)) ||
439	    s->state == usb_stream_xrun) {
440		us122l_stop(us122l);
441		if (!us122l_start(us122l, cfg->sample_rate, cfg->period_frames))
442			err = -EIO;
443		else
444			err = 1;
445	}
446unlock:
447	mutex_unlock(&us122l->mutex);
448free:
449	kfree(cfg);
450	wake_up_all(&us122l->sk.sleep);
451	return err;
452}
453
454#define SND_USB_STREAM_ID "USB STREAM"
455static int usb_stream_hwdep_new(struct snd_card *card)
456{
457	int err;
458	struct snd_hwdep *hw;
459	struct usb_device *dev = US122L(card)->dev;
460
461	err = snd_hwdep_new(card, SND_USB_STREAM_ID, 0, &hw);
462	if (err < 0)
463		return err;
464
465	hw->iface = SNDRV_HWDEP_IFACE_USB_STREAM;
466	hw->private_data = US122L(card);
467	hw->ops.open = usb_stream_hwdep_open;
468	hw->ops.release = usb_stream_hwdep_release;
469	hw->ops.ioctl = usb_stream_hwdep_ioctl;
470	hw->ops.ioctl_compat = usb_stream_hwdep_ioctl;
471	hw->ops.mmap = usb_stream_hwdep_mmap;
472	hw->ops.poll = usb_stream_hwdep_poll;
473
474	sprintf(hw->name, "/proc/bus/usb/%03d/%03d/hwdeppcm",
475		dev->bus->busnum, dev->devnum);
476	return 0;
477}
478
479
480static bool us122l_create_card(struct snd_card *card)
481{
482	int err;
483	struct us122l *us122l = US122L(card);
484
485	if (us122l->dev->descriptor.idProduct == USB_ID_US144 ||
486	    us122l->dev->descriptor.idProduct == USB_ID_US144MKII) {
487		err = usb_set_interface(us122l->dev, 0, 1);
488		if (err) {
489			snd_printk(KERN_ERR "usb_set_interface error \n");
490			return false;
491		}
492	}
493	err = usb_set_interface(us122l->dev, 1, 1);
494	if (err) {
495		snd_printk(KERN_ERR "usb_set_interface error \n");
496		return false;
497	}
498
499	pt_info_set(us122l->dev, 0x11);
500	pt_info_set(us122l->dev, 0x10);
501
502	if (!us122l_start(us122l, 44100, 256))
503		return false;
504
505	if (us122l->dev->descriptor.idProduct == USB_ID_US144 ||
506	    us122l->dev->descriptor.idProduct == USB_ID_US144MKII)
507		err = us144_create_usbmidi(card);
508	else
509		err = us122l_create_usbmidi(card);
510	if (err < 0) {
511		snd_printk(KERN_ERR "us122l_create_usbmidi error %i \n", err);
512		us122l_stop(us122l);
513		return false;
514	}
515	err = usb_stream_hwdep_new(card);
516	if (err < 0) {
517/* release the midi resources */
518		struct list_head *p;
519		list_for_each(p, &us122l->midi_list)
520			snd_usbmidi_disconnect(p);
521
522		us122l_stop(us122l);
523		return false;
524	}
525	return true;
526}
527
528static void snd_us122l_free(struct snd_card *card)
529{
530	struct us122l	*us122l = US122L(card);
531	int		index = us122l->card_index;
532	if (index >= 0  &&  index < SNDRV_CARDS)
533		snd_us122l_card_used[index] = 0;
534}
535
536static int usx2y_create_card(struct usb_device *device, struct snd_card **cardp)
537{
538	int		dev;
539	struct snd_card *card;
540	int err;
541
542	for (dev = 0; dev < SNDRV_CARDS; ++dev)
543		if (enable[dev] && !snd_us122l_card_used[dev])
544			break;
545	if (dev >= SNDRV_CARDS)
546		return -ENODEV;
547	err = snd_card_create(index[dev], id[dev], THIS_MODULE,
548			      sizeof(struct us122l), &card);
549	if (err < 0)
550		return err;
551	snd_us122l_card_used[US122L(card)->card_index = dev] = 1;
552	card->private_free = snd_us122l_free;
553	US122L(card)->dev = device;
554	mutex_init(&US122L(card)->mutex);
555	init_waitqueue_head(&US122L(card)->sk.sleep);
556	INIT_LIST_HEAD(&US122L(card)->midi_list);
557	strcpy(card->driver, "USB "NAME_ALLCAPS"");
558	sprintf(card->shortname, "TASCAM "NAME_ALLCAPS"");
559	sprintf(card->longname, "%s (%x:%x if %d at %03d/%03d)",
560		card->shortname,
561		le16_to_cpu(device->descriptor.idVendor),
562		le16_to_cpu(device->descriptor.idProduct),
563		0,
564		US122L(card)->dev->bus->busnum,
565		US122L(card)->dev->devnum
566		);
567	*cardp = card;
568	return 0;
569}
570
571static int us122l_usb_probe(struct usb_interface *intf,
572			    const struct usb_device_id *device_id,
573			    struct snd_card **cardp)
574{
575	struct usb_device *device = interface_to_usbdev(intf);
576	struct snd_card *card;
577	int err;
578
579	err = usx2y_create_card(device, &card);
580	if (err < 0)
581		return err;
582
583	snd_card_set_dev(card, &intf->dev);
584	if (!us122l_create_card(card)) {
585		snd_card_free(card);
586		return -EINVAL;
587	}
588
589	err = snd_card_register(card);
590	if (err < 0) {
591		snd_card_free(card);
592		return err;
593	}
594
595	usb_get_intf(usb_ifnum_to_if(device, 0));
596	usb_get_dev(device);
597	*cardp = card;
598	return 0;
599}
600
601static int snd_us122l_probe(struct usb_interface *intf,
602			    const struct usb_device_id *id)
603{
604	struct usb_device *device = interface_to_usbdev(intf);
605	struct snd_card *card;
606	int err;
607
608	if ((device->descriptor.idProduct == USB_ID_US144 ||
609	     device->descriptor.idProduct == USB_ID_US144MKII)
610		&& device->speed == USB_SPEED_HIGH) {
611		snd_printk(KERN_ERR "disable ehci-hcd to run US-144 \n");
612		return -ENODEV;
613	}
614
615	snd_printdd(KERN_DEBUG"%p:%i\n",
616		    intf, intf->cur_altsetting->desc.bInterfaceNumber);
617	if (intf->cur_altsetting->desc.bInterfaceNumber != 1)
618		return 0;
619
620	err = us122l_usb_probe(usb_get_intf(intf), id, &card);
621	if (err < 0) {
622		usb_put_intf(intf);
623		return err;
624	}
625
626	usb_set_intfdata(intf, card);
627	return 0;
628}
629
630static void snd_us122l_disconnect(struct usb_interface *intf)
631{
632	struct snd_card *card;
633	struct us122l *us122l;
634	struct list_head *p;
635
636	card = usb_get_intfdata(intf);
637	if (!card)
638		return;
639
640	snd_card_disconnect(card);
641
642	us122l = US122L(card);
643	mutex_lock(&us122l->mutex);
644	us122l_stop(us122l);
645	mutex_unlock(&us122l->mutex);
646
647/* release the midi resources */
648	list_for_each(p, &us122l->midi_list) {
649		snd_usbmidi_disconnect(p);
650	}
651
652	usb_put_intf(usb_ifnum_to_if(us122l->dev, 0));
653	usb_put_intf(usb_ifnum_to_if(us122l->dev, 1));
654	usb_put_dev(us122l->dev);
655
656	while (atomic_read(&us122l->mmap_count))
657		msleep(500);
658
659	snd_card_free(card);
660}
661
662static int snd_us122l_suspend(struct usb_interface *intf, pm_message_t message)
663{
664	struct snd_card *card;
665	struct us122l *us122l;
666	struct list_head *p;
667
668	card = usb_get_intfdata(intf);
669	if (!card)
670		return 0;
671	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
672
673	us122l = US122L(card);
674	if (!us122l)
675		return 0;
676
677	list_for_each(p, &us122l->midi_list)
678		snd_usbmidi_input_stop(p);
679
680	mutex_lock(&us122l->mutex);
681	usb_stream_stop(&us122l->sk);
682	mutex_unlock(&us122l->mutex);
683
684	return 0;
685}
686
687static int snd_us122l_resume(struct usb_interface *intf)
688{
689	struct snd_card *card;
690	struct us122l *us122l;
691	struct list_head *p;
692	int err;
693
694	card = usb_get_intfdata(intf);
695	if (!card)
696		return 0;
697
698	us122l = US122L(card);
699	if (!us122l)
700		return 0;
701
702	mutex_lock(&us122l->mutex);
703	/* needed, doesn't restart without: */
704	if (us122l->dev->descriptor.idProduct == USB_ID_US144 ||
705	    us122l->dev->descriptor.idProduct == USB_ID_US144MKII) {
706		err = usb_set_interface(us122l->dev, 0, 1);
707		if (err) {
708			snd_printk(KERN_ERR "usb_set_interface error \n");
709			goto unlock;
710		}
711	}
712	err = usb_set_interface(us122l->dev, 1, 1);
713	if (err) {
714		snd_printk(KERN_ERR "usb_set_interface error \n");
715		goto unlock;
716	}
717
718	pt_info_set(us122l->dev, 0x11);
719	pt_info_set(us122l->dev, 0x10);
720
721	err = us122l_set_sample_rate(us122l->dev,
722				     us122l->sk.s->cfg.sample_rate);
723	if (err < 0) {
724		snd_printk(KERN_ERR "us122l_set_sample_rate error \n");
725		goto unlock;
726	}
727	err = usb_stream_start(&us122l->sk);
728	if (err)
729		goto unlock;
730
731	list_for_each(p, &us122l->midi_list)
732		snd_usbmidi_input_start(p);
733unlock:
734	mutex_unlock(&us122l->mutex);
735	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
736	return err;
737}
738
739static struct usb_device_id snd_us122l_usb_id_table[] = {
740	{
741		.match_flags =	USB_DEVICE_ID_MATCH_DEVICE,
742		.idVendor =	0x0644,
743		.idProduct =	USB_ID_US122L
744	},
745	{	/* US-144 only works at USB1.1! Disable module ehci-hcd. */
746		.match_flags =	USB_DEVICE_ID_MATCH_DEVICE,
747		.idVendor =	0x0644,
748		.idProduct =	USB_ID_US144
749	},
750	{
751		.match_flags =	USB_DEVICE_ID_MATCH_DEVICE,
752		.idVendor =	0x0644,
753		.idProduct =	USB_ID_US122MKII
754	},
755	{
756		.match_flags =	USB_DEVICE_ID_MATCH_DEVICE,
757		.idVendor =	0x0644,
758		.idProduct =	USB_ID_US144MKII
759	},
760	{ /* terminator */ }
761};
762
763MODULE_DEVICE_TABLE(usb, snd_us122l_usb_id_table);
764static struct usb_driver snd_us122l_usb_driver = {
765	.name =		"snd-usb-us122l",
766	.probe =	snd_us122l_probe,
767	.disconnect =	snd_us122l_disconnect,
768	.suspend =	snd_us122l_suspend,
769	.resume =	snd_us122l_resume,
770	.reset_resume =	snd_us122l_resume,
771	.id_table =	snd_us122l_usb_id_table,
772	.supports_autosuspend = 1
773};
774
775module_usb_driver(snd_us122l_usb_driver);