Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph...
[firefly-linux-kernel-4.4.55.git] / drivers / staging / comedi / comedi_usb.c
1 /*
2  * comedi_usb.c
3  * Comedi USB driver specific functions.
4  *
5  * COMEDI - Linux Control and Measurement Device Interface
6  * Copyright (C) 1997-2000 David A. Schleef <ds@schleef.org>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  */
22
23 #include <linux/usb.h>
24
25 #include "comedidev.h"
26
27 /**
28  * comedi_to_usb_interface() - comedi_device pointer to usb_interface pointer.
29  * @dev: comedi_device struct
30  */
31 struct usb_interface *comedi_to_usb_interface(struct comedi_device *dev)
32 {
33         return dev->hw_dev ? to_usb_interface(dev->hw_dev) : NULL;
34 }
35 EXPORT_SYMBOL_GPL(comedi_to_usb_interface);
36
37 /**
38  * comedi_usb_auto_config() - Configure/probe a comedi USB driver.
39  * @intf: usb_interface struct
40  * @driver: comedi_driver struct
41  * @context: driver specific data, passed to comedi_auto_config()
42  *
43  * Typically called from the usb_driver (*probe) function.
44  */
45 int comedi_usb_auto_config(struct usb_interface *intf,
46                            struct comedi_driver *driver,
47                            unsigned long context)
48 {
49         return comedi_auto_config(&intf->dev, driver, context);
50 }
51 EXPORT_SYMBOL_GPL(comedi_usb_auto_config);
52
53 /**
54  * comedi_pci_auto_unconfig() - Unconfigure/disconnect a comedi USB driver.
55  * @intf: usb_interface struct
56  *
57  * Typically called from the usb_driver (*disconnect) function.
58  */
59 void comedi_usb_auto_unconfig(struct usb_interface *intf)
60 {
61         comedi_auto_unconfig(&intf->dev);
62 }
63 EXPORT_SYMBOL_GPL(comedi_usb_auto_unconfig);
64
65 /**
66  * comedi_usb_driver_register() - Register a comedi USB driver.
67  * @comedi_driver: comedi_driver struct
68  * @usb_driver: usb_driver struct
69  *
70  * This function is used for the module_init() of comedi USB drivers.
71  * Do not call it directly, use the module_comedi_usb_driver() helper
72  * macro instead.
73  */
74 int comedi_usb_driver_register(struct comedi_driver *comedi_driver,
75                                struct usb_driver *usb_driver)
76 {
77         int ret;
78
79         ret = comedi_driver_register(comedi_driver);
80         if (ret < 0)
81                 return ret;
82
83         ret = usb_register(usb_driver);
84         if (ret < 0) {
85                 comedi_driver_unregister(comedi_driver);
86                 return ret;
87         }
88
89         return 0;
90 }
91 EXPORT_SYMBOL_GPL(comedi_usb_driver_register);
92
93 /**
94  * comedi_usb_driver_unregister() - Unregister a comedi USB driver.
95  * @comedi_driver: comedi_driver struct
96  * @usb_driver: usb_driver struct
97  *
98  * This function is used for the module_exit() of comedi USB drivers.
99  * Do not call it directly, use the module_comedi_usb_driver() helper
100  * macro instead.
101  */
102 void comedi_usb_driver_unregister(struct comedi_driver *comedi_driver,
103                                   struct usb_driver *usb_driver)
104 {
105         usb_deregister(usb_driver);
106         comedi_driver_unregister(comedi_driver);
107 }
108 EXPORT_SYMBOL_GPL(comedi_usb_driver_unregister);