driver.c (a019f5e8c522f5b5f8b3419a1e56d142ea4c7621) driver.c (85a9339becf0af4d547ceb6bb16d1893b05fbce4)
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 <linux/kernel.h>
13#include <linux/module.h>
14#include <linux/export.h>
15#include <linux/slab.h>
16#include <linux/usb.h>
17
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 <linux/kernel.h>
13#include <linux/module.h>
14#include <linux/export.h>
15#include <linux/slab.h>
16#include <linux/usb.h>
17
18#include "audio.h"
18#include <sound/core.h>
19#include <sound/initval.h>
20
19#include "capture.h"
20#include "driver.h"
21#include "midi.h"
22#include "playback.h"
23#include "revision.h"
24#include "usbdefs.h"
25
26#define DRIVER_AUTHOR "Markus Grabner <grabner@icg.tugraz.at>"

--- 449 unchanged lines hidden (view full) ---

476ssize_t line6_nop_read(struct device *dev, struct device_attribute *attr,
477 char *buf)
478{
479 return 0;
480}
481EXPORT_SYMBOL_GPL(line6_nop_read);
482
483/*
21#include "capture.h"
22#include "driver.h"
23#include "midi.h"
24#include "playback.h"
25#include "revision.h"
26#include "usbdefs.h"
27
28#define DRIVER_AUTHOR "Markus Grabner <grabner@icg.tugraz.at>"

--- 449 unchanged lines hidden (view full) ---

478ssize_t line6_nop_read(struct device *dev, struct device_attribute *attr,
479 char *buf)
480{
481 return 0;
482}
483EXPORT_SYMBOL_GPL(line6_nop_read);
484
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;
494 return;
492 line6 = usb_get_intfdata(interface);
493 if (line6 == NULL)
494 return;
495 usbdev = line6->usbdev;
495
496 /* free buffer memory first: */
497 kfree(line6->buffer_message);
498 kfree(line6->buffer_listen);
499
500 /* then free URBs: */
501 usb_free_urb(line6->urb_listen);
502
496
497 /* free buffer memory first: */
498 kfree(line6->buffer_message);
499 kfree(line6->buffer_listen);
500
501 /* then free URBs: */
502 usb_free_urb(line6->urb_listen);
503
503 /* make sure the device isn't destructed twice: */
504 usb_set_intfdata(interface, NULL);
504 /* free interface data: */
505 kfree(line6);
506
507 /* decrement reference counters: */
508 usb_put_dev(usbdev);
505}
506
507/*
508 Probe USB device.
509*/
510int line6_probe(struct usb_interface *interface,
511 struct usb_line6 *line6,
512 const struct line6_properties *properties,
513 int (*private_init)(struct usb_interface *, struct usb_line6 *))
514{
515 struct usb_device *usbdev;
509}
510
511/*
512 Probe USB device.
513*/
514int line6_probe(struct usb_interface *interface,
515 struct usb_line6 *line6,
516 const struct line6_properties *properties,
517 int (*private_init)(struct usb_interface *, struct usb_line6 *))
518{
519 struct usb_device *usbdev;
520 struct snd_card *card;
516 int interface_number;
517 int ret;
518
519 if (!interface) {
520 ret = -ENODEV;
521 goto err_put;
522 }
523 usbdev = interface_to_usbdev(interface);

--- 40 unchanged lines hidden (view full) ---

564 } else {
565 line6->interval = LINE6_FALLBACK_INTERVAL;
566 line6->max_packet_size = LINE6_FALLBACK_MAXPACKETSIZE;
567 dev_err(line6->ifcdev,
568 "endpoint not available, using fallback values");
569 }
570 }
571
521 int interface_number;
522 int ret;
523
524 if (!interface) {
525 ret = -ENODEV;
526 goto err_put;
527 }
528 usbdev = interface_to_usbdev(interface);

--- 40 unchanged lines hidden (view full) ---

569 } else {
570 line6->interval = LINE6_FALLBACK_INTERVAL;
571 line6->max_packet_size = LINE6_FALLBACK_MAXPACKETSIZE;
572 dev_err(line6->ifcdev,
573 "endpoint not available, using fallback values");
574 }
575 }
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);
573
592 usb_set_intfdata(interface, line6);
593
594 /* increment reference counters: */
595 usb_get_dev(usbdev);
596
574 if (properties->capabilities & LINE6_CAP_CONTROL) {
575 /* initialize USB buffers: */
576 line6->buffer_listen =
577 kmalloc(LINE6_BUFSIZE_LISTEN, GFP_KERNEL);
578 if (line6->buffer_listen == NULL) {
579 ret = -ENOMEM;
580 goto err_destruct;
581 }

--- 25 unchanged lines hidden (view full) ---

607 if (ret < 0)
608 goto err_destruct;
609
610 /* creation of additional special files should go here */
611
612 dev_info(&interface->dev, "Line6 %s now attached\n",
613 line6->properties->name);
614
597 if (properties->capabilities & LINE6_CAP_CONTROL) {
598 /* initialize USB buffers: */
599 line6->buffer_listen =
600 kmalloc(LINE6_BUFSIZE_LISTEN, GFP_KERNEL);
601 if (line6->buffer_listen == NULL) {
602 ret = -ENOMEM;
603 goto err_destruct;
604 }

--- 25 unchanged lines hidden (view full) ---

630 if (ret < 0)
631 goto err_destruct;
632
633 /* creation of additional special files should go here */
634
635 dev_info(&interface->dev, "Line6 %s now attached\n",
636 line6->properties->name);
637
615 /* increment reference counters: */
616 usb_get_intf(interface);
617 usb_get_dev(usbdev);
618
619 return 0;
620
638 return 0;
639
621err_destruct:
622 line6_destruct(interface);
623err_put:
640 err_destruct:
641 snd_card_free(card);
642 err_put:
624 return ret;
625}
626EXPORT_SYMBOL_GPL(line6_probe);
627
628/*
629 Line6 device disconnected.
630*/
631void line6_disconnect(struct usb_interface *interface)

--- 5 unchanged lines hidden (view full) ---

637 if (interface == NULL)
638 return;
639 usbdev = interface_to_usbdev(interface);
640 if (usbdev == NULL)
641 return;
642
643 interface_number = interface->cur_altsetting->desc.bInterfaceNumber;
644 line6 = usb_get_intfdata(interface);
643 return ret;
644}
645EXPORT_SYMBOL_GPL(line6_probe);
646
647/*
648 Line6 device disconnected.
649*/
650void line6_disconnect(struct usb_interface *interface)

--- 5 unchanged lines hidden (view full) ---

656 if (interface == NULL)
657 return;
658 usbdev = interface_to_usbdev(interface);
659 if (usbdev == NULL)
660 return;
661
662 interface_number = interface->cur_altsetting->desc.bInterfaceNumber;
663 line6 = usb_get_intfdata(interface);
664 if (!line6)
665 return;
645
666
646 if (line6 != NULL) {
647 if (line6->urb_listen != NULL)
648 line6_stop_listen(line6);
667 if (line6->urb_listen != NULL)
668 line6_stop_listen(line6);
649
669
650 if (usbdev != line6->usbdev)
651 dev_err(line6->ifcdev,
652 "driver bug: inconsistent usb device\n");
670 if (usbdev != line6->usbdev)
671 dev_err(line6->ifcdev, "driver bug: inconsistent usb device\n");
653
672
673 snd_card_disconnect(line6->card);
674 if (line6->disconnect)
654 line6->disconnect(interface);
655
675 line6->disconnect(interface);
676
656 dev_info(&interface->dev, "Line6 %s now disconnected\n",
657 line6->properties->name);
658 }
677 dev_info(&interface->dev, "Line6 %s now disconnected\n",
678 line6->properties->name);
659
679
660 line6_destruct(interface);
680 /* make sure the device isn't destructed twice: */
681 usb_set_intfdata(interface, NULL);
661
682
662 /* free interface data: */
663 kfree(line6);
664
665 /* decrement reference counters: */
666 usb_put_intf(interface);
667 usb_put_dev(usbdev);
683 snd_card_free_when_closed(line6->card);
668}
669EXPORT_SYMBOL_GPL(line6_disconnect);
670
671#ifdef CONFIG_PM
672
673/*
674 Suspend Line6 device.
675*/

--- 41 unchanged lines hidden ---
684}
685EXPORT_SYMBOL_GPL(line6_disconnect);
686
687#ifdef CONFIG_PM
688
689/*
690 Suspend Line6 device.
691*/

--- 41 unchanged lines hidden ---