1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * comedi_usb.c
4  * Comedi USB driver specific functions.
5  *
6  * COMEDI - Linux Control and Measurement Device Interface
7  * Copyright (C) 1997-2000 David A. Schleef <ds@schleef.org>
8  */
9 
10 #include <linux/module.h>
11 
12 #include "comedi_usb.h"
13 
14 /**
15  * comedi_to_usb_interface() - Return USB interface attached to COMEDI device
16  * @dev: COMEDI device.
17  *
18  * Assuming @dev->hw_dev is non-%NULL, it is assumed to be pointing to a
19  * a &struct device embedded in a &struct usb_interface.
20  *
21  * Return: Attached USB interface if @dev->hw_dev is non-%NULL.
22  * Return %NULL if @dev->hw_dev is %NULL.
23  */
comedi_to_usb_interface(struct comedi_device * dev)24 struct usb_interface *comedi_to_usb_interface(struct comedi_device *dev)
25 {
26 	return dev->hw_dev ? to_usb_interface(dev->hw_dev) : NULL;
27 }
28 EXPORT_SYMBOL_GPL(comedi_to_usb_interface);
29 
30 /**
31  * comedi_to_usb_dev() - Return USB device attached to COMEDI device
32  * @dev: COMEDI device.
33  *
34  * Assuming @dev->hw_dev is non-%NULL, it is assumed to be pointing to a
35  * a &struct device embedded in a &struct usb_interface.
36  *
37  * Return: USB device to which the USB interface belongs if @dev->hw_dev is
38  * non-%NULL.  Return %NULL if @dev->hw_dev is %NULL.
39  */
comedi_to_usb_dev(struct comedi_device * dev)40 struct usb_device *comedi_to_usb_dev(struct comedi_device *dev)
41 {
42 	struct usb_interface *intf = comedi_to_usb_interface(dev);
43 
44 	return intf ? interface_to_usbdev(intf) : NULL;
45 }
46 EXPORT_SYMBOL_GPL(comedi_to_usb_dev);
47 
48 /**
49  * comedi_usb_auto_config() - Configure/probe a USB COMEDI driver
50  * @intf: USB interface.
51  * @driver: Registered COMEDI driver.
52  * @context: Driver specific data, passed to comedi_auto_config().
53  *
54  * Typically called from the usb_driver (*probe) function.  Auto-configure a
55  * COMEDI device, using a pointer to the &struct device embedded in *@intf as
56  * the hardware device.  The @context value gets passed through to @driver's
57  * "auto_attach" handler.  The "auto_attach" handler may call
58  * comedi_to_usb_interface() on the passed in COMEDI device to recover @intf.
59  *
60  * Return: The result of calling comedi_auto_config() (%0 on success, or
61  * a negative error number on failure).
62  */
comedi_usb_auto_config(struct usb_interface * intf,struct comedi_driver * driver,unsigned long context)63 int comedi_usb_auto_config(struct usb_interface *intf,
64 			   struct comedi_driver *driver,
65 			   unsigned long context)
66 {
67 	return comedi_auto_config(&intf->dev, driver, context);
68 }
69 EXPORT_SYMBOL_GPL(comedi_usb_auto_config);
70 
71 /**
72  * comedi_usb_auto_unconfig() - Unconfigure/disconnect a USB COMEDI device
73  * @intf: USB interface.
74  *
75  * Typically called from the usb_driver (*disconnect) function.
76  * Auto-unconfigure a COMEDI device attached to this USB interface, using a
77  * pointer to the &struct device embedded in *@intf as the hardware device.
78  * The COMEDI driver's "detach" handler will be called during unconfiguration
79  * of the COMEDI device.
80  *
81  * Note that the COMEDI device may have already been unconfigured using the
82  * %COMEDI_DEVCONFIG ioctl, in which case this attempt to unconfigure it
83  * again should be ignored.
84  */
comedi_usb_auto_unconfig(struct usb_interface * intf)85 void comedi_usb_auto_unconfig(struct usb_interface *intf)
86 {
87 	comedi_auto_unconfig(&intf->dev);
88 }
89 EXPORT_SYMBOL_GPL(comedi_usb_auto_unconfig);
90 
91 /**
92  * comedi_usb_driver_register() - Register a USB COMEDI driver
93  * @comedi_driver: COMEDI driver to be registered.
94  * @usb_driver: USB driver to be registered.
95  *
96  * This function is called from the module_init() of USB COMEDI driver modules
97  * to register the COMEDI driver and the USB driver.  Do not call it directly,
98  * use the module_comedi_usb_driver() helper macro instead.
99  *
100  * Return: %0 on success, or a negative error number on failure.
101  */
comedi_usb_driver_register(struct comedi_driver * comedi_driver,struct usb_driver * usb_driver)102 int comedi_usb_driver_register(struct comedi_driver *comedi_driver,
103 			       struct usb_driver *usb_driver)
104 {
105 	int ret;
106 
107 	ret = comedi_driver_register(comedi_driver);
108 	if (ret < 0)
109 		return ret;
110 
111 	ret = usb_register(usb_driver);
112 	if (ret < 0) {
113 		comedi_driver_unregister(comedi_driver);
114 		return ret;
115 	}
116 
117 	return 0;
118 }
119 EXPORT_SYMBOL_GPL(comedi_usb_driver_register);
120 
121 /**
122  * comedi_usb_driver_unregister() - Unregister a USB COMEDI driver
123  * @comedi_driver: COMEDI driver to be registered.
124  * @usb_driver: USB driver to be registered.
125  *
126  * This function is called from the module_exit() of USB COMEDI driver modules
127  * to unregister the USB driver and the COMEDI driver.  Do not call it
128  * directly, use the module_comedi_usb_driver() helper macro instead.
129  */
comedi_usb_driver_unregister(struct comedi_driver * comedi_driver,struct usb_driver * usb_driver)130 void comedi_usb_driver_unregister(struct comedi_driver *comedi_driver,
131 				  struct usb_driver *usb_driver)
132 {
133 	usb_deregister(usb_driver);
134 	comedi_driver_unregister(comedi_driver);
135 }
136 EXPORT_SYMBOL_GPL(comedi_usb_driver_unregister);
137 
comedi_usb_init(void)138 static int __init comedi_usb_init(void)
139 {
140 	return 0;
141 }
142 module_init(comedi_usb_init);
143 
comedi_usb_exit(void)144 static void __exit comedi_usb_exit(void)
145 {
146 }
147 module_exit(comedi_usb_exit);
148 
149 MODULE_AUTHOR("https://www.comedi.org");
150 MODULE_DESCRIPTION("Comedi USB interface module");
151 MODULE_LICENSE("GPL");
152