usb.h revision 60678b60d78cd268a3aed3044dfbbb85760b2c54
1cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm#include <linux/pm.h>
2cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
3cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm/* Functions local to drivers/usb/core/ */
4cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
5cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern int usb_create_sysfs_dev_files(struct usb_device *dev);
6cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern void usb_remove_sysfs_dev_files(struct usb_device *dev);
7cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern int usb_create_sysfs_intf_files(struct usb_interface *intf);
8cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern void usb_remove_sysfs_intf_files(struct usb_interface *intf);
9cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern int usb_create_ep_devs(struct device *parent,
10cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm				struct usb_host_endpoint *endpoint,
11f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart				struct usb_device *udev);
12f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern void usb_remove_ep_devs(struct usb_host_endpoint *endpoint);
13cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
14f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern void usb_enable_endpoint(struct usb_device *dev,
15cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm		struct usb_host_endpoint *ep, bool reset_toggle);
16f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern void usb_enable_interface(struct usb_device *dev,
17f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart		struct usb_interface *intf, bool reset_toggles);
18f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern void usb_disable_endpoint(struct usb_device *dev, unsigned int epaddr,
198564557a03c12adb9c4b76ae1e86db4113a04d13Magnus Damm		bool reset_hardware);
2040331b21f5fdb746e80fc609ef60ef71b5cd47d9Phil Edworthyextern void usb_disable_interface(struct usb_device *dev,
21f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart		struct usb_interface *intf, bool reset_hardware);
22f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern void usb_release_interface_cache(struct kref *ref);
23355b200bacdb6017669cdc5bc9e7b1037aac42a2Paul Gortmakerextern void usb_disable_device(struct usb_device *dev, int skip_ep0);
24f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern int usb_deauthorize_device(struct usb_device *);
25f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern int usb_authorize_device(struct usb_device *);
26f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern void usb_detect_quirks(struct usb_device *udev);
27f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern int usb_remove_device(struct usb_device *udev);
28f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart
29f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern int usb_get_device_descriptor(struct usb_device *dev,
30225c9a8d1da274bf23efec43ec28b1c9e45e12f8Paul Mundt		unsigned int size);
318a20974f0370fe1b924704399e7ba327d894ef72Laurent Pinchartextern char *usb_cache_string(struct usb_device *udev, int index);
32cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern int usb_set_configuration(struct usb_device *dev, int configuration);
336de9edd5bde0cdfea12e9948690e53ec669c3018Guennadi Liakhovetskiextern int usb_choose_configuration(struct usb_device *udev);
346de9edd5bde0cdfea12e9948690e53ec669c3018Guennadi Liakhovetski
35a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthyextern void usb_kick_khubd(struct usb_device *dev);
36a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthyextern int usb_match_device(struct usb_device *dev,
37cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm			    const struct usb_device_id *id);
38d2ecbab5960d9814a269d36723647d6ef391ba8fGuennadi Liakhovetskiextern void usb_forced_unbind_intf(struct usb_interface *intf);
39d2ecbab5960d9814a269d36723647d6ef391ba8fGuennadi Liakhovetskiextern void usb_rebind_intf(struct usb_interface *intf);
40cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
41f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern int usb_hub_claim_port(struct usb_device *hdev, unsigned port,
42f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart		void *owner);
43f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern int usb_hub_release_port(struct usb_device *hdev, unsigned port,
44f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart		void *owner);
45f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern void usb_hub_release_all_ports(struct usb_device *hdev, void *owner);
46f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern bool usb_device_is_owned(struct usb_device *udev);
47f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart
48f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern int  usb_hub_init(void);
49f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern void usb_hub_cleanup(void);
50f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern int usb_major_init(void);
51f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern void usb_major_cleanup(void);
52f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart
53f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart#ifdef	CONFIG_PM
54f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart
55f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern int usb_suspend(struct device *dev, pm_message_t msg);
56f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern int usb_resume(struct device *dev, pm_message_t msg);
57f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart
58f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchartextern int usb_port_suspend(struct usb_device *dev, pm_message_t msg);
590246c4712c40294bd5e8335f0c15a38c8e52709fMagnus Dammextern int usb_port_resume(struct usb_device *dev, pm_message_t msg);
60cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
61cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm#else
62cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
63cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammstatic inline int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
64cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm{
65cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm	return 0;
66cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm}
678564557a03c12adb9c4b76ae1e86db4113a04d13Magnus Damm
68cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammstatic inline int usb_port_resume(struct usb_device *udev, pm_message_t msg)
6953b5031430bb3a7941b340b453afe4eabeb5340cDamian Hobson-Garcia{
70cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm	return 0;
71cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm}
72cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
73cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm#endif
74cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
75cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm#ifdef CONFIG_USB_SUSPEND
766011bdeaa6089d49c02de69f05980da7bad314abGuennadi Liakhovetski
77cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern void usb_autosuspend_device(struct usb_device *udev);
78cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern int usb_autoresume_device(struct usb_device *udev);
790246c4712c40294bd5e8335f0c15a38c8e52709fMagnus Dammextern int usb_remote_wakeup(struct usb_device *dev);
80cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
81cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm#else
82cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
83cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm#define usb_autosuspend_device(udev)		do {} while (0)
84cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammstatic inline int usb_autoresume_device(struct usb_device *udev)
85cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm{
86cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm	return 0;
878564557a03c12adb9c4b76ae1e86db4113a04d13Magnus Damm}
88cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
89cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammstatic inline int usb_remote_wakeup(struct usb_device *udev)
90cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm{
91cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm	return 0;
92cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm}
93cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
94cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm#endif
95cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
96cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern struct bus_type usb_bus_type;
97a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthyextern struct device_type usb_device_type;
98a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthyextern struct device_type usb_if_device_type;
99a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthyextern struct device_type usb_ep_device_type;
100a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthyextern struct usb_device_driver usb_generic_driver;
101a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy
102a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthystatic inline int is_usb_device(const struct device *dev)
103a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy{
104a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy	return dev->type == &usb_device_type;
105a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy}
10653b5031430bb3a7941b340b453afe4eabeb5340cDamian Hobson-Garcia
107a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthystatic inline int is_usb_interface(const struct device *dev)
108a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy{
109a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy	return dev->type == &usb_if_device_type;
110a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy}
111a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy
112a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthystatic inline int is_usb_endpoint(const struct device *dev)
113a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy{
114a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy	return dev->type == &usb_ep_device_type;
115a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy}
116a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy
117f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart/* Do the same for device drivers and interface drivers. */
118f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart
119b5ef967df13d4d243a2954c32bdd9181a1ee7382Laurent Pinchartstatic inline int is_usb_device_driver(struct device_driver *drv)
120f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart{
121f1f60b5f55099a658a5f79cc453b371a439864e6Laurent Pinchart	return container_of(drv, struct usbdrv_wrap, driver)->
122cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm			for_devices;
123cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm}
124cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
125cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm/* translate USB error codes to codes user space understands */
126a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthystatic inline int usb_translate_errors(int error_code)
127a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy{
128a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy	switch (error_code) {
129a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy	case 0:
130a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy	case -ENOMEM:
131a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy	case -ENODEV:
132a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy		return error_code;
133a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy	default:
134a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy		return -EIO;
135a6f15ade97989d414e9bf33874c9d5d1f39808ecPhil Edworthy	}
136cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm}
137cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
138cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
139cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm/* for labeling diagnostics */
140cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern const char *usbcore_name;
141cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
142cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm/* sysfs stuff */
143cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern const struct attribute_group *usb_device_groups[];
144cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern const struct attribute_group *usb_interface_groups[];
145cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
146cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm/* usbfs stuff */
147cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern struct mutex usbfs_mutex;
148cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern struct usb_driver usbfs_driver;
149cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern const struct file_operations usbfs_devices_fops;
150cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern const struct file_operations usbdev_file_operations;
151cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern void usbfs_conn_disc_event(void);
152cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
153cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern int usb_devio_init(void);
154cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern void usb_devio_cleanup(void);
155cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
156cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm/* internal notify stuff */
157cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern void usb_notify_add_device(struct usb_device *udev);
158cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern void usb_notify_remove_device(struct usb_device *udev);
159cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern void usb_notify_add_bus(struct usb_bus *ubus);
160cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Dammextern void usb_notify_remove_bus(struct usb_bus *ubus);
161cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm
162cfb4f5d1750e05f43902197713c50c29e7dfbc99Magnus Damm