aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2015-01-19 09:54:00 -0500
committerTakashi Iwai <tiwai@suse.de>2015-01-20 02:17:16 -0500
commit85a9339becf0af4d547ceb6bb16d1893b05fbce4 (patch)
tree0f25a3def6f9aeca37f942c4aa70b88772a48259 /sound
parent84ac9bb12e8158e1affad4ae7718eb653fa5e36d (diff)
ALSA: line6: Reorganize card resource handling
This is a fairly big rewrite regarding the card resource management in line6 drivers: - The card creation is moved into line6_probe(). This adds the global destructor to private_free, so that each driver doesn't have to call it any longer. - The USB disconnect callback handles the card release, thus each driver needs to concentrate on only its own resources. No need to snd_card_*() call in the destructor. - Fix the potential stall in disconnection by removing snd_card_free(). It's replaced with snd_card_free_when_closed() for asynchronous release. - The only remaining operation for the card in each driver is the call of snd_card_register(). All the rest are dealt in the common module by itself. - These ended up with removal of audio.[ch] as a result of a reduction of one layer. Each driver just needs to call line6_probe(). Tested-by: Chris Rorvick <chris@rorvick.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/usb/line6/Makefile1
-rw-r--r--sound/usb/line6/audio.c74
-rw-r--r--sound/usb/line6/audio.h21
-rw-r--r--sound/usb/line6/capture.c1
-rw-r--r--sound/usb/line6/driver.c82
-rw-r--r--sound/usb/line6/midi.c1
-rw-r--r--sound/usb/line6/pcm.c1
-rw-r--r--sound/usb/line6/playback.c1
-rw-r--r--sound/usb/line6/pod.c60
-rw-r--r--sound/usb/line6/podhd.c75
-rw-r--r--sound/usb/line6/toneport.c65
-rw-r--r--sound/usb/line6/variax.c58
12 files changed, 85 insertions, 355 deletions
diff --git a/sound/usb/line6/Makefile b/sound/usb/line6/Makefile
index fa3a78dac097..b8b3b2a543d8 100644
--- a/sound/usb/line6/Makefile
+++ b/sound/usb/line6/Makefile
@@ -1,5 +1,4 @@
1snd-usb-line6-y := \ 1snd-usb-line6-y := \
2 audio.o \
3 capture.o \ 2 capture.o \
4 driver.o \ 3 driver.o \
5 midi.o \ 4 midi.o \
diff --git a/sound/usb/line6/audio.c b/sound/usb/line6/audio.c
deleted file mode 100644
index 95686e5af4bd..000000000000
--- a/sound/usb/line6/audio.c
+++ /dev/null
@@ -1,74 +0,0 @@
1/*
2 * Line6 Linux USB driver - 0.9.1beta
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 <sound/core.h>
13#include <sound/initval.h>
14#include <linux/export.h>
15
16#include "driver.h"
17#include "audio.h"
18
19/*
20 Initialize the Line6 USB audio system.
21*/
22int line6_init_audio(struct usb_line6 *line6)
23{
24 struct snd_card *card;
25 int err;
26
27 err = snd_card_new(line6->ifcdev,
28 SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
29 THIS_MODULE, 0, &card);
30 if (err < 0)
31 return err;
32
33 line6->card = card;
34
35 strcpy(card->id, line6->properties->id);
36 strcpy(card->driver, DRIVER_NAME);
37 strcpy(card->shortname, line6->properties->name);
38 /* longname is 80 chars - see asound.h */
39 sprintf(card->longname, "Line6 %s at USB %s", line6->properties->name,
40 dev_name(line6->ifcdev));
41 return 0;
42}
43EXPORT_SYMBOL_GPL(line6_init_audio);
44
45/*
46 Register the Line6 USB audio system.
47*/
48int line6_register_audio(struct usb_line6 *line6)
49{
50 int err;
51
52 err = snd_card_register(line6->card);
53 if (err < 0)
54 return err;
55
56 return 0;
57}
58EXPORT_SYMBOL_GPL(line6_register_audio);
59
60/*
61 Cleanup the Line6 USB audio system.
62*/
63void line6_cleanup_audio(struct usb_line6 *line6)
64{
65 struct snd_card *card = line6->card;
66
67 if (card == NULL)
68 return;
69
70 snd_card_disconnect(card);
71 snd_card_free(card);
72 line6->card = NULL;
73}
74EXPORT_SYMBOL_GPL(line6_cleanup_audio);
diff --git a/sound/usb/line6/audio.h b/sound/usb/line6/audio.h
deleted file mode 100644
index 5f8a09a0fa95..000000000000
--- a/sound/usb/line6/audio.h
+++ /dev/null
@@ -1,21 +0,0 @@
1/*
2 * Line6 Linux USB driver - 0.9.1beta
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#ifndef AUDIO_H
13#define AUDIO_H
14
15#include "driver.h"
16
17extern void line6_cleanup_audio(struct usb_line6 *);
18extern int line6_init_audio(struct usb_line6 *);
19extern int line6_register_audio(struct usb_line6 *);
20
21#endif
diff --git a/sound/usb/line6/capture.c b/sound/usb/line6/capture.c
index 727b31876d48..e8c54ede9227 100644
--- a/sound/usb/line6/capture.c
+++ b/sound/usb/line6/capture.c
@@ -14,7 +14,6 @@
14#include <sound/pcm.h> 14#include <sound/pcm.h>
15#include <sound/pcm_params.h> 15#include <sound/pcm_params.h>
16 16
17#include "audio.h"
18#include "capture.h" 17#include "capture.h"
19#include "driver.h" 18#include "driver.h"
20#include "pcm.h" 19#include "pcm.h"
diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c
index b8f5134dcec2..8b6a658a8a58 100644
--- a/sound/usb/line6/driver.c
+++ b/sound/usb/line6/driver.c
@@ -15,7 +15,9 @@
15#include <linux/slab.h> 15#include <linux/slab.h>
16#include <linux/usb.h> 16#include <linux/usb.h>
17 17
18#include "audio.h" 18#include <sound/core.h>
19#include <sound/initval.h>
20
19#include "capture.h" 21#include "capture.h"
20#include "driver.h" 22#include "driver.h"
21#include "midi.h" 23#include "midi.h"
@@ -481,17 +483,16 @@ ssize_t line6_nop_read(struct device *dev, struct device_attribute *attr,
481EXPORT_SYMBOL_GPL(line6_nop_read); 483EXPORT_SYMBOL_GPL(line6_nop_read);
482 484
483/* 485/*
484 Generic destructor. 486 Card destructor.
485*/ 487*/
486static void line6_destruct(struct usb_interface *interface) 488static void line6_destruct(struct snd_card *card)
487{ 489{
488 struct usb_line6 *line6; 490 struct usb_line6 *line6 = card->private_data;
491 struct usb_device *usbdev;
489 492
490 if (interface == NULL) 493 if (!line6)
491 return;
492 line6 = usb_get_intfdata(interface);
493 if (line6 == NULL)
494 return; 494 return;
495 usbdev = line6->usbdev;
495 496
496 /* free buffer memory first: */ 497 /* free buffer memory first: */
497 kfree(line6->buffer_message); 498 kfree(line6->buffer_message);
@@ -500,8 +501,11 @@ static void line6_destruct(struct usb_interface *interface)
500 /* then free URBs: */ 501 /* then free URBs: */
501 usb_free_urb(line6->urb_listen); 502 usb_free_urb(line6->urb_listen);
502 503
503 /* make sure the device isn't destructed twice: */ 504 /* free interface data: */
504 usb_set_intfdata(interface, NULL); 505 kfree(line6);
506
507 /* decrement reference counters: */
508 usb_put_dev(usbdev);
505} 509}
506 510
507/* 511/*
@@ -513,6 +517,7 @@ int line6_probe(struct usb_interface *interface,
513 int (*private_init)(struct usb_interface *, struct usb_line6 *)) 517 int (*private_init)(struct usb_interface *, struct usb_line6 *))
514{ 518{
515 struct usb_device *usbdev; 519 struct usb_device *usbdev;
520 struct snd_card *card;
516 int interface_number; 521 int interface_number;
517 int ret; 522 int ret;
518 523
@@ -569,8 +574,26 @@ int line6_probe(struct usb_interface *interface,
569 } 574 }
570 } 575 }
571 576
577 ret = snd_card_new(line6->ifcdev,
578 SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
579 THIS_MODULE, 0, &card);
580 if (ret < 0)
581 goto err_put;
582
583 line6->card = card;
584 strcpy(card->id, line6->properties->id);
585 strcpy(card->driver, DRIVER_NAME);
586 strcpy(card->shortname, line6->properties->name);
587 sprintf(card->longname, "Line6 %s at USB %s", line6->properties->name,
588 dev_name(line6->ifcdev));
589 card->private_data = line6;
590 card->private_free = line6_destruct;
591
572 usb_set_intfdata(interface, line6); 592 usb_set_intfdata(interface, line6);
573 593
594 /* increment reference counters: */
595 usb_get_dev(usbdev);
596
574 if (properties->capabilities & LINE6_CAP_CONTROL) { 597 if (properties->capabilities & LINE6_CAP_CONTROL) {
575 /* initialize USB buffers: */ 598 /* initialize USB buffers: */
576 line6->buffer_listen = 599 line6->buffer_listen =
@@ -612,15 +635,11 @@ int line6_probe(struct usb_interface *interface,
612 dev_info(&interface->dev, "Line6 %s now attached\n", 635 dev_info(&interface->dev, "Line6 %s now attached\n",
613 line6->properties->name); 636 line6->properties->name);
614 637
615 /* increment reference counters: */
616 usb_get_intf(interface);
617 usb_get_dev(usbdev);
618
619 return 0; 638 return 0;
620 639
621err_destruct: 640 err_destruct:
622 line6_destruct(interface); 641 snd_card_free(card);
623err_put: 642 err_put:
624 return ret; 643 return ret;
625} 644}
626EXPORT_SYMBOL_GPL(line6_probe); 645EXPORT_SYMBOL_GPL(line6_probe);
@@ -642,29 +661,26 @@ void line6_disconnect(struct usb_interface *interface)
642 661
643 interface_number = interface->cur_altsetting->desc.bInterfaceNumber; 662 interface_number = interface->cur_altsetting->desc.bInterfaceNumber;
644 line6 = usb_get_intfdata(interface); 663 line6 = usb_get_intfdata(interface);
664 if (!line6)
665 return;
645 666
646 if (line6 != NULL) { 667 if (line6->urb_listen != NULL)
647 if (line6->urb_listen != NULL) 668 line6_stop_listen(line6);
648 line6_stop_listen(line6);
649 669
650 if (usbdev != line6->usbdev) 670 if (usbdev != line6->usbdev)
651 dev_err(line6->ifcdev, 671 dev_err(line6->ifcdev, "driver bug: inconsistent usb device\n");
652 "driver bug: inconsistent usb device\n");
653 672
673 snd_card_disconnect(line6->card);
674 if (line6->disconnect)
654 line6->disconnect(interface); 675 line6->disconnect(interface);
655 676
656 dev_info(&interface->dev, "Line6 %s now disconnected\n", 677 dev_info(&interface->dev, "Line6 %s now disconnected\n",
657 line6->properties->name); 678 line6->properties->name);
658 }
659
660 line6_destruct(interface);
661 679
662 /* free interface data: */ 680 /* make sure the device isn't destructed twice: */
663 kfree(line6); 681 usb_set_intfdata(interface, NULL);
664 682
665 /* decrement reference counters: */ 683 snd_card_free_when_closed(line6->card);
666 usb_put_intf(interface);
667 usb_put_dev(usbdev);
668} 684}
669EXPORT_SYMBOL_GPL(line6_disconnect); 685EXPORT_SYMBOL_GPL(line6_disconnect);
670 686
diff --git a/sound/usb/line6/midi.c b/sound/usb/line6/midi.c
index f333cef5d2d7..68793cc5dc1e 100644
--- a/sound/usb/line6/midi.c
+++ b/sound/usb/line6/midi.c
@@ -15,7 +15,6 @@
15#include <sound/core.h> 15#include <sound/core.h>
16#include <sound/rawmidi.h> 16#include <sound/rawmidi.h>
17 17
18#include "audio.h"
19#include "driver.h" 18#include "driver.h"
20#include "midi.h" 19#include "midi.h"
21#include "usbdefs.h" 20#include "usbdefs.h"
diff --git a/sound/usb/line6/pcm.c b/sound/usb/line6/pcm.c
index edab3cd7c048..1e77d0d9da17 100644
--- a/sound/usb/line6/pcm.c
+++ b/sound/usb/line6/pcm.c
@@ -16,7 +16,6 @@
16#include <sound/pcm.h> 16#include <sound/pcm.h>
17#include <sound/pcm_params.h> 17#include <sound/pcm_params.h>
18 18
19#include "audio.h"
20#include "capture.h" 19#include "capture.h"
21#include "driver.h" 20#include "driver.h"
22#include "playback.h" 21#include "playback.h"
diff --git a/sound/usb/line6/playback.c b/sound/usb/line6/playback.c
index 5a7fe409a3b9..ec2384c875a7 100644
--- a/sound/usb/line6/playback.c
+++ b/sound/usb/line6/playback.c
@@ -14,7 +14,6 @@
14#include <sound/pcm.h> 14#include <sound/pcm.h>
15#include <sound/pcm_params.h> 15#include <sound/pcm_params.h>
16 16
17#include "audio.h"
18#include "capture.h" 17#include "capture.h"
19#include "driver.h" 18#include "driver.h"
20#include "pcm.h" 19#include "pcm.h"
diff --git a/sound/usb/line6/pod.c b/sound/usb/line6/pod.c
index d6bc5a1ab7f4..6b30deb6b157 100644
--- a/sound/usb/line6/pod.c
+++ b/sound/usb/line6/pod.c
@@ -18,7 +18,6 @@
18#include <sound/core.h> 18#include <sound/core.h>
19#include <sound/control.h> 19#include <sound/control.h>
20 20
21#include "audio.h"
22#include "capture.h" 21#include "capture.h"
23#include "driver.h" 22#include "driver.h"
24#include "playback.h" 23#include "playback.h"
@@ -340,7 +339,7 @@ static void pod_startup4(struct work_struct *work)
340 line6_read_serial_number(&pod->line6, &pod->serial_number); 339 line6_read_serial_number(&pod->line6, &pod->serial_number);
341 340
342 /* ALSA audio interface: */ 341 /* ALSA audio interface: */
343 line6_register_audio(line6); 342 snd_card_register(line6->card);
344} 343}
345 344
346/* POD special files: */ 345/* POD special files: */
@@ -398,21 +397,6 @@ static struct snd_kcontrol_new pod_control_monitor = {
398}; 397};
399 398
400/* 399/*
401 POD destructor.
402*/
403static void pod_destruct(struct usb_interface *interface)
404{
405 struct usb_line6_pod *pod = usb_get_intfdata(interface);
406
407 if (pod == NULL)
408 return;
409 line6_cleanup_audio(&pod->line6);
410
411 del_timer(&pod->startup_timer);
412 cancel_work_sync(&pod->startup_work);
413}
414
415/*
416 POD device disconnected. 400 POD device disconnected.
417*/ 401*/
418static void line6_pod_disconnect(struct usb_interface *interface) 402static void line6_pod_disconnect(struct usb_interface *interface)
@@ -424,21 +408,18 @@ static void line6_pod_disconnect(struct usb_interface *interface)
424 pod = usb_get_intfdata(interface); 408 pod = usb_get_intfdata(interface);
425 409
426 if (pod != NULL) { 410 if (pod != NULL) {
427 struct snd_line6_pcm *line6pcm = pod->line6.line6pcm;
428 struct device *dev = &interface->dev; 411 struct device *dev = &interface->dev;
429 412
430 if (line6pcm != NULL)
431 line6_pcm_disconnect(line6pcm);
432
433 if (dev != NULL) { 413 if (dev != NULL) {
434 /* remove sysfs entries: */ 414 /* remove sysfs entries: */
435 device_remove_file(dev, &dev_attr_device_id); 415 device_remove_file(dev, &dev_attr_device_id);
436 device_remove_file(dev, &dev_attr_firmware_version); 416 device_remove_file(dev, &dev_attr_firmware_version);
437 device_remove_file(dev, &dev_attr_serial_number); 417 device_remove_file(dev, &dev_attr_serial_number);
438 } 418 }
439 }
440 419
441 pod_destruct(interface); 420 del_timer_sync(&pod->startup_timer);
421 cancel_work_sync(&pod->startup_work);
422 }
442} 423}
443 424
444/* 425/*
@@ -457,8 +438,8 @@ static int pod_create_files2(struct device *dev)
457/* 438/*
458 Try to init POD device. 439 Try to init POD device.
459*/ 440*/
460static int pod_try_init(struct usb_interface *interface, 441static int pod_init(struct usb_interface *interface,
461 struct usb_line6 *line6) 442 struct usb_line6 *line6)
462{ 443{
463 int err; 444 int err;
464 struct usb_line6_pod *pod = (struct usb_line6_pod *) line6; 445 struct usb_line6_pod *pod = (struct usb_line6_pod *) line6;
@@ -477,11 +458,6 @@ static int pod_try_init(struct usb_interface *interface,
477 if (err < 0) 458 if (err < 0)
478 return err; 459 return err;
479 460
480 /* initialize audio system: */
481 err = line6_init_audio(line6);
482 if (err < 0)
483 return err;
484
485 /* initialize MIDI subsystem: */ 461 /* initialize MIDI subsystem: */
486 err = line6_init_midi(line6); 462 err = line6_init_midi(line6);
487 if (err < 0) 463 if (err < 0)
@@ -514,20 +490,6 @@ static int pod_try_init(struct usb_interface *interface,
514 return 0; 490 return 0;
515} 491}
516 492
517/*
518 Init POD device (and clean up in case of failure).
519*/
520static int pod_init(struct usb_interface *interface,
521 struct usb_line6 *line6)
522{
523 int err = pod_try_init(interface, line6);
524
525 if (err < 0)
526 pod_destruct(interface);
527
528 return err;
529}
530
531#define LINE6_DEVICE(prod) USB_DEVICE(0x0e41, prod) 493#define LINE6_DEVICE(prod) USB_DEVICE(0x0e41, prod)
532#define LINE6_IF_NUM(prod, n) USB_DEVICE_INTERFACE_NUMBER(0x0e41, prod, n) 494#define LINE6_IF_NUM(prod, n) USB_DEVICE_INTERFACE_NUMBER(0x0e41, prod, n)
533 495
@@ -636,17 +598,13 @@ static int pod_probe(struct usb_interface *interface,
636 const struct usb_device_id *id) 598 const struct usb_device_id *id)
637{ 599{
638 struct usb_line6_pod *pod; 600 struct usb_line6_pod *pod;
639 int err;
640 601
641 pod = kzalloc(sizeof(*pod), GFP_KERNEL); 602 pod = kzalloc(sizeof(*pod), GFP_KERNEL);
642 if (!pod) 603 if (!pod)
643 return -ENODEV; 604 return -ENODEV;
644 err = line6_probe(interface, &pod->line6, 605 return line6_probe(interface, &pod->line6,
645 &pod_properties_table[id->driver_info], 606 &pod_properties_table[id->driver_info],
646 pod_init); 607 pod_init);
647 if (err < 0)
648 kfree(pod);
649 return err;
650} 608}
651 609
652static struct usb_driver pod_driver = { 610static struct usb_driver pod_driver = {
diff --git a/sound/usb/line6/podhd.c b/sound/usb/line6/podhd.c
index 8f4ca1d20b62..1d11185780e3 100644
--- a/sound/usb/line6/podhd.c
+++ b/sound/usb/line6/podhd.c
@@ -15,7 +15,6 @@
15#include <sound/core.h> 15#include <sound/core.h>
16#include <sound/pcm.h> 16#include <sound/pcm.h>
17 17
18#include "audio.h"
19#include "driver.h" 18#include "driver.h"
20#include "pcm.h" 19#include "pcm.h"
21#include "usbdefs.h" 20#include "usbdefs.h"
@@ -86,57 +85,17 @@ static struct line6_pcm_properties podhd_pcm_properties = {
86}; 85};
87 86
88/* 87/*
89 POD HD destructor.
90*/
91static void podhd_destruct(struct usb_interface *interface)
92{
93 struct usb_line6_podhd *podhd = usb_get_intfdata(interface);
94
95 if (podhd == NULL)
96 return;
97 line6_cleanup_audio(&podhd->line6);
98}
99
100/*
101 POD HD device disconnected.
102*/
103static void line6_podhd_disconnect(struct usb_interface *interface)
104{
105 struct usb_line6_podhd *podhd;
106
107 if (interface == NULL)
108 return;
109 podhd = usb_get_intfdata(interface);
110
111 if (podhd != NULL) {
112 struct snd_line6_pcm *line6pcm = podhd->line6.line6pcm;
113
114 if (line6pcm != NULL)
115 line6_pcm_disconnect(line6pcm);
116 }
117
118 podhd_destruct(interface);
119}
120
121/*
122 Try to init POD HD device. 88 Try to init POD HD device.
123*/ 89*/
124static int podhd_try_init(struct usb_interface *interface, 90static int podhd_init(struct usb_interface *interface,
125 struct usb_line6_podhd *podhd) 91 struct usb_line6 *line6)
126{ 92{
93 struct usb_line6_podhd *podhd = (struct usb_line6_podhd *) line6;
127 int err; 94 int err;
128 struct usb_line6 *line6 = &podhd->line6;
129 95
130 if ((interface == NULL) || (podhd == NULL)) 96 if ((interface == NULL) || (podhd == NULL))
131 return -ENODEV; 97 return -ENODEV;
132 98
133 line6->disconnect = line6_podhd_disconnect;
134
135 /* initialize audio system: */
136 err = line6_init_audio(line6);
137 if (err < 0)
138 return err;
139
140 /* initialize MIDI subsystem: */ 99 /* initialize MIDI subsystem: */
141 err = line6_init_midi(line6); 100 err = line6_init_midi(line6);
142 if (err < 0) 101 if (err < 0)
@@ -148,8 +107,7 @@ static int podhd_try_init(struct usb_interface *interface,
148 return err; 107 return err;
149 108
150 /* register USB audio system: */ 109 /* register USB audio system: */
151 err = line6_register_audio(line6); 110 return snd_card_register(line6->card);
152 return err;
153} 111}
154 112
155#define LINE6_DEVICE(prod) USB_DEVICE(0x0e41, prod) 113#define LINE6_DEVICE(prod) USB_DEVICE(0x0e41, prod)
@@ -218,38 +176,19 @@ static const struct line6_properties podhd_properties_table[] = {
218}; 176};
219 177
220/* 178/*
221 Init POD HD device (and clean up in case of failure).
222*/
223static int podhd_init(struct usb_interface *interface,
224 struct usb_line6 *line6)
225{
226 struct usb_line6_podhd *podhd = (struct usb_line6_podhd *) line6;
227 int err = podhd_try_init(interface, podhd);
228
229 if (err < 0)
230 podhd_destruct(interface);
231
232 return err;
233}
234
235/*
236 Probe USB device. 179 Probe USB device.
237*/ 180*/
238static int podhd_probe(struct usb_interface *interface, 181static int podhd_probe(struct usb_interface *interface,
239 const struct usb_device_id *id) 182 const struct usb_device_id *id)
240{ 183{
241 struct usb_line6_podhd *podhd; 184 struct usb_line6_podhd *podhd;
242 int err;
243 185
244 podhd = kzalloc(sizeof(*podhd), GFP_KERNEL); 186 podhd = kzalloc(sizeof(*podhd), GFP_KERNEL);
245 if (!podhd) 187 if (!podhd)
246 return -ENODEV; 188 return -ENODEV;
247 err = line6_probe(interface, &podhd->line6, 189 return line6_probe(interface, &podhd->line6,
248 &podhd_properties_table[id->driver_info], 190 &podhd_properties_table[id->driver_info],
249 podhd_init); 191 podhd_init);
250 if (err < 0)
251 kfree(podhd);
252 return err;
253} 192}
254 193
255static struct usb_driver podhd_driver = { 194static struct usb_driver podhd_driver = {
diff --git a/sound/usb/line6/toneport.c b/sound/usb/line6/toneport.c
index 6ec3268a6153..3097a75a9bec 100644
--- a/sound/usb/line6/toneport.c
+++ b/sound/usb/line6/toneport.c
@@ -17,7 +17,6 @@
17#include <sound/core.h> 17#include <sound/core.h>
18#include <sound/control.h> 18#include <sound/control.h>
19 19
20#include "audio.h"
21#include "capture.h" 20#include "capture.h"
22#include "driver.h" 21#include "driver.h"
23#include "playback.h" 22#include "playback.h"
@@ -331,18 +330,6 @@ static struct snd_kcontrol_new toneport_control_source = {
331}; 330};
332 331
333/* 332/*
334 Toneport destructor.
335*/
336static void toneport_destruct(struct usb_interface *interface)
337{
338 struct usb_line6_toneport *toneport = usb_get_intfdata(interface);
339
340 if (toneport == NULL)
341 return;
342 line6_cleanup_audio(&toneport->line6);
343}
344
345/*
346 Setup Toneport device. 333 Setup Toneport device.
347*/ 334*/
348static void toneport_setup(struct usb_line6_toneport *toneport) 335static void toneport_setup(struct usb_line6_toneport *toneport)
@@ -394,25 +381,14 @@ static void line6_toneport_disconnect(struct usb_interface *interface)
394 device_remove_file(&interface->dev, &dev_attr_led_red); 381 device_remove_file(&interface->dev, &dev_attr_led_red);
395 device_remove_file(&interface->dev, &dev_attr_led_green); 382 device_remove_file(&interface->dev, &dev_attr_led_green);
396 } 383 }
397
398 if (toneport != NULL) {
399 struct snd_line6_pcm *line6pcm = toneport->line6.line6pcm;
400
401 if (line6pcm != NULL) {
402 line6_pcm_release(line6pcm, LINE6_BITS_PCM_MONITOR);
403 line6_pcm_disconnect(line6pcm);
404 }
405 }
406
407 toneport_destruct(interface);
408} 384}
409 385
410 386
411/* 387/*
412 Try to init Toneport device. 388 Try to init Toneport device.
413*/ 389*/
414static int toneport_try_init(struct usb_interface *interface, 390static int toneport_init(struct usb_interface *interface,
415 struct usb_line6 *line6) 391 struct usb_line6 *line6)
416{ 392{
417 int err; 393 int err;
418 struct usb_line6_toneport *toneport = (struct usb_line6_toneport *) line6; 394 struct usb_line6_toneport *toneport = (struct usb_line6_toneport *) line6;
@@ -422,11 +398,6 @@ static int toneport_try_init(struct usb_interface *interface,
422 398
423 line6->disconnect = line6_toneport_disconnect; 399 line6->disconnect = line6_toneport_disconnect;
424 400
425 /* initialize audio system: */
426 err = line6_init_audio(line6);
427 if (err < 0)
428 return err;
429
430 /* initialize PCM subsystem: */ 401 /* initialize PCM subsystem: */
431 err = line6_init_pcm(line6, &toneport_pcm_properties); 402 err = line6_init_pcm(line6, &toneport_pcm_properties);
432 if (err < 0) 403 if (err < 0)
@@ -456,11 +427,6 @@ static int toneport_try_init(struct usb_interface *interface,
456 break; 427 break;
457 } 428 }
458 429
459 /* register audio system: */
460 err = line6_register_audio(line6);
461 if (err < 0)
462 return err;
463
464 line6_read_serial_number(line6, &toneport->serial_number); 430 line6_read_serial_number(line6, &toneport->serial_number);
465 line6_read_data(line6, 0x80c2, &toneport->firmware_version, 1); 431 line6_read_data(line6, 0x80c2, &toneport->firmware_version, 1);
466 432
@@ -477,21 +443,8 @@ static int toneport_try_init(struct usb_interface *interface,
477 (unsigned long)toneport); 443 (unsigned long)toneport);
478 mod_timer(&toneport->timer, jiffies + TONEPORT_PCM_DELAY * HZ); 444 mod_timer(&toneport->timer, jiffies + TONEPORT_PCM_DELAY * HZ);
479 445
480 return 0; 446 /* register audio system: */
481} 447 return snd_card_register(line6->card);
482
483/*
484 Init Toneport device (and clean up in case of failure).
485*/
486static int toneport_init(struct usb_interface *interface,
487 struct usb_line6 *line6)
488{
489 int err = toneport_try_init(interface, line6);
490
491 if (err < 0)
492 toneport_destruct(interface);
493
494 return err;
495} 448}
496 449
497#ifdef CONFIG_PM 450#ifdef CONFIG_PM
@@ -595,18 +548,14 @@ static int toneport_probe(struct usb_interface *interface,
595 const struct usb_device_id *id) 548 const struct usb_device_id *id)
596{ 549{
597 struct usb_line6_toneport *toneport; 550 struct usb_line6_toneport *toneport;
598 int err;
599 551
600 toneport = kzalloc(sizeof(*toneport), GFP_KERNEL); 552 toneport = kzalloc(sizeof(*toneport), GFP_KERNEL);
601 if (!toneport) 553 if (!toneport)
602 return -ENODEV; 554 return -ENODEV;
603 toneport->type = id->driver_info; 555 toneport->type = id->driver_info;
604 err = line6_probe(interface, &toneport->line6, 556 return line6_probe(interface, &toneport->line6,
605 &toneport_properties_table[id->driver_info], 557 &toneport_properties_table[id->driver_info],
606 toneport_init); 558 toneport_init);
607 if (err < 0)
608 kfree(toneport);
609 return err;
610} 559}
611 560
612static struct usb_driver toneport_driver = { 561static struct usb_driver toneport_driver = {
diff --git a/sound/usb/line6/variax.c b/sound/usb/line6/variax.c
index 9a9c7e48e24f..a591c2c5794f 100644
--- a/sound/usb/line6/variax.c
+++ b/sound/usb/line6/variax.c
@@ -16,7 +16,6 @@
16#include <linux/module.h> 16#include <linux/module.h>
17#include <sound/core.h> 17#include <sound/core.h>
18 18
19#include "audio.h"
20#include "driver.h" 19#include "driver.h"
21#include "usbdefs.h" 20#include "usbdefs.h"
22 21
@@ -179,7 +178,7 @@ static void variax_startup6(struct work_struct *work)
179 CHECK_STARTUP_PROGRESS(variax->startup_progress, VARIAX_STARTUP_SETUP); 178 CHECK_STARTUP_PROGRESS(variax->startup_progress, VARIAX_STARTUP_SETUP);
180 179
181 /* ALSA audio interface: */ 180 /* ALSA audio interface: */
182 line6_register_audio(&variax->line6); 181 snd_card_register(variax->line6.card);
183} 182}
184 183
185/* 184/*
@@ -211,13 +210,16 @@ static void line6_variax_process_message(struct usb_line6 *line6)
211/* 210/*
212 Variax destructor. 211 Variax destructor.
213*/ 212*/
214static void variax_destruct(struct usb_interface *interface) 213static void line6_variax_disconnect(struct usb_interface *interface)
215{ 214{
216 struct usb_line6_variax *variax = usb_get_intfdata(interface); 215 struct usb_line6_variax *variax;
216
217 if (!interface)
218 return;
217 219
218 if (variax == NULL) 220 variax = usb_get_intfdata(interface);
221 if (!variax)
219 return; 222 return;
220 line6_cleanup_audio(&variax->line6);
221 223
222 del_timer(&variax->startup_timer1); 224 del_timer(&variax->startup_timer1);
223 del_timer(&variax->startup_timer2); 225 del_timer(&variax->startup_timer2);
@@ -227,21 +229,10 @@ static void variax_destruct(struct usb_interface *interface)
227} 229}
228 230
229/* 231/*
230 Workbench device disconnected.
231*/
232static void line6_variax_disconnect(struct usb_interface *interface)
233{
234 if (interface == NULL)
235 return;
236
237 variax_destruct(interface);
238}
239
240/*
241 Try to init workbench device. 232 Try to init workbench device.
242*/ 233*/
243static int variax_try_init(struct usb_interface *interface, 234static int variax_init(struct usb_interface *interface,
244 struct usb_line6 *line6) 235 struct usb_line6 *line6)
245{ 236{
246 struct usb_line6_variax *variax = (struct usb_line6_variax *) line6; 237 struct usb_line6_variax *variax = (struct usb_line6_variax *) line6;
247 int err; 238 int err;
@@ -263,11 +254,6 @@ static int variax_try_init(struct usb_interface *interface,
263 if (variax->buffer_activate == NULL) 254 if (variax->buffer_activate == NULL)
264 return -ENOMEM; 255 return -ENOMEM;
265 256
266 /* initialize audio system: */
267 err = line6_init_audio(&variax->line6);
268 if (err < 0)
269 return err;
270
271 /* initialize MIDI subsystem: */ 257 /* initialize MIDI subsystem: */
272 err = line6_init_midi(&variax->line6); 258 err = line6_init_midi(&variax->line6);
273 if (err < 0) 259 if (err < 0)
@@ -278,20 +264,6 @@ static int variax_try_init(struct usb_interface *interface,
278 return 0; 264 return 0;
279} 265}
280 266
281/*
282 Init workbench device (and clean up in case of failure).
283*/
284static int variax_init(struct usb_interface *interface,
285 struct usb_line6 *line6)
286{
287 int err = variax_try_init(interface, line6);
288
289 if (err < 0)
290 variax_destruct(interface);
291
292 return err;
293}
294
295#define LINE6_DEVICE(prod) USB_DEVICE(0x0e41, prod) 267#define LINE6_DEVICE(prod) USB_DEVICE(0x0e41, prod)
296#define LINE6_IF_NUM(prod, n) USB_DEVICE_INTERFACE_NUMBER(0x0e41, prod, n) 268#define LINE6_IF_NUM(prod, n) USB_DEVICE_INTERFACE_NUMBER(0x0e41, prod, n)
297 269
@@ -335,17 +307,13 @@ static int variax_probe(struct usb_interface *interface,
335 const struct usb_device_id *id) 307 const struct usb_device_id *id)
336{ 308{
337 struct usb_line6_variax *variax; 309 struct usb_line6_variax *variax;
338 int err;
339 310
340 variax = kzalloc(sizeof(*variax), GFP_KERNEL); 311 variax = kzalloc(sizeof(*variax), GFP_KERNEL);
341 if (!variax) 312 if (!variax)
342 return -ENODEV; 313 return -ENODEV;
343 err = line6_probe(interface, &variax->line6, 314 return line6_probe(interface, &variax->line6,
344 &variax_properties_table[id->driver_info], 315 &variax_properties_table[id->driver_info],
345 variax_init); 316 variax_init);
346 if (err < 0)
347 kfree(variax);
348 return err;
349} 317}
350 318
351static struct usb_driver variax_driver = { 319static struct usb_driver variax_driver = {