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