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