1abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten/* 2abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * comedi_usb.c 3abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * Comedi USB driver specific functions. 4abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * 5abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * COMEDI - Linux Control and Measurement Device Interface 6abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * Copyright (C) 1997-2000 David A. Schleef <ds@schleef.org> 7abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * 8abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * This program is free software; you can redistribute it and/or modify 9abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * it under the terms of the GNU General Public License as published by 10abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * the Free Software Foundation; either version 2 of the License, or 11abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * (at your option) any later version. 12abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * 13abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * This program is distributed in the hope that it will be useful, 14abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * but WITHOUT ANY WARRANTY; without even the implied warranty of 15abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * GNU General Public License for more details. 17abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten */ 18abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten 19abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten#include <linux/usb.h> 20abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten 21abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten#include "comedidev.h" 22abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten 23abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten/** 24abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * comedi_to_usb_interface() - comedi_device pointer to usb_interface pointer. 25abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * @dev: comedi_device struct 26abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten */ 27abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweetenstruct usb_interface *comedi_to_usb_interface(struct comedi_device *dev) 28abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten{ 29abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten return dev->hw_dev ? to_usb_interface(dev->hw_dev) : NULL; 30abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten} 31abac8b54a353b9a1ac7d09ff790812655f618896H Hartley SweetenEXPORT_SYMBOL_GPL(comedi_to_usb_interface); 32abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten 33abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten/** 3461dd149b102d00cea3815a161e07cd41fcc0d737H Hartley Sweeten * comedi_to_usb_dev() - comedi_device pointer to usb_device pointer. 3561dd149b102d00cea3815a161e07cd41fcc0d737H Hartley Sweeten * @dev: comedi_device struct 3661dd149b102d00cea3815a161e07cd41fcc0d737H Hartley Sweeten */ 3761dd149b102d00cea3815a161e07cd41fcc0d737H Hartley Sweetenstruct usb_device *comedi_to_usb_dev(struct comedi_device *dev) 3861dd149b102d00cea3815a161e07cd41fcc0d737H Hartley Sweeten{ 3961dd149b102d00cea3815a161e07cd41fcc0d737H Hartley Sweeten struct usb_interface *intf = comedi_to_usb_interface(dev); 4061dd149b102d00cea3815a161e07cd41fcc0d737H Hartley Sweeten 4161dd149b102d00cea3815a161e07cd41fcc0d737H Hartley Sweeten return intf ? interface_to_usbdev(intf) : NULL; 4261dd149b102d00cea3815a161e07cd41fcc0d737H Hartley Sweeten} 4361dd149b102d00cea3815a161e07cd41fcc0d737H Hartley SweetenEXPORT_SYMBOL_GPL(comedi_to_usb_dev); 4461dd149b102d00cea3815a161e07cd41fcc0d737H Hartley Sweeten 4561dd149b102d00cea3815a161e07cd41fcc0d737H Hartley Sweeten/** 46abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * comedi_usb_auto_config() - Configure/probe a comedi USB driver. 47abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * @intf: usb_interface struct 48abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * @driver: comedi_driver struct 4955ab4f641a3bfbdb7c59b80e194c7242234bbb1fH Hartley Sweeten * @context: driver specific data, passed to comedi_auto_config() 50abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * 51abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * Typically called from the usb_driver (*probe) function. 52abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten */ 53abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweetenint comedi_usb_auto_config(struct usb_interface *intf, 5455ab4f641a3bfbdb7c59b80e194c7242234bbb1fH Hartley Sweeten struct comedi_driver *driver, 5555ab4f641a3bfbdb7c59b80e194c7242234bbb1fH Hartley Sweeten unsigned long context) 56abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten{ 5755ab4f641a3bfbdb7c59b80e194c7242234bbb1fH Hartley Sweeten return comedi_auto_config(&intf->dev, driver, context); 58abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten} 59abac8b54a353b9a1ac7d09ff790812655f618896H Hartley SweetenEXPORT_SYMBOL_GPL(comedi_usb_auto_config); 60abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten 61abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten/** 62abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * comedi_pci_auto_unconfig() - Unconfigure/disconnect a comedi USB driver. 63abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * @intf: usb_interface struct 64abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * 65abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * Typically called from the usb_driver (*disconnect) function. 66abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten */ 67abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweetenvoid comedi_usb_auto_unconfig(struct usb_interface *intf) 68abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten{ 69abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten comedi_auto_unconfig(&intf->dev); 70abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten} 71abac8b54a353b9a1ac7d09ff790812655f618896H Hartley SweetenEXPORT_SYMBOL_GPL(comedi_usb_auto_unconfig); 72abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten 73abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten/** 74abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * comedi_usb_driver_register() - Register a comedi USB driver. 75abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * @comedi_driver: comedi_driver struct 76abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * @usb_driver: usb_driver struct 77abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * 78abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * This function is used for the module_init() of comedi USB drivers. 79abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * Do not call it directly, use the module_comedi_usb_driver() helper 80abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * macro instead. 81abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten */ 82abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweetenint comedi_usb_driver_register(struct comedi_driver *comedi_driver, 83abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten struct usb_driver *usb_driver) 84abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten{ 85abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten int ret; 86abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten 87abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten ret = comedi_driver_register(comedi_driver); 88abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten if (ret < 0) 89abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten return ret; 90abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten 91abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten ret = usb_register(usb_driver); 92abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten if (ret < 0) { 93abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten comedi_driver_unregister(comedi_driver); 94abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten return ret; 95abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten } 96abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten 97abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten return 0; 98abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten} 99abac8b54a353b9a1ac7d09ff790812655f618896H Hartley SweetenEXPORT_SYMBOL_GPL(comedi_usb_driver_register); 100abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten 101abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten/** 102abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * comedi_usb_driver_unregister() - Unregister a comedi USB driver. 103abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * @comedi_driver: comedi_driver struct 104abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * @usb_driver: usb_driver struct 105abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * 106abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * This function is used for the module_exit() of comedi USB drivers. 107abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * Do not call it directly, use the module_comedi_usb_driver() helper 108abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten * macro instead. 109abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten */ 110abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweetenvoid comedi_usb_driver_unregister(struct comedi_driver *comedi_driver, 111abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten struct usb_driver *usb_driver) 112abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten{ 113abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten usb_deregister(usb_driver); 114abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten comedi_driver_unregister(comedi_driver); 115abac8b54a353b9a1ac7d09ff790812655f618896H Hartley Sweeten} 116abac8b54a353b9a1ac7d09ff790812655f618896H Hartley SweetenEXPORT_SYMBOL_GPL(comedi_usb_driver_unregister); 117