Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0 2 : : /* 3 : : * Released under the GPLv2 only. 4 : : */ 5 : : 6 : : #include <linux/pm.h> 7 : : #include <linux/acpi.h> 8 : : 9 : : struct usb_hub_descriptor; 10 : : struct usb_dev_state; 11 : : 12 : : /* Functions local to drivers/usb/core/ */ 13 : : 14 : : extern int usb_create_sysfs_dev_files(struct usb_device *dev); 15 : : extern void usb_remove_sysfs_dev_files(struct usb_device *dev); 16 : : extern void usb_create_sysfs_intf_files(struct usb_interface *intf); 17 : : extern void usb_remove_sysfs_intf_files(struct usb_interface *intf); 18 : : extern int usb_create_ep_devs(struct device *parent, 19 : : struct usb_host_endpoint *endpoint, 20 : : struct usb_device *udev); 21 : : extern void usb_remove_ep_devs(struct usb_host_endpoint *endpoint); 22 : : 23 : : extern void usb_enable_endpoint(struct usb_device *dev, 24 : : struct usb_host_endpoint *ep, bool reset_toggle); 25 : : extern void usb_enable_interface(struct usb_device *dev, 26 : : struct usb_interface *intf, bool reset_toggles); 27 : : extern void usb_disable_endpoint(struct usb_device *dev, unsigned int epaddr, 28 : : bool reset_hardware); 29 : : extern void usb_disable_interface(struct usb_device *dev, 30 : : struct usb_interface *intf, bool reset_hardware); 31 : : extern void usb_release_interface_cache(struct kref *ref); 32 : : extern void usb_disable_device(struct usb_device *dev, int skip_ep0); 33 : : extern int usb_deauthorize_device(struct usb_device *); 34 : : extern int usb_authorize_device(struct usb_device *); 35 : : extern void usb_deauthorize_interface(struct usb_interface *); 36 : : extern void usb_authorize_interface(struct usb_interface *); 37 : : extern void usb_detect_quirks(struct usb_device *udev); 38 : : extern void usb_detect_interface_quirks(struct usb_device *udev); 39 : : extern void usb_release_quirk_list(void); 40 : : extern bool usb_endpoint_is_blacklisted(struct usb_device *udev, 41 : : struct usb_host_interface *intf, 42 : : struct usb_endpoint_descriptor *epd); 43 : : extern int usb_remove_device(struct usb_device *udev); 44 : : 45 : : extern int usb_get_device_descriptor(struct usb_device *dev, 46 : : unsigned int size); 47 : : extern int usb_set_isoch_delay(struct usb_device *dev); 48 : : extern int usb_get_bos_descriptor(struct usb_device *dev); 49 : : extern void usb_release_bos_descriptor(struct usb_device *dev); 50 : : extern char *usb_cache_string(struct usb_device *udev, int index); 51 : : extern int usb_set_configuration(struct usb_device *dev, int configuration); 52 : : extern int usb_choose_configuration(struct usb_device *udev); 53 : : 54 : : static inline unsigned usb_get_max_power(struct usb_device *udev, 55 : : struct usb_host_config *c) 56 : : { 57 : : /* SuperSpeed power is in 8 mA units; others are in 2 mA units */ 58 : 3 : unsigned mul = (udev->speed >= USB_SPEED_SUPER ? 8 : 2); 59 : : 60 : 3 : return c->desc.bMaxPower * mul; 61 : : } 62 : : 63 : : extern void usb_kick_hub_wq(struct usb_device *dev); 64 : : extern int usb_match_one_id_intf(struct usb_device *dev, 65 : : struct usb_host_interface *intf, 66 : : const struct usb_device_id *id); 67 : : extern int usb_match_device(struct usb_device *dev, 68 : : const struct usb_device_id *id); 69 : : extern void usb_forced_unbind_intf(struct usb_interface *intf); 70 : : extern void usb_unbind_and_rebind_marked_interfaces(struct usb_device *udev); 71 : : 72 : : extern void usb_hub_release_all_ports(struct usb_device *hdev, 73 : : struct usb_dev_state *owner); 74 : : extern bool usb_device_is_owned(struct usb_device *udev); 75 : : 76 : : extern int usb_hub_init(void); 77 : : extern void usb_hub_cleanup(void); 78 : : extern int usb_major_init(void); 79 : : extern void usb_major_cleanup(void); 80 : : extern int usb_device_supports_lpm(struct usb_device *udev); 81 : : extern int usb_port_disable(struct usb_device *udev); 82 : : 83 : : #ifdef CONFIG_PM 84 : : 85 : : extern int usb_suspend(struct device *dev, pm_message_t msg); 86 : : extern int usb_resume(struct device *dev, pm_message_t msg); 87 : : extern int usb_resume_complete(struct device *dev); 88 : : 89 : : extern int usb_port_suspend(struct usb_device *dev, pm_message_t msg); 90 : : extern int usb_port_resume(struct usb_device *dev, pm_message_t msg); 91 : : 92 : : extern void usb_autosuspend_device(struct usb_device *udev); 93 : : extern int usb_autoresume_device(struct usb_device *udev); 94 : : extern int usb_remote_wakeup(struct usb_device *dev); 95 : : extern int usb_runtime_suspend(struct device *dev); 96 : : extern int usb_runtime_resume(struct device *dev); 97 : : extern int usb_runtime_idle(struct device *dev); 98 : : extern int usb_enable_usb2_hardware_lpm(struct usb_device *udev); 99 : : extern int usb_disable_usb2_hardware_lpm(struct usb_device *udev); 100 : : 101 : : extern void usbfs_notify_suspend(struct usb_device *udev); 102 : : extern void usbfs_notify_resume(struct usb_device *udev); 103 : : 104 : : #else 105 : : 106 : : static inline int usb_port_suspend(struct usb_device *udev, pm_message_t msg) 107 : : { 108 : : return 0; 109 : : } 110 : : 111 : : static inline int usb_port_resume(struct usb_device *udev, pm_message_t msg) 112 : : { 113 : : return 0; 114 : : } 115 : : 116 : : #define usb_autosuspend_device(udev) do {} while (0) 117 : : static inline int usb_autoresume_device(struct usb_device *udev) 118 : : { 119 : : return 0; 120 : : } 121 : : 122 : : static inline int usb_enable_usb2_hardware_lpm(struct usb_device *udev) 123 : : { 124 : : return 0; 125 : : } 126 : : 127 : : static inline int usb_disable_usb2_hardware_lpm(struct usb_device *udev) 128 : : { 129 : : return 0; 130 : : } 131 : : 132 : : #endif 133 : : 134 : : extern struct bus_type usb_bus_type; 135 : : extern struct mutex usb_port_peer_mutex; 136 : : extern struct device_type usb_device_type; 137 : : extern struct device_type usb_if_device_type; 138 : : extern struct device_type usb_ep_device_type; 139 : : extern struct device_type usb_port_device_type; 140 : : extern struct usb_device_driver usb_generic_driver; 141 : : 142 : : static inline int is_usb_device(const struct device *dev) 143 : : { 144 : 3 : return dev->type == &usb_device_type; 145 : : } 146 : : 147 : : static inline int is_usb_interface(const struct device *dev) 148 : : { 149 : 0 : return dev->type == &usb_if_device_type; 150 : : } 151 : : 152 : : static inline int is_usb_endpoint(const struct device *dev) 153 : : { 154 : : return dev->type == &usb_ep_device_type; 155 : : } 156 : : 157 : : static inline int is_usb_port(const struct device *dev) 158 : : { 159 : : return dev->type == &usb_port_device_type; 160 : : } 161 : : 162 : : static inline int is_root_hub(struct usb_device *udev) 163 : : { 164 : 3 : return (udev->parent == NULL); 165 : : } 166 : : 167 : : /* Do the same for device drivers and interface drivers. */ 168 : : 169 : : static inline int is_usb_device_driver(struct device_driver *drv) 170 : : { 171 : 3 : return container_of(drv, struct usbdrv_wrap, driver)-> 172 : : for_devices; 173 : : } 174 : : 175 : : /* for labeling diagnostics */ 176 : : extern const char *usbcore_name; 177 : : 178 : : /* sysfs stuff */ 179 : : extern const struct attribute_group *usb_device_groups[]; 180 : : extern const struct attribute_group *usb_interface_groups[]; 181 : : 182 : : /* usbfs stuff */ 183 : : extern struct usb_driver usbfs_driver; 184 : : extern const struct file_operations usbfs_devices_fops; 185 : : extern const struct file_operations usbdev_file_operations; 186 : : extern void usbfs_conn_disc_event(void); 187 : : 188 : : extern int usb_devio_init(void); 189 : : extern void usb_devio_cleanup(void); 190 : : 191 : : /* 192 : : * Firmware specific cookie identifying a port's location. '0' == no location 193 : : * data available 194 : : */ 195 : : typedef u32 usb_port_location_t; 196 : : 197 : : /* internal notify stuff */ 198 : : extern void usb_notify_add_device(struct usb_device *udev); 199 : : extern void usb_notify_remove_device(struct usb_device *udev); 200 : : extern void usb_notify_add_bus(struct usb_bus *ubus); 201 : : extern void usb_notify_remove_bus(struct usb_bus *ubus); 202 : : extern void usb_hub_adjust_deviceremovable(struct usb_device *hdev, 203 : : struct usb_hub_descriptor *desc); 204 : : 205 : : #ifdef CONFIG_ACPI 206 : : extern int usb_acpi_register(void); 207 : : extern void usb_acpi_unregister(void); 208 : : extern acpi_handle usb_get_hub_port_acpi_handle(struct usb_device *hdev, 209 : : int port1); 210 : : #else 211 : : static inline int usb_acpi_register(void) { return 0; }; 212 : : static inline void usb_acpi_unregister(void) { }; 213 : : #endif