linux/drivers/staging/comedi/comedi_usb.c
<<
>>
Prefs
   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 */
  24struct usb_interface *comedi_to_usb_interface(struct comedi_device *dev)
  25{
  26        return dev->hw_dev ? to_usb_interface(dev->hw_dev) : NULL;
  27}
  28EXPORT_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 */
  40struct 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}
  46EXPORT_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 */
  63int 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}
  69EXPORT_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 */
  85void comedi_usb_auto_unconfig(struct usb_interface *intf)
  86{
  87        comedi_auto_unconfig(&intf->dev);
  88}
  89EXPORT_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 */
 102int 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}
 119EXPORT_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 */
 130void 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}
 136EXPORT_SYMBOL_GPL(comedi_usb_driver_unregister);
 137
 138static int __init comedi_usb_init(void)
 139{
 140        return 0;
 141}
 142module_init(comedi_usb_init);
 143
 144static void __exit comedi_usb_exit(void)
 145{
 146}
 147module_exit(comedi_usb_exit);
 148
 149MODULE_AUTHOR("https://www.comedi.org");
 150MODULE_DESCRIPTION("Comedi USB interface module");
 151MODULE_LICENSE("GPL");
 152