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 --- |