165bfd2967c906ca322a4bb69a285fe0de8916ac6Alan Stern#include <linux/pm.h>
265bfd2967c906ca322a4bb69a285fe0de8916ac6Alan Stern
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Functions local to drivers/usb/core/ */
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
584cca820ee798a6bc8b01a4ccc9548943bc41f7fGreg Kroah-Hartmanextern int usb_create_sysfs_dev_files(struct usb_device *dev);
684cca820ee798a6bc8b01a4ccc9548943bc41f7fGreg Kroah-Hartmanextern void usb_remove_sysfs_dev_files(struct usb_device *dev);
7643de6240b0b59c420ad71dfeeb3125a3607af92Michal Nazarewiczextern void usb_create_sysfs_intf_files(struct usb_interface *intf);
884cca820ee798a6bc8b01a4ccc9548943bc41f7fGreg Kroah-Hartmanextern void usb_remove_sysfs_intf_files(struct usb_interface *intf);
93b23dd6f8a718e5339de4f7d86ce76a078b5f771Alan Sternextern int usb_create_ep_devs(struct device *parent,
1084cca820ee798a6bc8b01a4ccc9548943bc41f7fGreg Kroah-Hartman				struct usb_host_endpoint *endpoint,
1184412f6291b50690febd81899e46f0f0ef7a13e0Greg Kroah-Hartman				struct usb_device *udev);
123b23dd6f8a718e5339de4f7d86ce76a078b5f771Alan Sternextern void usb_remove_ep_devs(struct usb_host_endpoint *endpoint);
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14bdd016ba64d909329cb4bacacc8443901c00e112Alan Sternextern void usb_enable_endpoint(struct usb_device *dev,
152caf7fcdb8532045680f06b67b9e63f0c9613aaaAlan Stern		struct usb_host_endpoint *ep, bool reset_toggle);
162caf7fcdb8532045680f06b67b9e63f0c9613aaaAlan Sternextern void usb_enable_interface(struct usb_device *dev,
172caf7fcdb8532045680f06b67b9e63f0c9613aaaAlan Stern		struct usb_interface *intf, bool reset_toggles);
18ddeac4e75f2527a340f9dc655bde49bb2429b39bAlan Sternextern void usb_disable_endpoint(struct usb_device *dev, unsigned int epaddr,
19ddeac4e75f2527a340f9dc655bde49bb2429b39bAlan Stern		bool reset_hardware);
2084cca820ee798a6bc8b01a4ccc9548943bc41f7fGreg Kroah-Hartmanextern void usb_disable_interface(struct usb_device *dev,
21ddeac4e75f2527a340f9dc655bde49bb2429b39bAlan Stern		struct usb_interface *intf, bool reset_hardware);
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void usb_release_interface_cache(struct kref *ref);
2384cca820ee798a6bc8b01a4ccc9548943bc41f7fGreg Kroah-Hartmanextern void usb_disable_device(struct usb_device *dev, int skip_ep0);
2484cca820ee798a6bc8b01a4ccc9548943bc41f7fGreg Kroah-Hartmanextern int usb_deauthorize_device(struct usb_device *);
2584cca820ee798a6bc8b01a4ccc9548943bc41f7fGreg Kroah-Hartmanextern int usb_authorize_device(struct usb_device *);
267ceec1f1d26f966c0816b86a1aab1e0b3b208757Oliver Neukumextern void usb_detect_quirks(struct usb_device *udev);
27253e05724f9230910344357b1142ad8642ff9f5aAlan Sternextern int usb_remove_device(struct usb_device *udev);
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int usb_get_device_descriptor(struct usb_device *dev,
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int size);
313148bf041d169a083aa31bd69bedd5bfb7ffe215Andiry Xuextern int usb_get_bos_descriptor(struct usb_device *dev);
323148bf041d169a083aa31bd69bedd5bfb7ffe215Andiry Xuextern void usb_release_bos_descriptor(struct usb_device *dev);
334f62efe67f077db17dad03a1d4c9665000a3eb45Alan Sternextern char *usb_cache_string(struct usb_device *udev, int index);
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int usb_set_configuration(struct usb_device *dev, int configuration);
35b5ea060f1e19c6a3f409d3472c723da4517547b8Greg Kroah-Hartmanextern int usb_choose_configuration(struct usb_device *udev);
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void usb_kick_khubd(struct usb_device *dev);
38bb417020ba8c559eb52f57379ba17f669f8f72cdGreg Kroah-Hartmanextern int usb_match_device(struct usb_device *dev,
39bb417020ba8c559eb52f57379ba17f669f8f72cdGreg Kroah-Hartman			    const struct usb_device_id *id);
4078d9a487ee961c356e1a934d9a92eca38ffb3a70Alan Sternextern void usb_forced_unbind_intf(struct usb_interface *intf);
4178d9a487ee961c356e1a934d9a92eca38ffb3a70Alan Sternextern void usb_rebind_intf(struct usb_interface *intf);
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
437cbe5dca399a50ce8aa74314b1d276e2fb904e1bAlan Sternextern int usb_hub_claim_port(struct usb_device *hdev, unsigned port,
447cbe5dca399a50ce8aa74314b1d276e2fb904e1bAlan Stern		void *owner);
457cbe5dca399a50ce8aa74314b1d276e2fb904e1bAlan Sternextern int usb_hub_release_port(struct usb_device *hdev, unsigned port,
467cbe5dca399a50ce8aa74314b1d276e2fb904e1bAlan Stern		void *owner);
477cbe5dca399a50ce8aa74314b1d276e2fb904e1bAlan Sternextern void usb_hub_release_all_ports(struct usb_device *hdev, void *owner);
487cbe5dca399a50ce8aa74314b1d276e2fb904e1bAlan Sternextern bool usb_device_is_owned(struct usb_device *udev);
497cbe5dca399a50ce8aa74314b1d276e2fb904e1bAlan Stern
506d5e8254bf488a40b7ae2faafbffa232ab19d541Greg Kroah-Hartmanextern int  usb_hub_init(void);
516d5e8254bf488a40b7ae2faafbffa232ab19d541Greg Kroah-Hartmanextern void usb_hub_cleanup(void);
526d5e8254bf488a40b7ae2faafbffa232ab19d541Greg Kroah-Hartmanextern int usb_major_init(void);
536d5e8254bf488a40b7ae2faafbffa232ab19d541Greg Kroah-Hartmanextern void usb_major_cleanup(void);
546d5e8254bf488a40b7ae2faafbffa232ab19d541Greg Kroah-Hartman
55d388dab7b562b76525761f89702246686747ba30Alan Stern#ifdef	CONFIG_PM
56d388dab7b562b76525761f89702246686747ba30Alan Stern
57f2189c477c986db47ac7f9cc32d05f6df18bfe9eAlan Sternextern int usb_suspend(struct device *dev, pm_message_t msg);
5865bfd2967c906ca322a4bb69a285fe0de8916ac6Alan Sternextern int usb_resume(struct device *dev, pm_message_t msg);
5998d9a82e5f753a2483d7b4638802d60e94e5d2e4Oliver Neukumextern int usb_resume_complete(struct device *dev);
60f2189c477c986db47ac7f9cc32d05f6df18bfe9eAlan Stern
6165bfd2967c906ca322a4bb69a285fe0de8916ac6Alan Sternextern int usb_port_suspend(struct usb_device *dev, pm_message_t msg);
6265bfd2967c906ca322a4bb69a285fe0de8916ac6Alan Sternextern int usb_port_resume(struct usb_device *dev, pm_message_t msg);
63e0318ebff4d96131bb3524308b845f642e64df81Alan Stern
64d388dab7b562b76525761f89702246686747ba30Alan Stern#else
65d388dab7b562b76525761f89702246686747ba30Alan Stern
6665bfd2967c906ca322a4bb69a285fe0de8916ac6Alan Sternstatic inline int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
674956eccdd6101c5abb71966079e8183d12796d6cAlan Stern{
684956eccdd6101c5abb71966079e8183d12796d6cAlan Stern	return 0;
694956eccdd6101c5abb71966079e8183d12796d6cAlan Stern}
704956eccdd6101c5abb71966079e8183d12796d6cAlan Stern
7165bfd2967c906ca322a4bb69a285fe0de8916ac6Alan Sternstatic inline int usb_port_resume(struct usb_device *udev, pm_message_t msg)
724956eccdd6101c5abb71966079e8183d12796d6cAlan Stern{
734956eccdd6101c5abb71966079e8183d12796d6cAlan Stern	return 0;
744956eccdd6101c5abb71966079e8183d12796d6cAlan Stern}
754956eccdd6101c5abb71966079e8183d12796d6cAlan Stern
76d388dab7b562b76525761f89702246686747ba30Alan Stern#endif
77d388dab7b562b76525761f89702246686747ba30Alan Stern
78645daaab0b6adc35c1838df2a82f9d729fdb1767Alan Stern#ifdef CONFIG_USB_SUSPEND
79645daaab0b6adc35c1838df2a82f9d729fdb1767Alan Stern
8094fcda1f8ab5e0cacc381c5ca1cc9aa6ad523576Alan Sternextern void usb_autosuspend_device(struct usb_device *udev);
8194fcda1f8ab5e0cacc381c5ca1cc9aa6ad523576Alan Sternextern int usb_autoresume_device(struct usb_device *udev);
829bbdf1e0afe771ca7650f9f476769310bee9d8f3Alan Sternextern int usb_remote_wakeup(struct usb_device *dev);
83e1620d591a75a10b15cf61dbf8243a0b7e6731a2Rafael J. Wysockiextern int usb_runtime_suspend(struct device *dev);
84e1620d591a75a10b15cf61dbf8243a0b7e6731a2Rafael J. Wysockiextern int usb_runtime_resume(struct device *dev);
85e1620d591a75a10b15cf61dbf8243a0b7e6731a2Rafael J. Wysockiextern int usb_runtime_idle(struct device *dev);
8665580b4321eb36f16ae8b5987bfa1bb948fc5112Andiry Xuextern int usb_set_usb2_hardware_lpm(struct usb_device *udev, int enable);
87645daaab0b6adc35c1838df2a82f9d729fdb1767Alan Stern
88645daaab0b6adc35c1838df2a82f9d729fdb1767Alan Stern#else
89645daaab0b6adc35c1838df2a82f9d729fdb1767Alan Stern
9019c262391c4741b012a5031fc438fb694e77c385Alan Stern#define usb_autosuspend_device(udev)		do {} while (0)
9194fcda1f8ab5e0cacc381c5ca1cc9aa6ad523576Alan Sternstatic inline int usb_autoresume_device(struct usb_device *udev)
92e0318ebff4d96131bb3524308b845f642e64df81Alan Stern{
93e0318ebff4d96131bb3524308b845f642e64df81Alan Stern	return 0;
94e0318ebff4d96131bb3524308b845f642e64df81Alan Stern}
95645daaab0b6adc35c1838df2a82f9d729fdb1767Alan Stern
969bbdf1e0afe771ca7650f9f476769310bee9d8f3Alan Sternstatic inline int usb_remote_wakeup(struct usb_device *udev)
979bbdf1e0afe771ca7650f9f476769310bee9d8f3Alan Stern{
989bbdf1e0afe771ca7650f9f476769310bee9d8f3Alan Stern	return 0;
999bbdf1e0afe771ca7650f9f476769310bee9d8f3Alan Stern}
1009bbdf1e0afe771ca7650f9f476769310bee9d8f3Alan Stern
10165580b4321eb36f16ae8b5987bfa1bb948fc5112Andiry Xustatic inline int usb_set_usb2_hardware_lpm(struct usb_device *udev, int enable)
10265580b4321eb36f16ae8b5987bfa1bb948fc5112Andiry Xu{
10365580b4321eb36f16ae8b5987bfa1bb948fc5112Andiry Xu	return 0;
10465580b4321eb36f16ae8b5987bfa1bb948fc5112Andiry Xu}
105645daaab0b6adc35c1838df2a82f9d729fdb1767Alan Stern#endif
106645daaab0b6adc35c1838df2a82f9d729fdb1767Alan Stern
10736e56a34586783c7986ce09d39db80b27c95ce24Alan Sternextern struct bus_type usb_bus_type;
1089f8b17e643fe6aa505629658445849397bda4e4fKay Sieversextern struct device_type usb_device_type;
1099f8b17e643fe6aa505629658445849397bda4e4fKay Sieversextern struct device_type usb_if_device_type;
1105512966643adb17483efc5f61481a38fc33088bbKay Sieversextern struct device_type usb_ep_device_type;
1118bb54ab573ecd1b4fe2ed66416a8d99a86e65316Alan Sternextern struct usb_device_driver usb_generic_driver;
1128bb54ab573ecd1b4fe2ed66416a8d99a86e65316Alan Stern
113095bc335360a51623dd8571839bbf465851a7f4bLuiz Fernando N. Capitulinostatic inline int is_usb_device(const struct device *dev)
1148bb54ab573ecd1b4fe2ed66416a8d99a86e65316Alan Stern{
1159f8b17e643fe6aa505629658445849397bda4e4fKay Sievers	return dev->type == &usb_device_type;
1168bb54ab573ecd1b4fe2ed66416a8d99a86e65316Alan Stern}
1178bb54ab573ecd1b4fe2ed66416a8d99a86e65316Alan Stern
1185512966643adb17483efc5f61481a38fc33088bbKay Sieversstatic inline int is_usb_interface(const struct device *dev)
1195512966643adb17483efc5f61481a38fc33088bbKay Sievers{
1205512966643adb17483efc5f61481a38fc33088bbKay Sievers	return dev->type == &usb_if_device_type;
1215512966643adb17483efc5f61481a38fc33088bbKay Sievers}
1225512966643adb17483efc5f61481a38fc33088bbKay Sievers
1235512966643adb17483efc5f61481a38fc33088bbKay Sieversstatic inline int is_usb_endpoint(const struct device *dev)
1245512966643adb17483efc5f61481a38fc33088bbKay Sievers{
1255512966643adb17483efc5f61481a38fc33088bbKay Sievers	return dev->type == &usb_ep_device_type;
1265512966643adb17483efc5f61481a38fc33088bbKay Sievers}
1275512966643adb17483efc5f61481a38fc33088bbKay Sievers
1288bb54ab573ecd1b4fe2ed66416a8d99a86e65316Alan Stern/* Do the same for device drivers and interface drivers. */
1298bb54ab573ecd1b4fe2ed66416a8d99a86e65316Alan Stern
1308bb54ab573ecd1b4fe2ed66416a8d99a86e65316Alan Sternstatic inline int is_usb_device_driver(struct device_driver *drv)
1318bb54ab573ecd1b4fe2ed66416a8d99a86e65316Alan Stern{
1328bb54ab573ecd1b4fe2ed66416a8d99a86e65316Alan Stern	return container_of(drv, struct usbdrv_wrap, driver)->
1338bb54ab573ecd1b4fe2ed66416a8d99a86e65316Alan Stern			for_devices;
1348bb54ab573ecd1b4fe2ed66416a8d99a86e65316Alan Stern}
1355edbfb7c8af0577097dae87cdd4dfdba82bb9579David Brownell
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* for labeling diagnostics */
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern const char *usbcore_name;
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1392e5f10e4f0a9649186d8a8c793822b2e0dae8373Alan Stern/* sysfs stuff */
140a4dbd6740df0872cdf0a86841f75beec8381964dDavid Brownellextern const struct attribute_group *usb_device_groups[];
141a4dbd6740df0872cdf0a86841f75beec8381964dDavid Brownellextern const struct attribute_group *usb_interface_groups[];
1422e5f10e4f0a9649186d8a8c793822b2e0dae8373Alan Stern
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* usbfs stuff */
1444a2a8a2cce86b9d001378cc25acb5c61e6ca7d63Alan Sternextern struct mutex usbfs_mutex;
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct usb_driver usbfs_driver;
146066202dd48cf3296b6cc22b5fcf89aef33fa0efcLuiz Fernando N. Capitulinoextern const struct file_operations usbfs_devices_fops;
1479f8b17e643fe6aa505629658445849397bda4e4fKay Sieversextern const struct file_operations usbdev_file_operations;
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void usbfs_conn_disc_event(void);
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1509f8b17e643fe6aa505629658445849397bda4e4fKay Sieversextern int usb_devio_init(void);
1519f8b17e643fe6aa505629658445849397bda4e4fKay Sieversextern void usb_devio_cleanup(void);
1526d5e8254bf488a40b7ae2faafbffa232ab19d541Greg Kroah-Hartman
1533099e75a7ccc3c5b0a4cf988a76d9c4a7fa5e91aGreg Kroah-Hartman/* internal notify stuff */
1543099e75a7ccc3c5b0a4cf988a76d9c4a7fa5e91aGreg Kroah-Hartmanextern void usb_notify_add_device(struct usb_device *udev);
1553099e75a7ccc3c5b0a4cf988a76d9c4a7fa5e91aGreg Kroah-Hartmanextern void usb_notify_remove_device(struct usb_device *udev);
1563099e75a7ccc3c5b0a4cf988a76d9c4a7fa5e91aGreg Kroah-Hartmanextern void usb_notify_add_bus(struct usb_bus *ubus);
1573099e75a7ccc3c5b0a4cf988a76d9c4a7fa5e91aGreg Kroah-Hartmanextern void usb_notify_remove_bus(struct usb_bus *ubus);
1583099e75a7ccc3c5b0a4cf988a76d9c4a7fa5e91aGreg Kroah-Hartman
159