162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * drivers/usb/core/driver.c - most of the driver model stuff for usb 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * (C) Copyright 2005 Greg Kroah-Hartman <gregkh@suse.de> 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * based on drivers/usb/usb.c which had the following copyrights: 862306a36Sopenharmony_ci * (C) Copyright Linus Torvalds 1999 962306a36Sopenharmony_ci * (C) Copyright Johannes Erdfelt 1999-2001 1062306a36Sopenharmony_ci * (C) Copyright Andreas Gal 1999 1162306a36Sopenharmony_ci * (C) Copyright Gregory P. Smith 1999 1262306a36Sopenharmony_ci * (C) Copyright Deti Fliegl 1999 (new USB architecture) 1362306a36Sopenharmony_ci * (C) Copyright Randy Dunlap 2000 1462306a36Sopenharmony_ci * (C) Copyright David Brownell 2000-2004 1562306a36Sopenharmony_ci * (C) Copyright Yggdrasil Computing, Inc. 2000 1662306a36Sopenharmony_ci * (usb_device_id matching changes by Adam J. Richter) 1762306a36Sopenharmony_ci * (C) Copyright Greg Kroah-Hartman 2002-2003 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * Released under the GPLv2 only. 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * NOTE! This is not actually a driver at all, rather this is 2262306a36Sopenharmony_ci * just a collection of helper routines that implement the 2362306a36Sopenharmony_ci * matching, probing, releasing, suspending and resuming for 2462306a36Sopenharmony_ci * real drivers. 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#include <linux/device.h> 2962306a36Sopenharmony_ci#include <linux/slab.h> 3062306a36Sopenharmony_ci#include <linux/export.h> 3162306a36Sopenharmony_ci#include <linux/usb.h> 3262306a36Sopenharmony_ci#include <linux/usb/quirks.h> 3362306a36Sopenharmony_ci#include <linux/usb/hcd.h> 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#include "usb.h" 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* 3962306a36Sopenharmony_ci * Adds a new dynamic USBdevice ID to this driver, 4062306a36Sopenharmony_ci * and cause the driver to probe for all devices again. 4162306a36Sopenharmony_ci */ 4262306a36Sopenharmony_cissize_t usb_store_new_id(struct usb_dynids *dynids, 4362306a36Sopenharmony_ci const struct usb_device_id *id_table, 4462306a36Sopenharmony_ci struct device_driver *driver, 4562306a36Sopenharmony_ci const char *buf, size_t count) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci struct usb_dynid *dynid; 4862306a36Sopenharmony_ci u32 idVendor = 0; 4962306a36Sopenharmony_ci u32 idProduct = 0; 5062306a36Sopenharmony_ci unsigned int bInterfaceClass = 0; 5162306a36Sopenharmony_ci u32 refVendor, refProduct; 5262306a36Sopenharmony_ci int fields = 0; 5362306a36Sopenharmony_ci int retval = 0; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci fields = sscanf(buf, "%x %x %x %x %x", &idVendor, &idProduct, 5662306a36Sopenharmony_ci &bInterfaceClass, &refVendor, &refProduct); 5762306a36Sopenharmony_ci if (fields < 2) 5862306a36Sopenharmony_ci return -EINVAL; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci dynid = kzalloc(sizeof(*dynid), GFP_KERNEL); 6162306a36Sopenharmony_ci if (!dynid) 6262306a36Sopenharmony_ci return -ENOMEM; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci INIT_LIST_HEAD(&dynid->node); 6562306a36Sopenharmony_ci dynid->id.idVendor = idVendor; 6662306a36Sopenharmony_ci dynid->id.idProduct = idProduct; 6762306a36Sopenharmony_ci dynid->id.match_flags = USB_DEVICE_ID_MATCH_DEVICE; 6862306a36Sopenharmony_ci if (fields > 2 && bInterfaceClass) { 6962306a36Sopenharmony_ci if (bInterfaceClass > 255) { 7062306a36Sopenharmony_ci retval = -EINVAL; 7162306a36Sopenharmony_ci goto fail; 7262306a36Sopenharmony_ci } 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci dynid->id.bInterfaceClass = (u8)bInterfaceClass; 7562306a36Sopenharmony_ci dynid->id.match_flags |= USB_DEVICE_ID_MATCH_INT_CLASS; 7662306a36Sopenharmony_ci } 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci if (fields > 4) { 7962306a36Sopenharmony_ci const struct usb_device_id *id = id_table; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci if (!id) { 8262306a36Sopenharmony_ci retval = -ENODEV; 8362306a36Sopenharmony_ci goto fail; 8462306a36Sopenharmony_ci } 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci for (; id->match_flags; id++) 8762306a36Sopenharmony_ci if (id->idVendor == refVendor && id->idProduct == refProduct) 8862306a36Sopenharmony_ci break; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci if (id->match_flags) { 9162306a36Sopenharmony_ci dynid->id.driver_info = id->driver_info; 9262306a36Sopenharmony_ci } else { 9362306a36Sopenharmony_ci retval = -ENODEV; 9462306a36Sopenharmony_ci goto fail; 9562306a36Sopenharmony_ci } 9662306a36Sopenharmony_ci } 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci spin_lock(&dynids->lock); 9962306a36Sopenharmony_ci list_add_tail(&dynid->node, &dynids->list); 10062306a36Sopenharmony_ci spin_unlock(&dynids->lock); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci retval = driver_attach(driver); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci if (retval) 10562306a36Sopenharmony_ci return retval; 10662306a36Sopenharmony_ci return count; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cifail: 10962306a36Sopenharmony_ci kfree(dynid); 11062306a36Sopenharmony_ci return retval; 11162306a36Sopenharmony_ci} 11262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_store_new_id); 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cissize_t usb_show_dynids(struct usb_dynids *dynids, char *buf) 11562306a36Sopenharmony_ci{ 11662306a36Sopenharmony_ci struct usb_dynid *dynid; 11762306a36Sopenharmony_ci size_t count = 0; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci list_for_each_entry(dynid, &dynids->list, node) 12062306a36Sopenharmony_ci if (dynid->id.bInterfaceClass != 0) 12162306a36Sopenharmony_ci count += scnprintf(&buf[count], PAGE_SIZE - count, "%04x %04x %02x\n", 12262306a36Sopenharmony_ci dynid->id.idVendor, dynid->id.idProduct, 12362306a36Sopenharmony_ci dynid->id.bInterfaceClass); 12462306a36Sopenharmony_ci else 12562306a36Sopenharmony_ci count += scnprintf(&buf[count], PAGE_SIZE - count, "%04x %04x\n", 12662306a36Sopenharmony_ci dynid->id.idVendor, dynid->id.idProduct); 12762306a36Sopenharmony_ci return count; 12862306a36Sopenharmony_ci} 12962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_show_dynids); 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_cistatic ssize_t new_id_show(struct device_driver *driver, char *buf) 13262306a36Sopenharmony_ci{ 13362306a36Sopenharmony_ci struct usb_driver *usb_drv = to_usb_driver(driver); 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci return usb_show_dynids(&usb_drv->dynids, buf); 13662306a36Sopenharmony_ci} 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_cistatic ssize_t new_id_store(struct device_driver *driver, 13962306a36Sopenharmony_ci const char *buf, size_t count) 14062306a36Sopenharmony_ci{ 14162306a36Sopenharmony_ci struct usb_driver *usb_drv = to_usb_driver(driver); 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci return usb_store_new_id(&usb_drv->dynids, usb_drv->id_table, driver, buf, count); 14462306a36Sopenharmony_ci} 14562306a36Sopenharmony_cistatic DRIVER_ATTR_RW(new_id); 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci/* 14862306a36Sopenharmony_ci * Remove a USB device ID from this driver 14962306a36Sopenharmony_ci */ 15062306a36Sopenharmony_cistatic ssize_t remove_id_store(struct device_driver *driver, const char *buf, 15162306a36Sopenharmony_ci size_t count) 15262306a36Sopenharmony_ci{ 15362306a36Sopenharmony_ci struct usb_dynid *dynid, *n; 15462306a36Sopenharmony_ci struct usb_driver *usb_driver = to_usb_driver(driver); 15562306a36Sopenharmony_ci u32 idVendor; 15662306a36Sopenharmony_ci u32 idProduct; 15762306a36Sopenharmony_ci int fields; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci fields = sscanf(buf, "%x %x", &idVendor, &idProduct); 16062306a36Sopenharmony_ci if (fields < 2) 16162306a36Sopenharmony_ci return -EINVAL; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci spin_lock(&usb_driver->dynids.lock); 16462306a36Sopenharmony_ci list_for_each_entry_safe(dynid, n, &usb_driver->dynids.list, node) { 16562306a36Sopenharmony_ci struct usb_device_id *id = &dynid->id; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci if ((id->idVendor == idVendor) && 16862306a36Sopenharmony_ci (id->idProduct == idProduct)) { 16962306a36Sopenharmony_ci list_del(&dynid->node); 17062306a36Sopenharmony_ci kfree(dynid); 17162306a36Sopenharmony_ci break; 17262306a36Sopenharmony_ci } 17362306a36Sopenharmony_ci } 17462306a36Sopenharmony_ci spin_unlock(&usb_driver->dynids.lock); 17562306a36Sopenharmony_ci return count; 17662306a36Sopenharmony_ci} 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_cistatic ssize_t remove_id_show(struct device_driver *driver, char *buf) 17962306a36Sopenharmony_ci{ 18062306a36Sopenharmony_ci return new_id_show(driver, buf); 18162306a36Sopenharmony_ci} 18262306a36Sopenharmony_cistatic DRIVER_ATTR_RW(remove_id); 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_cistatic int usb_create_newid_files(struct usb_driver *usb_drv) 18562306a36Sopenharmony_ci{ 18662306a36Sopenharmony_ci int error = 0; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci if (usb_drv->no_dynamic_id) 18962306a36Sopenharmony_ci goto exit; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci if (usb_drv->probe != NULL) { 19262306a36Sopenharmony_ci error = driver_create_file(&usb_drv->drvwrap.driver, 19362306a36Sopenharmony_ci &driver_attr_new_id); 19462306a36Sopenharmony_ci if (error == 0) { 19562306a36Sopenharmony_ci error = driver_create_file(&usb_drv->drvwrap.driver, 19662306a36Sopenharmony_ci &driver_attr_remove_id); 19762306a36Sopenharmony_ci if (error) 19862306a36Sopenharmony_ci driver_remove_file(&usb_drv->drvwrap.driver, 19962306a36Sopenharmony_ci &driver_attr_new_id); 20062306a36Sopenharmony_ci } 20162306a36Sopenharmony_ci } 20262306a36Sopenharmony_ciexit: 20362306a36Sopenharmony_ci return error; 20462306a36Sopenharmony_ci} 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cistatic void usb_remove_newid_files(struct usb_driver *usb_drv) 20762306a36Sopenharmony_ci{ 20862306a36Sopenharmony_ci if (usb_drv->no_dynamic_id) 20962306a36Sopenharmony_ci return; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci if (usb_drv->probe != NULL) { 21262306a36Sopenharmony_ci driver_remove_file(&usb_drv->drvwrap.driver, 21362306a36Sopenharmony_ci &driver_attr_remove_id); 21462306a36Sopenharmony_ci driver_remove_file(&usb_drv->drvwrap.driver, 21562306a36Sopenharmony_ci &driver_attr_new_id); 21662306a36Sopenharmony_ci } 21762306a36Sopenharmony_ci} 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_cistatic void usb_free_dynids(struct usb_driver *usb_drv) 22062306a36Sopenharmony_ci{ 22162306a36Sopenharmony_ci struct usb_dynid *dynid, *n; 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci spin_lock(&usb_drv->dynids.lock); 22462306a36Sopenharmony_ci list_for_each_entry_safe(dynid, n, &usb_drv->dynids.list, node) { 22562306a36Sopenharmony_ci list_del(&dynid->node); 22662306a36Sopenharmony_ci kfree(dynid); 22762306a36Sopenharmony_ci } 22862306a36Sopenharmony_ci spin_unlock(&usb_drv->dynids.lock); 22962306a36Sopenharmony_ci} 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_cistatic const struct usb_device_id *usb_match_dynamic_id(struct usb_interface *intf, 23262306a36Sopenharmony_ci struct usb_driver *drv) 23362306a36Sopenharmony_ci{ 23462306a36Sopenharmony_ci struct usb_dynid *dynid; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci spin_lock(&drv->dynids.lock); 23762306a36Sopenharmony_ci list_for_each_entry(dynid, &drv->dynids.list, node) { 23862306a36Sopenharmony_ci if (usb_match_one_id(intf, &dynid->id)) { 23962306a36Sopenharmony_ci spin_unlock(&drv->dynids.lock); 24062306a36Sopenharmony_ci return &dynid->id; 24162306a36Sopenharmony_ci } 24262306a36Sopenharmony_ci } 24362306a36Sopenharmony_ci spin_unlock(&drv->dynids.lock); 24462306a36Sopenharmony_ci return NULL; 24562306a36Sopenharmony_ci} 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci/* called from driver core with dev locked */ 24962306a36Sopenharmony_cistatic int usb_probe_device(struct device *dev) 25062306a36Sopenharmony_ci{ 25162306a36Sopenharmony_ci struct usb_device_driver *udriver = to_usb_device_driver(dev->driver); 25262306a36Sopenharmony_ci struct usb_device *udev = to_usb_device(dev); 25362306a36Sopenharmony_ci int error = 0; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci dev_dbg(dev, "%s\n", __func__); 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci /* TODO: Add real matching code */ 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci /* The device should always appear to be in use 26062306a36Sopenharmony_ci * unless the driver supports autosuspend. 26162306a36Sopenharmony_ci */ 26262306a36Sopenharmony_ci if (!udriver->supports_autosuspend) 26362306a36Sopenharmony_ci error = usb_autoresume_device(udev); 26462306a36Sopenharmony_ci if (error) 26562306a36Sopenharmony_ci return error; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci if (udriver->generic_subclass) 26862306a36Sopenharmony_ci error = usb_generic_driver_probe(udev); 26962306a36Sopenharmony_ci if (error) 27062306a36Sopenharmony_ci return error; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci /* Probe the USB device with the driver in hand, but only 27362306a36Sopenharmony_ci * defer to a generic driver in case the current USB 27462306a36Sopenharmony_ci * device driver has an id_table or a match function; i.e., 27562306a36Sopenharmony_ci * when the device driver was explicitly matched against 27662306a36Sopenharmony_ci * a device. 27762306a36Sopenharmony_ci * 27862306a36Sopenharmony_ci * If the device driver does not have either of these, 27962306a36Sopenharmony_ci * then we assume that it can bind to any device and is 28062306a36Sopenharmony_ci * not truly a more specialized/non-generic driver, so a 28162306a36Sopenharmony_ci * return value of -ENODEV should not force the device 28262306a36Sopenharmony_ci * to be handled by the generic USB driver, as there 28362306a36Sopenharmony_ci * can still be another, more specialized, device driver. 28462306a36Sopenharmony_ci * 28562306a36Sopenharmony_ci * This accommodates the usbip driver. 28662306a36Sopenharmony_ci * 28762306a36Sopenharmony_ci * TODO: What if, in the future, there are multiple 28862306a36Sopenharmony_ci * specialized USB device drivers for a particular device? 28962306a36Sopenharmony_ci * In such cases, there is a need to try all matching 29062306a36Sopenharmony_ci * specialised device drivers prior to setting the 29162306a36Sopenharmony_ci * use_generic_driver bit. 29262306a36Sopenharmony_ci */ 29362306a36Sopenharmony_ci error = udriver->probe(udev); 29462306a36Sopenharmony_ci if (error == -ENODEV && udriver != &usb_generic_driver && 29562306a36Sopenharmony_ci (udriver->id_table || udriver->match)) { 29662306a36Sopenharmony_ci udev->use_generic_driver = 1; 29762306a36Sopenharmony_ci return -EPROBE_DEFER; 29862306a36Sopenharmony_ci } 29962306a36Sopenharmony_ci return error; 30062306a36Sopenharmony_ci} 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci/* called from driver core with dev locked */ 30362306a36Sopenharmony_cistatic int usb_unbind_device(struct device *dev) 30462306a36Sopenharmony_ci{ 30562306a36Sopenharmony_ci struct usb_device *udev = to_usb_device(dev); 30662306a36Sopenharmony_ci struct usb_device_driver *udriver = to_usb_device_driver(dev->driver); 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci if (udriver->disconnect) 30962306a36Sopenharmony_ci udriver->disconnect(udev); 31062306a36Sopenharmony_ci if (udriver->generic_subclass) 31162306a36Sopenharmony_ci usb_generic_driver_disconnect(udev); 31262306a36Sopenharmony_ci if (!udriver->supports_autosuspend) 31362306a36Sopenharmony_ci usb_autosuspend_device(udev); 31462306a36Sopenharmony_ci return 0; 31562306a36Sopenharmony_ci} 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci/* called from driver core with dev locked */ 31862306a36Sopenharmony_cistatic int usb_probe_interface(struct device *dev) 31962306a36Sopenharmony_ci{ 32062306a36Sopenharmony_ci struct usb_driver *driver = to_usb_driver(dev->driver); 32162306a36Sopenharmony_ci struct usb_interface *intf = to_usb_interface(dev); 32262306a36Sopenharmony_ci struct usb_device *udev = interface_to_usbdev(intf); 32362306a36Sopenharmony_ci const struct usb_device_id *id; 32462306a36Sopenharmony_ci int error = -ENODEV; 32562306a36Sopenharmony_ci int lpm_disable_error = -ENODEV; 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci dev_dbg(dev, "%s\n", __func__); 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci intf->needs_binding = 0; 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci if (usb_device_is_owned(udev)) 33262306a36Sopenharmony_ci return error; 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci if (udev->authorized == 0) { 33562306a36Sopenharmony_ci dev_err(&intf->dev, "Device is not authorized for usage\n"); 33662306a36Sopenharmony_ci return error; 33762306a36Sopenharmony_ci } else if (intf->authorized == 0) { 33862306a36Sopenharmony_ci dev_err(&intf->dev, "Interface %d is not authorized for usage\n", 33962306a36Sopenharmony_ci intf->altsetting->desc.bInterfaceNumber); 34062306a36Sopenharmony_ci return error; 34162306a36Sopenharmony_ci } 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci id = usb_match_dynamic_id(intf, driver); 34462306a36Sopenharmony_ci if (!id) 34562306a36Sopenharmony_ci id = usb_match_id(intf, driver->id_table); 34662306a36Sopenharmony_ci if (!id) 34762306a36Sopenharmony_ci return error; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci dev_dbg(dev, "%s - got id\n", __func__); 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci error = usb_autoresume_device(udev); 35262306a36Sopenharmony_ci if (error) 35362306a36Sopenharmony_ci return error; 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci intf->condition = USB_INTERFACE_BINDING; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci /* Probed interfaces are initially active. They are 35862306a36Sopenharmony_ci * runtime-PM-enabled only if the driver has autosuspend support. 35962306a36Sopenharmony_ci * They are sensitive to their children's power states. 36062306a36Sopenharmony_ci */ 36162306a36Sopenharmony_ci pm_runtime_set_active(dev); 36262306a36Sopenharmony_ci pm_suspend_ignore_children(dev, false); 36362306a36Sopenharmony_ci if (driver->supports_autosuspend) 36462306a36Sopenharmony_ci pm_runtime_enable(dev); 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci /* If the new driver doesn't allow hub-initiated LPM, and we can't 36762306a36Sopenharmony_ci * disable hub-initiated LPM, then fail the probe. 36862306a36Sopenharmony_ci * 36962306a36Sopenharmony_ci * Otherwise, leaving LPM enabled should be harmless, because the 37062306a36Sopenharmony_ci * endpoint intervals should remain the same, and the U1/U2 timeouts 37162306a36Sopenharmony_ci * should remain the same. 37262306a36Sopenharmony_ci * 37362306a36Sopenharmony_ci * If we need to install alt setting 0 before probe, or another alt 37462306a36Sopenharmony_ci * setting during probe, that should also be fine. usb_set_interface() 37562306a36Sopenharmony_ci * will attempt to disable LPM, and fail if it can't disable it. 37662306a36Sopenharmony_ci */ 37762306a36Sopenharmony_ci if (driver->disable_hub_initiated_lpm) { 37862306a36Sopenharmony_ci lpm_disable_error = usb_unlocked_disable_lpm(udev); 37962306a36Sopenharmony_ci if (lpm_disable_error) { 38062306a36Sopenharmony_ci dev_err(&intf->dev, "%s Failed to disable LPM for driver %s\n", 38162306a36Sopenharmony_ci __func__, driver->name); 38262306a36Sopenharmony_ci error = lpm_disable_error; 38362306a36Sopenharmony_ci goto err; 38462306a36Sopenharmony_ci } 38562306a36Sopenharmony_ci } 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci /* Carry out a deferred switch to altsetting 0 */ 38862306a36Sopenharmony_ci if (intf->needs_altsetting0) { 38962306a36Sopenharmony_ci error = usb_set_interface(udev, intf->altsetting[0]. 39062306a36Sopenharmony_ci desc.bInterfaceNumber, 0); 39162306a36Sopenharmony_ci if (error < 0) 39262306a36Sopenharmony_ci goto err; 39362306a36Sopenharmony_ci intf->needs_altsetting0 = 0; 39462306a36Sopenharmony_ci } 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci error = driver->probe(intf, id); 39762306a36Sopenharmony_ci if (error) 39862306a36Sopenharmony_ci goto err; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci intf->condition = USB_INTERFACE_BOUND; 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci /* If the LPM disable succeeded, balance the ref counts. */ 40362306a36Sopenharmony_ci if (!lpm_disable_error) 40462306a36Sopenharmony_ci usb_unlocked_enable_lpm(udev); 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci usb_autosuspend_device(udev); 40762306a36Sopenharmony_ci return error; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci err: 41062306a36Sopenharmony_ci usb_set_intfdata(intf, NULL); 41162306a36Sopenharmony_ci intf->needs_remote_wakeup = 0; 41262306a36Sopenharmony_ci intf->condition = USB_INTERFACE_UNBOUND; 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci /* If the LPM disable succeeded, balance the ref counts. */ 41562306a36Sopenharmony_ci if (!lpm_disable_error) 41662306a36Sopenharmony_ci usb_unlocked_enable_lpm(udev); 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci /* Unbound interfaces are always runtime-PM-disabled and -suspended */ 41962306a36Sopenharmony_ci if (driver->supports_autosuspend) 42062306a36Sopenharmony_ci pm_runtime_disable(dev); 42162306a36Sopenharmony_ci pm_runtime_set_suspended(dev); 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci usb_autosuspend_device(udev); 42462306a36Sopenharmony_ci return error; 42562306a36Sopenharmony_ci} 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci/* called from driver core with dev locked */ 42862306a36Sopenharmony_cistatic int usb_unbind_interface(struct device *dev) 42962306a36Sopenharmony_ci{ 43062306a36Sopenharmony_ci struct usb_driver *driver = to_usb_driver(dev->driver); 43162306a36Sopenharmony_ci struct usb_interface *intf = to_usb_interface(dev); 43262306a36Sopenharmony_ci struct usb_host_endpoint *ep, **eps = NULL; 43362306a36Sopenharmony_ci struct usb_device *udev; 43462306a36Sopenharmony_ci int i, j, error, r; 43562306a36Sopenharmony_ci int lpm_disable_error = -ENODEV; 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci intf->condition = USB_INTERFACE_UNBINDING; 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_ci /* Autoresume for set_interface call below */ 44062306a36Sopenharmony_ci udev = interface_to_usbdev(intf); 44162306a36Sopenharmony_ci error = usb_autoresume_device(udev); 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci /* If hub-initiated LPM policy may change, attempt to disable LPM until 44462306a36Sopenharmony_ci * the driver is unbound. If LPM isn't disabled, that's fine because it 44562306a36Sopenharmony_ci * wouldn't be enabled unless all the bound interfaces supported 44662306a36Sopenharmony_ci * hub-initiated LPM. 44762306a36Sopenharmony_ci */ 44862306a36Sopenharmony_ci if (driver->disable_hub_initiated_lpm) 44962306a36Sopenharmony_ci lpm_disable_error = usb_unlocked_disable_lpm(udev); 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci /* 45262306a36Sopenharmony_ci * Terminate all URBs for this interface unless the driver 45362306a36Sopenharmony_ci * supports "soft" unbinding and the device is still present. 45462306a36Sopenharmony_ci */ 45562306a36Sopenharmony_ci if (!driver->soft_unbind || udev->state == USB_STATE_NOTATTACHED) 45662306a36Sopenharmony_ci usb_disable_interface(udev, intf, false); 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci driver->disconnect(intf); 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci /* Free streams */ 46162306a36Sopenharmony_ci for (i = 0, j = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { 46262306a36Sopenharmony_ci ep = &intf->cur_altsetting->endpoint[i]; 46362306a36Sopenharmony_ci if (ep->streams == 0) 46462306a36Sopenharmony_ci continue; 46562306a36Sopenharmony_ci if (j == 0) { 46662306a36Sopenharmony_ci eps = kmalloc_array(USB_MAXENDPOINTS, sizeof(void *), 46762306a36Sopenharmony_ci GFP_KERNEL); 46862306a36Sopenharmony_ci if (!eps) 46962306a36Sopenharmony_ci break; 47062306a36Sopenharmony_ci } 47162306a36Sopenharmony_ci eps[j++] = ep; 47262306a36Sopenharmony_ci } 47362306a36Sopenharmony_ci if (j) { 47462306a36Sopenharmony_ci usb_free_streams(intf, eps, j, GFP_KERNEL); 47562306a36Sopenharmony_ci kfree(eps); 47662306a36Sopenharmony_ci } 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci /* Reset other interface state. 47962306a36Sopenharmony_ci * We cannot do a Set-Interface if the device is suspended or 48062306a36Sopenharmony_ci * if it is prepared for a system sleep (since installing a new 48162306a36Sopenharmony_ci * altsetting means creating new endpoint device entries). 48262306a36Sopenharmony_ci * When either of these happens, defer the Set-Interface. 48362306a36Sopenharmony_ci */ 48462306a36Sopenharmony_ci if (intf->cur_altsetting->desc.bAlternateSetting == 0) { 48562306a36Sopenharmony_ci /* Already in altsetting 0 so skip Set-Interface. 48662306a36Sopenharmony_ci * Just re-enable it without affecting the endpoint toggles. 48762306a36Sopenharmony_ci */ 48862306a36Sopenharmony_ci usb_enable_interface(udev, intf, false); 48962306a36Sopenharmony_ci } else if (!error && !intf->dev.power.is_prepared) { 49062306a36Sopenharmony_ci r = usb_set_interface(udev, intf->altsetting[0]. 49162306a36Sopenharmony_ci desc.bInterfaceNumber, 0); 49262306a36Sopenharmony_ci if (r < 0) 49362306a36Sopenharmony_ci intf->needs_altsetting0 = 1; 49462306a36Sopenharmony_ci } else { 49562306a36Sopenharmony_ci intf->needs_altsetting0 = 1; 49662306a36Sopenharmony_ci } 49762306a36Sopenharmony_ci usb_set_intfdata(intf, NULL); 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci intf->condition = USB_INTERFACE_UNBOUND; 50062306a36Sopenharmony_ci intf->needs_remote_wakeup = 0; 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci /* Attempt to re-enable USB3 LPM, if the disable succeeded. */ 50362306a36Sopenharmony_ci if (!lpm_disable_error) 50462306a36Sopenharmony_ci usb_unlocked_enable_lpm(udev); 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci /* Unbound interfaces are always runtime-PM-disabled and -suspended */ 50762306a36Sopenharmony_ci if (driver->supports_autosuspend) 50862306a36Sopenharmony_ci pm_runtime_disable(dev); 50962306a36Sopenharmony_ci pm_runtime_set_suspended(dev); 51062306a36Sopenharmony_ci 51162306a36Sopenharmony_ci if (!error) 51262306a36Sopenharmony_ci usb_autosuspend_device(udev); 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci return 0; 51562306a36Sopenharmony_ci} 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci/** 51862306a36Sopenharmony_ci * usb_driver_claim_interface - bind a driver to an interface 51962306a36Sopenharmony_ci * @driver: the driver to be bound 52062306a36Sopenharmony_ci * @iface: the interface to which it will be bound; must be in the 52162306a36Sopenharmony_ci * usb device's active configuration 52262306a36Sopenharmony_ci * @data: driver data associated with that interface 52362306a36Sopenharmony_ci * 52462306a36Sopenharmony_ci * This is used by usb device drivers that need to claim more than one 52562306a36Sopenharmony_ci * interface on a device when probing (audio and acm are current examples). 52662306a36Sopenharmony_ci * No device driver should directly modify internal usb_interface or 52762306a36Sopenharmony_ci * usb_device structure members. 52862306a36Sopenharmony_ci * 52962306a36Sopenharmony_ci * Callers must own the device lock, so driver probe() entries don't need 53062306a36Sopenharmony_ci * extra locking, but other call contexts may need to explicitly claim that 53162306a36Sopenharmony_ci * lock. 53262306a36Sopenharmony_ci * 53362306a36Sopenharmony_ci * Return: 0 on success. 53462306a36Sopenharmony_ci */ 53562306a36Sopenharmony_ciint usb_driver_claim_interface(struct usb_driver *driver, 53662306a36Sopenharmony_ci struct usb_interface *iface, void *data) 53762306a36Sopenharmony_ci{ 53862306a36Sopenharmony_ci struct device *dev; 53962306a36Sopenharmony_ci int retval = 0; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci if (!iface) 54262306a36Sopenharmony_ci return -ENODEV; 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci dev = &iface->dev; 54562306a36Sopenharmony_ci if (dev->driver) 54662306a36Sopenharmony_ci return -EBUSY; 54762306a36Sopenharmony_ci 54862306a36Sopenharmony_ci /* reject claim if interface is not authorized */ 54962306a36Sopenharmony_ci if (!iface->authorized) 55062306a36Sopenharmony_ci return -ENODEV; 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ci dev->driver = &driver->drvwrap.driver; 55362306a36Sopenharmony_ci usb_set_intfdata(iface, data); 55462306a36Sopenharmony_ci iface->needs_binding = 0; 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_ci iface->condition = USB_INTERFACE_BOUND; 55762306a36Sopenharmony_ci 55862306a36Sopenharmony_ci /* Claimed interfaces are initially inactive (suspended) and 55962306a36Sopenharmony_ci * runtime-PM-enabled, but only if the driver has autosuspend 56062306a36Sopenharmony_ci * support. Otherwise they are marked active, to prevent the 56162306a36Sopenharmony_ci * device from being autosuspended, but left disabled. In either 56262306a36Sopenharmony_ci * case they are sensitive to their children's power states. 56362306a36Sopenharmony_ci */ 56462306a36Sopenharmony_ci pm_suspend_ignore_children(dev, false); 56562306a36Sopenharmony_ci if (driver->supports_autosuspend) 56662306a36Sopenharmony_ci pm_runtime_enable(dev); 56762306a36Sopenharmony_ci else 56862306a36Sopenharmony_ci pm_runtime_set_active(dev); 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci /* if interface was already added, bind now; else let 57162306a36Sopenharmony_ci * the future device_add() bind it, bypassing probe() 57262306a36Sopenharmony_ci */ 57362306a36Sopenharmony_ci if (device_is_registered(dev)) 57462306a36Sopenharmony_ci retval = device_bind_driver(dev); 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_ci if (retval) { 57762306a36Sopenharmony_ci dev->driver = NULL; 57862306a36Sopenharmony_ci usb_set_intfdata(iface, NULL); 57962306a36Sopenharmony_ci iface->needs_remote_wakeup = 0; 58062306a36Sopenharmony_ci iface->condition = USB_INTERFACE_UNBOUND; 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_ci /* 58362306a36Sopenharmony_ci * Unbound interfaces are always runtime-PM-disabled 58462306a36Sopenharmony_ci * and runtime-PM-suspended 58562306a36Sopenharmony_ci */ 58662306a36Sopenharmony_ci if (driver->supports_autosuspend) 58762306a36Sopenharmony_ci pm_runtime_disable(dev); 58862306a36Sopenharmony_ci pm_runtime_set_suspended(dev); 58962306a36Sopenharmony_ci } 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ci return retval; 59262306a36Sopenharmony_ci} 59362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_driver_claim_interface); 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_ci/** 59662306a36Sopenharmony_ci * usb_driver_release_interface - unbind a driver from an interface 59762306a36Sopenharmony_ci * @driver: the driver to be unbound 59862306a36Sopenharmony_ci * @iface: the interface from which it will be unbound 59962306a36Sopenharmony_ci * 60062306a36Sopenharmony_ci * This can be used by drivers to release an interface without waiting 60162306a36Sopenharmony_ci * for their disconnect() methods to be called. In typical cases this 60262306a36Sopenharmony_ci * also causes the driver disconnect() method to be called. 60362306a36Sopenharmony_ci * 60462306a36Sopenharmony_ci * This call is synchronous, and may not be used in an interrupt context. 60562306a36Sopenharmony_ci * Callers must own the device lock, so driver disconnect() entries don't 60662306a36Sopenharmony_ci * need extra locking, but other call contexts may need to explicitly claim 60762306a36Sopenharmony_ci * that lock. 60862306a36Sopenharmony_ci */ 60962306a36Sopenharmony_civoid usb_driver_release_interface(struct usb_driver *driver, 61062306a36Sopenharmony_ci struct usb_interface *iface) 61162306a36Sopenharmony_ci{ 61262306a36Sopenharmony_ci struct device *dev = &iface->dev; 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci /* this should never happen, don't release something that's not ours */ 61562306a36Sopenharmony_ci if (!dev->driver || dev->driver != &driver->drvwrap.driver) 61662306a36Sopenharmony_ci return; 61762306a36Sopenharmony_ci 61862306a36Sopenharmony_ci /* don't release from within disconnect() */ 61962306a36Sopenharmony_ci if (iface->condition != USB_INTERFACE_BOUND) 62062306a36Sopenharmony_ci return; 62162306a36Sopenharmony_ci iface->condition = USB_INTERFACE_UNBINDING; 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci /* Release via the driver core only if the interface 62462306a36Sopenharmony_ci * has already been registered 62562306a36Sopenharmony_ci */ 62662306a36Sopenharmony_ci if (device_is_registered(dev)) { 62762306a36Sopenharmony_ci device_release_driver(dev); 62862306a36Sopenharmony_ci } else { 62962306a36Sopenharmony_ci device_lock(dev); 63062306a36Sopenharmony_ci usb_unbind_interface(dev); 63162306a36Sopenharmony_ci dev->driver = NULL; 63262306a36Sopenharmony_ci device_unlock(dev); 63362306a36Sopenharmony_ci } 63462306a36Sopenharmony_ci} 63562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_driver_release_interface); 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_ci/* returns 0 if no match, 1 if match */ 63862306a36Sopenharmony_ciint usb_match_device(struct usb_device *dev, const struct usb_device_id *id) 63962306a36Sopenharmony_ci{ 64062306a36Sopenharmony_ci if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) && 64162306a36Sopenharmony_ci id->idVendor != le16_to_cpu(dev->descriptor.idVendor)) 64262306a36Sopenharmony_ci return 0; 64362306a36Sopenharmony_ci 64462306a36Sopenharmony_ci if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) && 64562306a36Sopenharmony_ci id->idProduct != le16_to_cpu(dev->descriptor.idProduct)) 64662306a36Sopenharmony_ci return 0; 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_ci /* No need to test id->bcdDevice_lo != 0, since 0 is never 64962306a36Sopenharmony_ci greater than any unsigned number. */ 65062306a36Sopenharmony_ci if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) && 65162306a36Sopenharmony_ci (id->bcdDevice_lo > le16_to_cpu(dev->descriptor.bcdDevice))) 65262306a36Sopenharmony_ci return 0; 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ci if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) && 65562306a36Sopenharmony_ci (id->bcdDevice_hi < le16_to_cpu(dev->descriptor.bcdDevice))) 65662306a36Sopenharmony_ci return 0; 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_ci if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) && 65962306a36Sopenharmony_ci (id->bDeviceClass != dev->descriptor.bDeviceClass)) 66062306a36Sopenharmony_ci return 0; 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_ci if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) && 66362306a36Sopenharmony_ci (id->bDeviceSubClass != dev->descriptor.bDeviceSubClass)) 66462306a36Sopenharmony_ci return 0; 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_ci if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) && 66762306a36Sopenharmony_ci (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol)) 66862306a36Sopenharmony_ci return 0; 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ci return 1; 67162306a36Sopenharmony_ci} 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_ci/* returns 0 if no match, 1 if match */ 67462306a36Sopenharmony_ciint usb_match_one_id_intf(struct usb_device *dev, 67562306a36Sopenharmony_ci struct usb_host_interface *intf, 67662306a36Sopenharmony_ci const struct usb_device_id *id) 67762306a36Sopenharmony_ci{ 67862306a36Sopenharmony_ci /* The interface class, subclass, protocol and number should never be 67962306a36Sopenharmony_ci * checked for a match if the device class is Vendor Specific, 68062306a36Sopenharmony_ci * unless the match record specifies the Vendor ID. */ 68162306a36Sopenharmony_ci if (dev->descriptor.bDeviceClass == USB_CLASS_VENDOR_SPEC && 68262306a36Sopenharmony_ci !(id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) && 68362306a36Sopenharmony_ci (id->match_flags & (USB_DEVICE_ID_MATCH_INT_CLASS | 68462306a36Sopenharmony_ci USB_DEVICE_ID_MATCH_INT_SUBCLASS | 68562306a36Sopenharmony_ci USB_DEVICE_ID_MATCH_INT_PROTOCOL | 68662306a36Sopenharmony_ci USB_DEVICE_ID_MATCH_INT_NUMBER))) 68762306a36Sopenharmony_ci return 0; 68862306a36Sopenharmony_ci 68962306a36Sopenharmony_ci if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) && 69062306a36Sopenharmony_ci (id->bInterfaceClass != intf->desc.bInterfaceClass)) 69162306a36Sopenharmony_ci return 0; 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) && 69462306a36Sopenharmony_ci (id->bInterfaceSubClass != intf->desc.bInterfaceSubClass)) 69562306a36Sopenharmony_ci return 0; 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_PROTOCOL) && 69862306a36Sopenharmony_ci (id->bInterfaceProtocol != intf->desc.bInterfaceProtocol)) 69962306a36Sopenharmony_ci return 0; 70062306a36Sopenharmony_ci 70162306a36Sopenharmony_ci if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_NUMBER) && 70262306a36Sopenharmony_ci (id->bInterfaceNumber != intf->desc.bInterfaceNumber)) 70362306a36Sopenharmony_ci return 0; 70462306a36Sopenharmony_ci 70562306a36Sopenharmony_ci return 1; 70662306a36Sopenharmony_ci} 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_ci/* returns 0 if no match, 1 if match */ 70962306a36Sopenharmony_ciint usb_match_one_id(struct usb_interface *interface, 71062306a36Sopenharmony_ci const struct usb_device_id *id) 71162306a36Sopenharmony_ci{ 71262306a36Sopenharmony_ci struct usb_host_interface *intf; 71362306a36Sopenharmony_ci struct usb_device *dev; 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ci /* proc_connectinfo in devio.c may call us with id == NULL. */ 71662306a36Sopenharmony_ci if (id == NULL) 71762306a36Sopenharmony_ci return 0; 71862306a36Sopenharmony_ci 71962306a36Sopenharmony_ci intf = interface->cur_altsetting; 72062306a36Sopenharmony_ci dev = interface_to_usbdev(interface); 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_ci if (!usb_match_device(dev, id)) 72362306a36Sopenharmony_ci return 0; 72462306a36Sopenharmony_ci 72562306a36Sopenharmony_ci return usb_match_one_id_intf(dev, intf, id); 72662306a36Sopenharmony_ci} 72762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_match_one_id); 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_ci/** 73062306a36Sopenharmony_ci * usb_match_id - find first usb_device_id matching device or interface 73162306a36Sopenharmony_ci * @interface: the interface of interest 73262306a36Sopenharmony_ci * @id: array of usb_device_id structures, terminated by zero entry 73362306a36Sopenharmony_ci * 73462306a36Sopenharmony_ci * usb_match_id searches an array of usb_device_id's and returns 73562306a36Sopenharmony_ci * the first one matching the device or interface, or null. 73662306a36Sopenharmony_ci * This is used when binding (or rebinding) a driver to an interface. 73762306a36Sopenharmony_ci * Most USB device drivers will use this indirectly, through the usb core, 73862306a36Sopenharmony_ci * but some layered driver frameworks use it directly. 73962306a36Sopenharmony_ci * These device tables are exported with MODULE_DEVICE_TABLE, through 74062306a36Sopenharmony_ci * modutils, to support the driver loading functionality of USB hotplugging. 74162306a36Sopenharmony_ci * 74262306a36Sopenharmony_ci * Return: The first matching usb_device_id, or %NULL. 74362306a36Sopenharmony_ci * 74462306a36Sopenharmony_ci * What Matches: 74562306a36Sopenharmony_ci * 74662306a36Sopenharmony_ci * The "match_flags" element in a usb_device_id controls which 74762306a36Sopenharmony_ci * members are used. If the corresponding bit is set, the 74862306a36Sopenharmony_ci * value in the device_id must match its corresponding member 74962306a36Sopenharmony_ci * in the device or interface descriptor, or else the device_id 75062306a36Sopenharmony_ci * does not match. 75162306a36Sopenharmony_ci * 75262306a36Sopenharmony_ci * "driver_info" is normally used only by device drivers, 75362306a36Sopenharmony_ci * but you can create a wildcard "matches anything" usb_device_id 75462306a36Sopenharmony_ci * as a driver's "modules.usbmap" entry if you provide an id with 75562306a36Sopenharmony_ci * only a nonzero "driver_info" field. If you do this, the USB device 75662306a36Sopenharmony_ci * driver's probe() routine should use additional intelligence to 75762306a36Sopenharmony_ci * decide whether to bind to the specified interface. 75862306a36Sopenharmony_ci * 75962306a36Sopenharmony_ci * What Makes Good usb_device_id Tables: 76062306a36Sopenharmony_ci * 76162306a36Sopenharmony_ci * The match algorithm is very simple, so that intelligence in 76262306a36Sopenharmony_ci * driver selection must come from smart driver id records. 76362306a36Sopenharmony_ci * Unless you have good reasons to use another selection policy, 76462306a36Sopenharmony_ci * provide match elements only in related groups, and order match 76562306a36Sopenharmony_ci * specifiers from specific to general. Use the macros provided 76662306a36Sopenharmony_ci * for that purpose if you can. 76762306a36Sopenharmony_ci * 76862306a36Sopenharmony_ci * The most specific match specifiers use device descriptor 76962306a36Sopenharmony_ci * data. These are commonly used with product-specific matches; 77062306a36Sopenharmony_ci * the USB_DEVICE macro lets you provide vendor and product IDs, 77162306a36Sopenharmony_ci * and you can also match against ranges of product revisions. 77262306a36Sopenharmony_ci * These are widely used for devices with application or vendor 77362306a36Sopenharmony_ci * specific bDeviceClass values. 77462306a36Sopenharmony_ci * 77562306a36Sopenharmony_ci * Matches based on device class/subclass/protocol specifications 77662306a36Sopenharmony_ci * are slightly more general; use the USB_DEVICE_INFO macro, or 77762306a36Sopenharmony_ci * its siblings. These are used with single-function devices 77862306a36Sopenharmony_ci * where bDeviceClass doesn't specify that each interface has 77962306a36Sopenharmony_ci * its own class. 78062306a36Sopenharmony_ci * 78162306a36Sopenharmony_ci * Matches based on interface class/subclass/protocol are the 78262306a36Sopenharmony_ci * most general; they let drivers bind to any interface on a 78362306a36Sopenharmony_ci * multiple-function device. Use the USB_INTERFACE_INFO 78462306a36Sopenharmony_ci * macro, or its siblings, to match class-per-interface style 78562306a36Sopenharmony_ci * devices (as recorded in bInterfaceClass). 78662306a36Sopenharmony_ci * 78762306a36Sopenharmony_ci * Note that an entry created by USB_INTERFACE_INFO won't match 78862306a36Sopenharmony_ci * any interface if the device class is set to Vendor-Specific. 78962306a36Sopenharmony_ci * This is deliberate; according to the USB spec the meanings of 79062306a36Sopenharmony_ci * the interface class/subclass/protocol for these devices are also 79162306a36Sopenharmony_ci * vendor-specific, and hence matching against a standard product 79262306a36Sopenharmony_ci * class wouldn't work anyway. If you really want to use an 79362306a36Sopenharmony_ci * interface-based match for such a device, create a match record 79462306a36Sopenharmony_ci * that also specifies the vendor ID. (Unforunately there isn't a 79562306a36Sopenharmony_ci * standard macro for creating records like this.) 79662306a36Sopenharmony_ci * 79762306a36Sopenharmony_ci * Within those groups, remember that not all combinations are 79862306a36Sopenharmony_ci * meaningful. For example, don't give a product version range 79962306a36Sopenharmony_ci * without vendor and product IDs; or specify a protocol without 80062306a36Sopenharmony_ci * its associated class and subclass. 80162306a36Sopenharmony_ci */ 80262306a36Sopenharmony_ciconst struct usb_device_id *usb_match_id(struct usb_interface *interface, 80362306a36Sopenharmony_ci const struct usb_device_id *id) 80462306a36Sopenharmony_ci{ 80562306a36Sopenharmony_ci /* proc_connectinfo in devio.c may call us with id == NULL. */ 80662306a36Sopenharmony_ci if (id == NULL) 80762306a36Sopenharmony_ci return NULL; 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_ci /* It is important to check that id->driver_info is nonzero, 81062306a36Sopenharmony_ci since an entry that is all zeroes except for a nonzero 81162306a36Sopenharmony_ci id->driver_info is the way to create an entry that 81262306a36Sopenharmony_ci indicates that the driver want to examine every 81362306a36Sopenharmony_ci device and interface. */ 81462306a36Sopenharmony_ci for (; id->idVendor || id->idProduct || id->bDeviceClass || 81562306a36Sopenharmony_ci id->bInterfaceClass || id->driver_info; id++) { 81662306a36Sopenharmony_ci if (usb_match_one_id(interface, id)) 81762306a36Sopenharmony_ci return id; 81862306a36Sopenharmony_ci } 81962306a36Sopenharmony_ci 82062306a36Sopenharmony_ci return NULL; 82162306a36Sopenharmony_ci} 82262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_match_id); 82362306a36Sopenharmony_ci 82462306a36Sopenharmony_ciconst struct usb_device_id *usb_device_match_id(struct usb_device *udev, 82562306a36Sopenharmony_ci const struct usb_device_id *id) 82662306a36Sopenharmony_ci{ 82762306a36Sopenharmony_ci if (!id) 82862306a36Sopenharmony_ci return NULL; 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_ci for (; id->idVendor || id->idProduct ; id++) { 83162306a36Sopenharmony_ci if (usb_match_device(udev, id)) 83262306a36Sopenharmony_ci return id; 83362306a36Sopenharmony_ci } 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_ci return NULL; 83662306a36Sopenharmony_ci} 83762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_device_match_id); 83862306a36Sopenharmony_ci 83962306a36Sopenharmony_cibool usb_driver_applicable(struct usb_device *udev, 84062306a36Sopenharmony_ci struct usb_device_driver *udrv) 84162306a36Sopenharmony_ci{ 84262306a36Sopenharmony_ci if (udrv->id_table && udrv->match) 84362306a36Sopenharmony_ci return usb_device_match_id(udev, udrv->id_table) != NULL && 84462306a36Sopenharmony_ci udrv->match(udev); 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_ci if (udrv->id_table) 84762306a36Sopenharmony_ci return usb_device_match_id(udev, udrv->id_table) != NULL; 84862306a36Sopenharmony_ci 84962306a36Sopenharmony_ci if (udrv->match) 85062306a36Sopenharmony_ci return udrv->match(udev); 85162306a36Sopenharmony_ci 85262306a36Sopenharmony_ci return false; 85362306a36Sopenharmony_ci} 85462306a36Sopenharmony_ci 85562306a36Sopenharmony_cistatic int usb_device_match(struct device *dev, struct device_driver *drv) 85662306a36Sopenharmony_ci{ 85762306a36Sopenharmony_ci /* devices and interfaces are handled separately */ 85862306a36Sopenharmony_ci if (is_usb_device(dev)) { 85962306a36Sopenharmony_ci struct usb_device *udev; 86062306a36Sopenharmony_ci struct usb_device_driver *udrv; 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci /* interface drivers never match devices */ 86362306a36Sopenharmony_ci if (!is_usb_device_driver(drv)) 86462306a36Sopenharmony_ci return 0; 86562306a36Sopenharmony_ci 86662306a36Sopenharmony_ci udev = to_usb_device(dev); 86762306a36Sopenharmony_ci udrv = to_usb_device_driver(drv); 86862306a36Sopenharmony_ci 86962306a36Sopenharmony_ci /* If the device driver under consideration does not have a 87062306a36Sopenharmony_ci * id_table or a match function, then let the driver's probe 87162306a36Sopenharmony_ci * function decide. 87262306a36Sopenharmony_ci */ 87362306a36Sopenharmony_ci if (!udrv->id_table && !udrv->match) 87462306a36Sopenharmony_ci return 1; 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_ci return usb_driver_applicable(udev, udrv); 87762306a36Sopenharmony_ci 87862306a36Sopenharmony_ci } else if (is_usb_interface(dev)) { 87962306a36Sopenharmony_ci struct usb_interface *intf; 88062306a36Sopenharmony_ci struct usb_driver *usb_drv; 88162306a36Sopenharmony_ci const struct usb_device_id *id; 88262306a36Sopenharmony_ci 88362306a36Sopenharmony_ci /* device drivers never match interfaces */ 88462306a36Sopenharmony_ci if (is_usb_device_driver(drv)) 88562306a36Sopenharmony_ci return 0; 88662306a36Sopenharmony_ci 88762306a36Sopenharmony_ci intf = to_usb_interface(dev); 88862306a36Sopenharmony_ci usb_drv = to_usb_driver(drv); 88962306a36Sopenharmony_ci 89062306a36Sopenharmony_ci id = usb_match_id(intf, usb_drv->id_table); 89162306a36Sopenharmony_ci if (id) 89262306a36Sopenharmony_ci return 1; 89362306a36Sopenharmony_ci 89462306a36Sopenharmony_ci id = usb_match_dynamic_id(intf, usb_drv); 89562306a36Sopenharmony_ci if (id) 89662306a36Sopenharmony_ci return 1; 89762306a36Sopenharmony_ci } 89862306a36Sopenharmony_ci 89962306a36Sopenharmony_ci return 0; 90062306a36Sopenharmony_ci} 90162306a36Sopenharmony_ci 90262306a36Sopenharmony_cistatic int usb_uevent(const struct device *dev, struct kobj_uevent_env *env) 90362306a36Sopenharmony_ci{ 90462306a36Sopenharmony_ci const struct usb_device *usb_dev; 90562306a36Sopenharmony_ci 90662306a36Sopenharmony_ci if (is_usb_device(dev)) { 90762306a36Sopenharmony_ci usb_dev = to_usb_device(dev); 90862306a36Sopenharmony_ci } else if (is_usb_interface(dev)) { 90962306a36Sopenharmony_ci const struct usb_interface *intf = to_usb_interface(dev); 91062306a36Sopenharmony_ci 91162306a36Sopenharmony_ci usb_dev = interface_to_usbdev(intf); 91262306a36Sopenharmony_ci } else { 91362306a36Sopenharmony_ci return 0; 91462306a36Sopenharmony_ci } 91562306a36Sopenharmony_ci 91662306a36Sopenharmony_ci if (usb_dev->devnum < 0) { 91762306a36Sopenharmony_ci /* driver is often null here; dev_dbg() would oops */ 91862306a36Sopenharmony_ci pr_debug("usb %s: already deleted?\n", dev_name(dev)); 91962306a36Sopenharmony_ci return -ENODEV; 92062306a36Sopenharmony_ci } 92162306a36Sopenharmony_ci if (!usb_dev->bus) { 92262306a36Sopenharmony_ci pr_debug("usb %s: bus removed?\n", dev_name(dev)); 92362306a36Sopenharmony_ci return -ENODEV; 92462306a36Sopenharmony_ci } 92562306a36Sopenharmony_ci 92662306a36Sopenharmony_ci /* per-device configurations are common */ 92762306a36Sopenharmony_ci if (add_uevent_var(env, "PRODUCT=%x/%x/%x", 92862306a36Sopenharmony_ci le16_to_cpu(usb_dev->descriptor.idVendor), 92962306a36Sopenharmony_ci le16_to_cpu(usb_dev->descriptor.idProduct), 93062306a36Sopenharmony_ci le16_to_cpu(usb_dev->descriptor.bcdDevice))) 93162306a36Sopenharmony_ci return -ENOMEM; 93262306a36Sopenharmony_ci 93362306a36Sopenharmony_ci /* class-based driver binding models */ 93462306a36Sopenharmony_ci if (add_uevent_var(env, "TYPE=%d/%d/%d", 93562306a36Sopenharmony_ci usb_dev->descriptor.bDeviceClass, 93662306a36Sopenharmony_ci usb_dev->descriptor.bDeviceSubClass, 93762306a36Sopenharmony_ci usb_dev->descriptor.bDeviceProtocol)) 93862306a36Sopenharmony_ci return -ENOMEM; 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_ci return 0; 94162306a36Sopenharmony_ci} 94262306a36Sopenharmony_ci 94362306a36Sopenharmony_cistatic int __usb_bus_reprobe_drivers(struct device *dev, void *data) 94462306a36Sopenharmony_ci{ 94562306a36Sopenharmony_ci struct usb_device_driver *new_udriver = data; 94662306a36Sopenharmony_ci struct usb_device *udev; 94762306a36Sopenharmony_ci int ret; 94862306a36Sopenharmony_ci 94962306a36Sopenharmony_ci /* Don't reprobe if current driver isn't usb_generic_driver */ 95062306a36Sopenharmony_ci if (dev->driver != &usb_generic_driver.drvwrap.driver) 95162306a36Sopenharmony_ci return 0; 95262306a36Sopenharmony_ci 95362306a36Sopenharmony_ci udev = to_usb_device(dev); 95462306a36Sopenharmony_ci if (!usb_driver_applicable(udev, new_udriver)) 95562306a36Sopenharmony_ci return 0; 95662306a36Sopenharmony_ci 95762306a36Sopenharmony_ci ret = device_reprobe(dev); 95862306a36Sopenharmony_ci if (ret && ret != -EPROBE_DEFER) 95962306a36Sopenharmony_ci dev_err(dev, "Failed to reprobe device (error %d)\n", ret); 96062306a36Sopenharmony_ci 96162306a36Sopenharmony_ci return 0; 96262306a36Sopenharmony_ci} 96362306a36Sopenharmony_ci 96462306a36Sopenharmony_ci/** 96562306a36Sopenharmony_ci * usb_register_device_driver - register a USB device (not interface) driver 96662306a36Sopenharmony_ci * @new_udriver: USB operations for the device driver 96762306a36Sopenharmony_ci * @owner: module owner of this driver. 96862306a36Sopenharmony_ci * 96962306a36Sopenharmony_ci * Registers a USB device driver with the USB core. The list of 97062306a36Sopenharmony_ci * unattached devices will be rescanned whenever a new driver is 97162306a36Sopenharmony_ci * added, allowing the new driver to attach to any recognized devices. 97262306a36Sopenharmony_ci * 97362306a36Sopenharmony_ci * Return: A negative error code on failure and 0 on success. 97462306a36Sopenharmony_ci */ 97562306a36Sopenharmony_ciint usb_register_device_driver(struct usb_device_driver *new_udriver, 97662306a36Sopenharmony_ci struct module *owner) 97762306a36Sopenharmony_ci{ 97862306a36Sopenharmony_ci int retval = 0; 97962306a36Sopenharmony_ci 98062306a36Sopenharmony_ci if (usb_disabled()) 98162306a36Sopenharmony_ci return -ENODEV; 98262306a36Sopenharmony_ci 98362306a36Sopenharmony_ci new_udriver->drvwrap.for_devices = 1; 98462306a36Sopenharmony_ci new_udriver->drvwrap.driver.name = new_udriver->name; 98562306a36Sopenharmony_ci new_udriver->drvwrap.driver.bus = &usb_bus_type; 98662306a36Sopenharmony_ci new_udriver->drvwrap.driver.probe = usb_probe_device; 98762306a36Sopenharmony_ci new_udriver->drvwrap.driver.remove = usb_unbind_device; 98862306a36Sopenharmony_ci new_udriver->drvwrap.driver.owner = owner; 98962306a36Sopenharmony_ci new_udriver->drvwrap.driver.dev_groups = new_udriver->dev_groups; 99062306a36Sopenharmony_ci 99162306a36Sopenharmony_ci retval = driver_register(&new_udriver->drvwrap.driver); 99262306a36Sopenharmony_ci 99362306a36Sopenharmony_ci if (!retval) { 99462306a36Sopenharmony_ci pr_info("%s: registered new device driver %s\n", 99562306a36Sopenharmony_ci usbcore_name, new_udriver->name); 99662306a36Sopenharmony_ci /* 99762306a36Sopenharmony_ci * Check whether any device could be better served with 99862306a36Sopenharmony_ci * this new driver 99962306a36Sopenharmony_ci */ 100062306a36Sopenharmony_ci bus_for_each_dev(&usb_bus_type, NULL, new_udriver, 100162306a36Sopenharmony_ci __usb_bus_reprobe_drivers); 100262306a36Sopenharmony_ci } else { 100362306a36Sopenharmony_ci pr_err("%s: error %d registering device driver %s\n", 100462306a36Sopenharmony_ci usbcore_name, retval, new_udriver->name); 100562306a36Sopenharmony_ci } 100662306a36Sopenharmony_ci 100762306a36Sopenharmony_ci return retval; 100862306a36Sopenharmony_ci} 100962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_register_device_driver); 101062306a36Sopenharmony_ci 101162306a36Sopenharmony_ci/** 101262306a36Sopenharmony_ci * usb_deregister_device_driver - unregister a USB device (not interface) driver 101362306a36Sopenharmony_ci * @udriver: USB operations of the device driver to unregister 101462306a36Sopenharmony_ci * Context: must be able to sleep 101562306a36Sopenharmony_ci * 101662306a36Sopenharmony_ci * Unlinks the specified driver from the internal USB driver list. 101762306a36Sopenharmony_ci */ 101862306a36Sopenharmony_civoid usb_deregister_device_driver(struct usb_device_driver *udriver) 101962306a36Sopenharmony_ci{ 102062306a36Sopenharmony_ci pr_info("%s: deregistering device driver %s\n", 102162306a36Sopenharmony_ci usbcore_name, udriver->name); 102262306a36Sopenharmony_ci 102362306a36Sopenharmony_ci driver_unregister(&udriver->drvwrap.driver); 102462306a36Sopenharmony_ci} 102562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_deregister_device_driver); 102662306a36Sopenharmony_ci 102762306a36Sopenharmony_ci/** 102862306a36Sopenharmony_ci * usb_register_driver - register a USB interface driver 102962306a36Sopenharmony_ci * @new_driver: USB operations for the interface driver 103062306a36Sopenharmony_ci * @owner: module owner of this driver. 103162306a36Sopenharmony_ci * @mod_name: module name string 103262306a36Sopenharmony_ci * 103362306a36Sopenharmony_ci * Registers a USB interface driver with the USB core. The list of 103462306a36Sopenharmony_ci * unattached interfaces will be rescanned whenever a new driver is 103562306a36Sopenharmony_ci * added, allowing the new driver to attach to any recognized interfaces. 103662306a36Sopenharmony_ci * 103762306a36Sopenharmony_ci * Return: A negative error code on failure and 0 on success. 103862306a36Sopenharmony_ci * 103962306a36Sopenharmony_ci * NOTE: if you want your driver to use the USB major number, you must call 104062306a36Sopenharmony_ci * usb_register_dev() to enable that functionality. This function no longer 104162306a36Sopenharmony_ci * takes care of that. 104262306a36Sopenharmony_ci */ 104362306a36Sopenharmony_ciint usb_register_driver(struct usb_driver *new_driver, struct module *owner, 104462306a36Sopenharmony_ci const char *mod_name) 104562306a36Sopenharmony_ci{ 104662306a36Sopenharmony_ci int retval = 0; 104762306a36Sopenharmony_ci 104862306a36Sopenharmony_ci if (usb_disabled()) 104962306a36Sopenharmony_ci return -ENODEV; 105062306a36Sopenharmony_ci 105162306a36Sopenharmony_ci new_driver->drvwrap.for_devices = 0; 105262306a36Sopenharmony_ci new_driver->drvwrap.driver.name = new_driver->name; 105362306a36Sopenharmony_ci new_driver->drvwrap.driver.bus = &usb_bus_type; 105462306a36Sopenharmony_ci new_driver->drvwrap.driver.probe = usb_probe_interface; 105562306a36Sopenharmony_ci new_driver->drvwrap.driver.remove = usb_unbind_interface; 105662306a36Sopenharmony_ci new_driver->drvwrap.driver.owner = owner; 105762306a36Sopenharmony_ci new_driver->drvwrap.driver.mod_name = mod_name; 105862306a36Sopenharmony_ci new_driver->drvwrap.driver.dev_groups = new_driver->dev_groups; 105962306a36Sopenharmony_ci spin_lock_init(&new_driver->dynids.lock); 106062306a36Sopenharmony_ci INIT_LIST_HEAD(&new_driver->dynids.list); 106162306a36Sopenharmony_ci 106262306a36Sopenharmony_ci retval = driver_register(&new_driver->drvwrap.driver); 106362306a36Sopenharmony_ci if (retval) 106462306a36Sopenharmony_ci goto out; 106562306a36Sopenharmony_ci 106662306a36Sopenharmony_ci retval = usb_create_newid_files(new_driver); 106762306a36Sopenharmony_ci if (retval) 106862306a36Sopenharmony_ci goto out_newid; 106962306a36Sopenharmony_ci 107062306a36Sopenharmony_ci pr_info("%s: registered new interface driver %s\n", 107162306a36Sopenharmony_ci usbcore_name, new_driver->name); 107262306a36Sopenharmony_ci 107362306a36Sopenharmony_ciout: 107462306a36Sopenharmony_ci return retval; 107562306a36Sopenharmony_ci 107662306a36Sopenharmony_ciout_newid: 107762306a36Sopenharmony_ci driver_unregister(&new_driver->drvwrap.driver); 107862306a36Sopenharmony_ci 107962306a36Sopenharmony_ci pr_err("%s: error %d registering interface driver %s\n", 108062306a36Sopenharmony_ci usbcore_name, retval, new_driver->name); 108162306a36Sopenharmony_ci goto out; 108262306a36Sopenharmony_ci} 108362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_register_driver); 108462306a36Sopenharmony_ci 108562306a36Sopenharmony_ci/** 108662306a36Sopenharmony_ci * usb_deregister - unregister a USB interface driver 108762306a36Sopenharmony_ci * @driver: USB operations of the interface driver to unregister 108862306a36Sopenharmony_ci * Context: must be able to sleep 108962306a36Sopenharmony_ci * 109062306a36Sopenharmony_ci * Unlinks the specified driver from the internal USB driver list. 109162306a36Sopenharmony_ci * 109262306a36Sopenharmony_ci * NOTE: If you called usb_register_dev(), you still need to call 109362306a36Sopenharmony_ci * usb_deregister_dev() to clean up your driver's allocated minor numbers, 109462306a36Sopenharmony_ci * this * call will no longer do it for you. 109562306a36Sopenharmony_ci */ 109662306a36Sopenharmony_civoid usb_deregister(struct usb_driver *driver) 109762306a36Sopenharmony_ci{ 109862306a36Sopenharmony_ci pr_info("%s: deregistering interface driver %s\n", 109962306a36Sopenharmony_ci usbcore_name, driver->name); 110062306a36Sopenharmony_ci 110162306a36Sopenharmony_ci usb_remove_newid_files(driver); 110262306a36Sopenharmony_ci driver_unregister(&driver->drvwrap.driver); 110362306a36Sopenharmony_ci usb_free_dynids(driver); 110462306a36Sopenharmony_ci} 110562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_deregister); 110662306a36Sopenharmony_ci 110762306a36Sopenharmony_ci/* Forced unbinding of a USB interface driver, either because 110862306a36Sopenharmony_ci * it doesn't support pre_reset/post_reset/reset_resume or 110962306a36Sopenharmony_ci * because it doesn't support suspend/resume. 111062306a36Sopenharmony_ci * 111162306a36Sopenharmony_ci * The caller must hold @intf's device's lock, but not @intf's lock. 111262306a36Sopenharmony_ci */ 111362306a36Sopenharmony_civoid usb_forced_unbind_intf(struct usb_interface *intf) 111462306a36Sopenharmony_ci{ 111562306a36Sopenharmony_ci struct usb_driver *driver = to_usb_driver(intf->dev.driver); 111662306a36Sopenharmony_ci 111762306a36Sopenharmony_ci dev_dbg(&intf->dev, "forced unbind\n"); 111862306a36Sopenharmony_ci usb_driver_release_interface(driver, intf); 111962306a36Sopenharmony_ci 112062306a36Sopenharmony_ci /* Mark the interface for later rebinding */ 112162306a36Sopenharmony_ci intf->needs_binding = 1; 112262306a36Sopenharmony_ci} 112362306a36Sopenharmony_ci 112462306a36Sopenharmony_ci/* 112562306a36Sopenharmony_ci * Unbind drivers for @udev's marked interfaces. These interfaces have 112662306a36Sopenharmony_ci * the needs_binding flag set, for example by usb_resume_interface(). 112762306a36Sopenharmony_ci * 112862306a36Sopenharmony_ci * The caller must hold @udev's device lock. 112962306a36Sopenharmony_ci */ 113062306a36Sopenharmony_cistatic void unbind_marked_interfaces(struct usb_device *udev) 113162306a36Sopenharmony_ci{ 113262306a36Sopenharmony_ci struct usb_host_config *config; 113362306a36Sopenharmony_ci int i; 113462306a36Sopenharmony_ci struct usb_interface *intf; 113562306a36Sopenharmony_ci 113662306a36Sopenharmony_ci config = udev->actconfig; 113762306a36Sopenharmony_ci if (config) { 113862306a36Sopenharmony_ci for (i = 0; i < config->desc.bNumInterfaces; ++i) { 113962306a36Sopenharmony_ci intf = config->interface[i]; 114062306a36Sopenharmony_ci if (intf->dev.driver && intf->needs_binding) 114162306a36Sopenharmony_ci usb_forced_unbind_intf(intf); 114262306a36Sopenharmony_ci } 114362306a36Sopenharmony_ci } 114462306a36Sopenharmony_ci} 114562306a36Sopenharmony_ci 114662306a36Sopenharmony_ci/* Delayed forced unbinding of a USB interface driver and scan 114762306a36Sopenharmony_ci * for rebinding. 114862306a36Sopenharmony_ci * 114962306a36Sopenharmony_ci * The caller must hold @intf's device's lock, but not @intf's lock. 115062306a36Sopenharmony_ci * 115162306a36Sopenharmony_ci * Note: Rebinds will be skipped if a system sleep transition is in 115262306a36Sopenharmony_ci * progress and the PM "complete" callback hasn't occurred yet. 115362306a36Sopenharmony_ci */ 115462306a36Sopenharmony_cistatic void usb_rebind_intf(struct usb_interface *intf) 115562306a36Sopenharmony_ci{ 115662306a36Sopenharmony_ci int rc; 115762306a36Sopenharmony_ci 115862306a36Sopenharmony_ci /* Delayed unbind of an existing driver */ 115962306a36Sopenharmony_ci if (intf->dev.driver) 116062306a36Sopenharmony_ci usb_forced_unbind_intf(intf); 116162306a36Sopenharmony_ci 116262306a36Sopenharmony_ci /* Try to rebind the interface */ 116362306a36Sopenharmony_ci if (!intf->dev.power.is_prepared) { 116462306a36Sopenharmony_ci intf->needs_binding = 0; 116562306a36Sopenharmony_ci rc = device_attach(&intf->dev); 116662306a36Sopenharmony_ci if (rc < 0 && rc != -EPROBE_DEFER) 116762306a36Sopenharmony_ci dev_warn(&intf->dev, "rebind failed: %d\n", rc); 116862306a36Sopenharmony_ci } 116962306a36Sopenharmony_ci} 117062306a36Sopenharmony_ci 117162306a36Sopenharmony_ci/* 117262306a36Sopenharmony_ci * Rebind drivers to @udev's marked interfaces. These interfaces have 117362306a36Sopenharmony_ci * the needs_binding flag set. 117462306a36Sopenharmony_ci * 117562306a36Sopenharmony_ci * The caller must hold @udev's device lock. 117662306a36Sopenharmony_ci */ 117762306a36Sopenharmony_cistatic void rebind_marked_interfaces(struct usb_device *udev) 117862306a36Sopenharmony_ci{ 117962306a36Sopenharmony_ci struct usb_host_config *config; 118062306a36Sopenharmony_ci int i; 118162306a36Sopenharmony_ci struct usb_interface *intf; 118262306a36Sopenharmony_ci 118362306a36Sopenharmony_ci config = udev->actconfig; 118462306a36Sopenharmony_ci if (config) { 118562306a36Sopenharmony_ci for (i = 0; i < config->desc.bNumInterfaces; ++i) { 118662306a36Sopenharmony_ci intf = config->interface[i]; 118762306a36Sopenharmony_ci if (intf->needs_binding) 118862306a36Sopenharmony_ci usb_rebind_intf(intf); 118962306a36Sopenharmony_ci } 119062306a36Sopenharmony_ci } 119162306a36Sopenharmony_ci} 119262306a36Sopenharmony_ci 119362306a36Sopenharmony_ci/* 119462306a36Sopenharmony_ci * Unbind all of @udev's marked interfaces and then rebind all of them. 119562306a36Sopenharmony_ci * This ordering is necessary because some drivers claim several interfaces 119662306a36Sopenharmony_ci * when they are first probed. 119762306a36Sopenharmony_ci * 119862306a36Sopenharmony_ci * The caller must hold @udev's device lock. 119962306a36Sopenharmony_ci */ 120062306a36Sopenharmony_civoid usb_unbind_and_rebind_marked_interfaces(struct usb_device *udev) 120162306a36Sopenharmony_ci{ 120262306a36Sopenharmony_ci unbind_marked_interfaces(udev); 120362306a36Sopenharmony_ci rebind_marked_interfaces(udev); 120462306a36Sopenharmony_ci} 120562306a36Sopenharmony_ci 120662306a36Sopenharmony_ci#ifdef CONFIG_PM 120762306a36Sopenharmony_ci 120862306a36Sopenharmony_ci/* Unbind drivers for @udev's interfaces that don't support suspend/resume 120962306a36Sopenharmony_ci * There is no check for reset_resume here because it can be determined 121062306a36Sopenharmony_ci * only during resume whether reset_resume is needed. 121162306a36Sopenharmony_ci * 121262306a36Sopenharmony_ci * The caller must hold @udev's device lock. 121362306a36Sopenharmony_ci */ 121462306a36Sopenharmony_cistatic void unbind_no_pm_drivers_interfaces(struct usb_device *udev) 121562306a36Sopenharmony_ci{ 121662306a36Sopenharmony_ci struct usb_host_config *config; 121762306a36Sopenharmony_ci int i; 121862306a36Sopenharmony_ci struct usb_interface *intf; 121962306a36Sopenharmony_ci struct usb_driver *drv; 122062306a36Sopenharmony_ci 122162306a36Sopenharmony_ci config = udev->actconfig; 122262306a36Sopenharmony_ci if (config) { 122362306a36Sopenharmony_ci for (i = 0; i < config->desc.bNumInterfaces; ++i) { 122462306a36Sopenharmony_ci intf = config->interface[i]; 122562306a36Sopenharmony_ci 122662306a36Sopenharmony_ci if (intf->dev.driver) { 122762306a36Sopenharmony_ci drv = to_usb_driver(intf->dev.driver); 122862306a36Sopenharmony_ci if (!drv->suspend || !drv->resume) 122962306a36Sopenharmony_ci usb_forced_unbind_intf(intf); 123062306a36Sopenharmony_ci } 123162306a36Sopenharmony_ci } 123262306a36Sopenharmony_ci } 123362306a36Sopenharmony_ci} 123462306a36Sopenharmony_ci 123562306a36Sopenharmony_cistatic int usb_suspend_device(struct usb_device *udev, pm_message_t msg) 123662306a36Sopenharmony_ci{ 123762306a36Sopenharmony_ci struct usb_device_driver *udriver; 123862306a36Sopenharmony_ci int status = 0; 123962306a36Sopenharmony_ci 124062306a36Sopenharmony_ci if (udev->state == USB_STATE_NOTATTACHED || 124162306a36Sopenharmony_ci udev->state == USB_STATE_SUSPENDED) 124262306a36Sopenharmony_ci goto done; 124362306a36Sopenharmony_ci 124462306a36Sopenharmony_ci /* For devices that don't have a driver, we do a generic suspend. */ 124562306a36Sopenharmony_ci if (udev->dev.driver) 124662306a36Sopenharmony_ci udriver = to_usb_device_driver(udev->dev.driver); 124762306a36Sopenharmony_ci else { 124862306a36Sopenharmony_ci udev->do_remote_wakeup = 0; 124962306a36Sopenharmony_ci udriver = &usb_generic_driver; 125062306a36Sopenharmony_ci } 125162306a36Sopenharmony_ci if (udriver->suspend) 125262306a36Sopenharmony_ci status = udriver->suspend(udev, msg); 125362306a36Sopenharmony_ci if (status == 0 && udriver->generic_subclass) 125462306a36Sopenharmony_ci status = usb_generic_driver_suspend(udev, msg); 125562306a36Sopenharmony_ci 125662306a36Sopenharmony_ci done: 125762306a36Sopenharmony_ci dev_vdbg(&udev->dev, "%s: status %d\n", __func__, status); 125862306a36Sopenharmony_ci return status; 125962306a36Sopenharmony_ci} 126062306a36Sopenharmony_ci 126162306a36Sopenharmony_cistatic int usb_resume_device(struct usb_device *udev, pm_message_t msg) 126262306a36Sopenharmony_ci{ 126362306a36Sopenharmony_ci struct usb_device_driver *udriver; 126462306a36Sopenharmony_ci int status = 0; 126562306a36Sopenharmony_ci 126662306a36Sopenharmony_ci if (udev->state == USB_STATE_NOTATTACHED) 126762306a36Sopenharmony_ci goto done; 126862306a36Sopenharmony_ci 126962306a36Sopenharmony_ci /* Can't resume it if it doesn't have a driver. */ 127062306a36Sopenharmony_ci if (udev->dev.driver == NULL) { 127162306a36Sopenharmony_ci status = -ENOTCONN; 127262306a36Sopenharmony_ci goto done; 127362306a36Sopenharmony_ci } 127462306a36Sopenharmony_ci 127562306a36Sopenharmony_ci /* Non-root devices on a full/low-speed bus must wait for their 127662306a36Sopenharmony_ci * companion high-speed root hub, in case a handoff is needed. 127762306a36Sopenharmony_ci */ 127862306a36Sopenharmony_ci if (!PMSG_IS_AUTO(msg) && udev->parent && udev->bus->hs_companion) 127962306a36Sopenharmony_ci device_pm_wait_for_dev(&udev->dev, 128062306a36Sopenharmony_ci &udev->bus->hs_companion->root_hub->dev); 128162306a36Sopenharmony_ci 128262306a36Sopenharmony_ci if (udev->quirks & USB_QUIRK_RESET_RESUME) 128362306a36Sopenharmony_ci udev->reset_resume = 1; 128462306a36Sopenharmony_ci 128562306a36Sopenharmony_ci udriver = to_usb_device_driver(udev->dev.driver); 128662306a36Sopenharmony_ci if (udriver->generic_subclass) 128762306a36Sopenharmony_ci status = usb_generic_driver_resume(udev, msg); 128862306a36Sopenharmony_ci if (status == 0 && udriver->resume) 128962306a36Sopenharmony_ci status = udriver->resume(udev, msg); 129062306a36Sopenharmony_ci 129162306a36Sopenharmony_ci done: 129262306a36Sopenharmony_ci dev_vdbg(&udev->dev, "%s: status %d\n", __func__, status); 129362306a36Sopenharmony_ci return status; 129462306a36Sopenharmony_ci} 129562306a36Sopenharmony_ci 129662306a36Sopenharmony_cistatic int usb_suspend_interface(struct usb_device *udev, 129762306a36Sopenharmony_ci struct usb_interface *intf, pm_message_t msg) 129862306a36Sopenharmony_ci{ 129962306a36Sopenharmony_ci struct usb_driver *driver; 130062306a36Sopenharmony_ci int status = 0; 130162306a36Sopenharmony_ci 130262306a36Sopenharmony_ci if (udev->state == USB_STATE_NOTATTACHED || 130362306a36Sopenharmony_ci intf->condition == USB_INTERFACE_UNBOUND) 130462306a36Sopenharmony_ci goto done; 130562306a36Sopenharmony_ci driver = to_usb_driver(intf->dev.driver); 130662306a36Sopenharmony_ci 130762306a36Sopenharmony_ci /* at this time we know the driver supports suspend */ 130862306a36Sopenharmony_ci status = driver->suspend(intf, msg); 130962306a36Sopenharmony_ci if (status && !PMSG_IS_AUTO(msg)) 131062306a36Sopenharmony_ci dev_err(&intf->dev, "suspend error %d\n", status); 131162306a36Sopenharmony_ci 131262306a36Sopenharmony_ci done: 131362306a36Sopenharmony_ci dev_vdbg(&intf->dev, "%s: status %d\n", __func__, status); 131462306a36Sopenharmony_ci return status; 131562306a36Sopenharmony_ci} 131662306a36Sopenharmony_ci 131762306a36Sopenharmony_cistatic int usb_resume_interface(struct usb_device *udev, 131862306a36Sopenharmony_ci struct usb_interface *intf, pm_message_t msg, int reset_resume) 131962306a36Sopenharmony_ci{ 132062306a36Sopenharmony_ci struct usb_driver *driver; 132162306a36Sopenharmony_ci int status = 0; 132262306a36Sopenharmony_ci 132362306a36Sopenharmony_ci if (udev->state == USB_STATE_NOTATTACHED) 132462306a36Sopenharmony_ci goto done; 132562306a36Sopenharmony_ci 132662306a36Sopenharmony_ci /* Don't let autoresume interfere with unbinding */ 132762306a36Sopenharmony_ci if (intf->condition == USB_INTERFACE_UNBINDING) 132862306a36Sopenharmony_ci goto done; 132962306a36Sopenharmony_ci 133062306a36Sopenharmony_ci /* Can't resume it if it doesn't have a driver. */ 133162306a36Sopenharmony_ci if (intf->condition == USB_INTERFACE_UNBOUND) { 133262306a36Sopenharmony_ci 133362306a36Sopenharmony_ci /* Carry out a deferred switch to altsetting 0 */ 133462306a36Sopenharmony_ci if (intf->needs_altsetting0 && !intf->dev.power.is_prepared) { 133562306a36Sopenharmony_ci usb_set_interface(udev, intf->altsetting[0]. 133662306a36Sopenharmony_ci desc.bInterfaceNumber, 0); 133762306a36Sopenharmony_ci intf->needs_altsetting0 = 0; 133862306a36Sopenharmony_ci } 133962306a36Sopenharmony_ci goto done; 134062306a36Sopenharmony_ci } 134162306a36Sopenharmony_ci 134262306a36Sopenharmony_ci /* Don't resume if the interface is marked for rebinding */ 134362306a36Sopenharmony_ci if (intf->needs_binding) 134462306a36Sopenharmony_ci goto done; 134562306a36Sopenharmony_ci driver = to_usb_driver(intf->dev.driver); 134662306a36Sopenharmony_ci 134762306a36Sopenharmony_ci if (reset_resume) { 134862306a36Sopenharmony_ci if (driver->reset_resume) { 134962306a36Sopenharmony_ci status = driver->reset_resume(intf); 135062306a36Sopenharmony_ci if (status) 135162306a36Sopenharmony_ci dev_err(&intf->dev, "%s error %d\n", 135262306a36Sopenharmony_ci "reset_resume", status); 135362306a36Sopenharmony_ci } else { 135462306a36Sopenharmony_ci intf->needs_binding = 1; 135562306a36Sopenharmony_ci dev_dbg(&intf->dev, "no reset_resume for driver %s?\n", 135662306a36Sopenharmony_ci driver->name); 135762306a36Sopenharmony_ci } 135862306a36Sopenharmony_ci } else { 135962306a36Sopenharmony_ci status = driver->resume(intf); 136062306a36Sopenharmony_ci if (status) 136162306a36Sopenharmony_ci dev_err(&intf->dev, "resume error %d\n", status); 136262306a36Sopenharmony_ci } 136362306a36Sopenharmony_ci 136462306a36Sopenharmony_cidone: 136562306a36Sopenharmony_ci dev_vdbg(&intf->dev, "%s: status %d\n", __func__, status); 136662306a36Sopenharmony_ci 136762306a36Sopenharmony_ci /* Later we will unbind the driver and/or reprobe, if necessary */ 136862306a36Sopenharmony_ci return status; 136962306a36Sopenharmony_ci} 137062306a36Sopenharmony_ci 137162306a36Sopenharmony_ci/** 137262306a36Sopenharmony_ci * usb_suspend_both - suspend a USB device and its interfaces 137362306a36Sopenharmony_ci * @udev: the usb_device to suspend 137462306a36Sopenharmony_ci * @msg: Power Management message describing this state transition 137562306a36Sopenharmony_ci * 137662306a36Sopenharmony_ci * This is the central routine for suspending USB devices. It calls the 137762306a36Sopenharmony_ci * suspend methods for all the interface drivers in @udev and then calls 137862306a36Sopenharmony_ci * the suspend method for @udev itself. When the routine is called in 137962306a36Sopenharmony_ci * autosuspend, if an error occurs at any stage, all the interfaces 138062306a36Sopenharmony_ci * which were suspended are resumed so that they remain in the same 138162306a36Sopenharmony_ci * state as the device, but when called from system sleep, all error 138262306a36Sopenharmony_ci * from suspend methods of interfaces and the non-root-hub device itself 138362306a36Sopenharmony_ci * are simply ignored, so all suspended interfaces are only resumed 138462306a36Sopenharmony_ci * to the device's state when @udev is root-hub and its suspend method 138562306a36Sopenharmony_ci * returns failure. 138662306a36Sopenharmony_ci * 138762306a36Sopenharmony_ci * Autosuspend requests originating from a child device or an interface 138862306a36Sopenharmony_ci * driver may be made without the protection of @udev's device lock, but 138962306a36Sopenharmony_ci * all other suspend calls will hold the lock. Usbcore will insure that 139062306a36Sopenharmony_ci * method calls do not arrive during bind, unbind, or reset operations. 139162306a36Sopenharmony_ci * However drivers must be prepared to handle suspend calls arriving at 139262306a36Sopenharmony_ci * unpredictable times. 139362306a36Sopenharmony_ci * 139462306a36Sopenharmony_ci * This routine can run only in process context. 139562306a36Sopenharmony_ci * 139662306a36Sopenharmony_ci * Return: 0 if the suspend succeeded. 139762306a36Sopenharmony_ci */ 139862306a36Sopenharmony_cistatic int usb_suspend_both(struct usb_device *udev, pm_message_t msg) 139962306a36Sopenharmony_ci{ 140062306a36Sopenharmony_ci int status = 0; 140162306a36Sopenharmony_ci int i = 0, n = 0; 140262306a36Sopenharmony_ci struct usb_interface *intf; 140362306a36Sopenharmony_ci 140462306a36Sopenharmony_ci if (udev->state == USB_STATE_NOTATTACHED || 140562306a36Sopenharmony_ci udev->state == USB_STATE_SUSPENDED) 140662306a36Sopenharmony_ci goto done; 140762306a36Sopenharmony_ci 140862306a36Sopenharmony_ci /* Suspend all the interfaces and then udev itself */ 140962306a36Sopenharmony_ci if (udev->actconfig) { 141062306a36Sopenharmony_ci n = udev->actconfig->desc.bNumInterfaces; 141162306a36Sopenharmony_ci for (i = n - 1; i >= 0; --i) { 141262306a36Sopenharmony_ci intf = udev->actconfig->interface[i]; 141362306a36Sopenharmony_ci status = usb_suspend_interface(udev, intf, msg); 141462306a36Sopenharmony_ci 141562306a36Sopenharmony_ci /* Ignore errors during system sleep transitions */ 141662306a36Sopenharmony_ci if (!PMSG_IS_AUTO(msg)) 141762306a36Sopenharmony_ci status = 0; 141862306a36Sopenharmony_ci if (status != 0) 141962306a36Sopenharmony_ci break; 142062306a36Sopenharmony_ci } 142162306a36Sopenharmony_ci } 142262306a36Sopenharmony_ci if (status == 0) { 142362306a36Sopenharmony_ci status = usb_suspend_device(udev, msg); 142462306a36Sopenharmony_ci 142562306a36Sopenharmony_ci /* 142662306a36Sopenharmony_ci * Ignore errors from non-root-hub devices during 142762306a36Sopenharmony_ci * system sleep transitions. For the most part, 142862306a36Sopenharmony_ci * these devices should go to low power anyway when 142962306a36Sopenharmony_ci * the entire bus is suspended. 143062306a36Sopenharmony_ci */ 143162306a36Sopenharmony_ci if (udev->parent && !PMSG_IS_AUTO(msg)) 143262306a36Sopenharmony_ci status = 0; 143362306a36Sopenharmony_ci 143462306a36Sopenharmony_ci /* 143562306a36Sopenharmony_ci * If the device is inaccessible, don't try to resume 143662306a36Sopenharmony_ci * suspended interfaces and just return the error. 143762306a36Sopenharmony_ci */ 143862306a36Sopenharmony_ci if (status && status != -EBUSY) { 143962306a36Sopenharmony_ci int err; 144062306a36Sopenharmony_ci u16 devstat; 144162306a36Sopenharmony_ci 144262306a36Sopenharmony_ci err = usb_get_std_status(udev, USB_RECIP_DEVICE, 0, 144362306a36Sopenharmony_ci &devstat); 144462306a36Sopenharmony_ci if (err) { 144562306a36Sopenharmony_ci dev_err(&udev->dev, 144662306a36Sopenharmony_ci "Failed to suspend device, error %d\n", 144762306a36Sopenharmony_ci status); 144862306a36Sopenharmony_ci goto done; 144962306a36Sopenharmony_ci } 145062306a36Sopenharmony_ci } 145162306a36Sopenharmony_ci } 145262306a36Sopenharmony_ci 145362306a36Sopenharmony_ci /* If the suspend failed, resume interfaces that did get suspended */ 145462306a36Sopenharmony_ci if (status != 0) { 145562306a36Sopenharmony_ci if (udev->actconfig) { 145662306a36Sopenharmony_ci msg.event ^= (PM_EVENT_SUSPEND | PM_EVENT_RESUME); 145762306a36Sopenharmony_ci while (++i < n) { 145862306a36Sopenharmony_ci intf = udev->actconfig->interface[i]; 145962306a36Sopenharmony_ci usb_resume_interface(udev, intf, msg, 0); 146062306a36Sopenharmony_ci } 146162306a36Sopenharmony_ci } 146262306a36Sopenharmony_ci 146362306a36Sopenharmony_ci /* If the suspend succeeded then prevent any more URB submissions 146462306a36Sopenharmony_ci * and flush any outstanding URBs. 146562306a36Sopenharmony_ci */ 146662306a36Sopenharmony_ci } else { 146762306a36Sopenharmony_ci udev->can_submit = 0; 146862306a36Sopenharmony_ci for (i = 0; i < 16; ++i) { 146962306a36Sopenharmony_ci usb_hcd_flush_endpoint(udev, udev->ep_out[i]); 147062306a36Sopenharmony_ci usb_hcd_flush_endpoint(udev, udev->ep_in[i]); 147162306a36Sopenharmony_ci } 147262306a36Sopenharmony_ci } 147362306a36Sopenharmony_ci 147462306a36Sopenharmony_ci done: 147562306a36Sopenharmony_ci dev_vdbg(&udev->dev, "%s: status %d\n", __func__, status); 147662306a36Sopenharmony_ci return status; 147762306a36Sopenharmony_ci} 147862306a36Sopenharmony_ci 147962306a36Sopenharmony_ci/** 148062306a36Sopenharmony_ci * usb_resume_both - resume a USB device and its interfaces 148162306a36Sopenharmony_ci * @udev: the usb_device to resume 148262306a36Sopenharmony_ci * @msg: Power Management message describing this state transition 148362306a36Sopenharmony_ci * 148462306a36Sopenharmony_ci * This is the central routine for resuming USB devices. It calls the 148562306a36Sopenharmony_ci * resume method for @udev and then calls the resume methods for all 148662306a36Sopenharmony_ci * the interface drivers in @udev. 148762306a36Sopenharmony_ci * 148862306a36Sopenharmony_ci * Autoresume requests originating from a child device or an interface 148962306a36Sopenharmony_ci * driver may be made without the protection of @udev's device lock, but 149062306a36Sopenharmony_ci * all other resume calls will hold the lock. Usbcore will insure that 149162306a36Sopenharmony_ci * method calls do not arrive during bind, unbind, or reset operations. 149262306a36Sopenharmony_ci * However drivers must be prepared to handle resume calls arriving at 149362306a36Sopenharmony_ci * unpredictable times. 149462306a36Sopenharmony_ci * 149562306a36Sopenharmony_ci * This routine can run only in process context. 149662306a36Sopenharmony_ci * 149762306a36Sopenharmony_ci * Return: 0 on success. 149862306a36Sopenharmony_ci */ 149962306a36Sopenharmony_cistatic int usb_resume_both(struct usb_device *udev, pm_message_t msg) 150062306a36Sopenharmony_ci{ 150162306a36Sopenharmony_ci int status = 0; 150262306a36Sopenharmony_ci int i; 150362306a36Sopenharmony_ci struct usb_interface *intf; 150462306a36Sopenharmony_ci 150562306a36Sopenharmony_ci if (udev->state == USB_STATE_NOTATTACHED) { 150662306a36Sopenharmony_ci status = -ENODEV; 150762306a36Sopenharmony_ci goto done; 150862306a36Sopenharmony_ci } 150962306a36Sopenharmony_ci udev->can_submit = 1; 151062306a36Sopenharmony_ci 151162306a36Sopenharmony_ci /* Resume the device */ 151262306a36Sopenharmony_ci if (udev->state == USB_STATE_SUSPENDED || udev->reset_resume) 151362306a36Sopenharmony_ci status = usb_resume_device(udev, msg); 151462306a36Sopenharmony_ci 151562306a36Sopenharmony_ci /* Resume the interfaces */ 151662306a36Sopenharmony_ci if (status == 0 && udev->actconfig) { 151762306a36Sopenharmony_ci for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { 151862306a36Sopenharmony_ci intf = udev->actconfig->interface[i]; 151962306a36Sopenharmony_ci usb_resume_interface(udev, intf, msg, 152062306a36Sopenharmony_ci udev->reset_resume); 152162306a36Sopenharmony_ci } 152262306a36Sopenharmony_ci } 152362306a36Sopenharmony_ci usb_mark_last_busy(udev); 152462306a36Sopenharmony_ci 152562306a36Sopenharmony_ci done: 152662306a36Sopenharmony_ci dev_vdbg(&udev->dev, "%s: status %d\n", __func__, status); 152762306a36Sopenharmony_ci if (!status) 152862306a36Sopenharmony_ci udev->reset_resume = 0; 152962306a36Sopenharmony_ci return status; 153062306a36Sopenharmony_ci} 153162306a36Sopenharmony_ci 153262306a36Sopenharmony_cistatic void choose_wakeup(struct usb_device *udev, pm_message_t msg) 153362306a36Sopenharmony_ci{ 153462306a36Sopenharmony_ci int w; 153562306a36Sopenharmony_ci 153662306a36Sopenharmony_ci /* 153762306a36Sopenharmony_ci * For FREEZE/QUIESCE, disable remote wakeups so no interrupts get 153862306a36Sopenharmony_ci * generated. 153962306a36Sopenharmony_ci */ 154062306a36Sopenharmony_ci if (msg.event == PM_EVENT_FREEZE || msg.event == PM_EVENT_QUIESCE) { 154162306a36Sopenharmony_ci w = 0; 154262306a36Sopenharmony_ci 154362306a36Sopenharmony_ci } else { 154462306a36Sopenharmony_ci /* 154562306a36Sopenharmony_ci * Enable remote wakeup if it is allowed, even if no interface 154662306a36Sopenharmony_ci * drivers actually want it. 154762306a36Sopenharmony_ci */ 154862306a36Sopenharmony_ci w = device_may_wakeup(&udev->dev); 154962306a36Sopenharmony_ci } 155062306a36Sopenharmony_ci 155162306a36Sopenharmony_ci /* 155262306a36Sopenharmony_ci * If the device is autosuspended with the wrong wakeup setting, 155362306a36Sopenharmony_ci * autoresume now so the setting can be changed. 155462306a36Sopenharmony_ci */ 155562306a36Sopenharmony_ci if (udev->state == USB_STATE_SUSPENDED && w != udev->do_remote_wakeup) 155662306a36Sopenharmony_ci pm_runtime_resume(&udev->dev); 155762306a36Sopenharmony_ci udev->do_remote_wakeup = w; 155862306a36Sopenharmony_ci} 155962306a36Sopenharmony_ci 156062306a36Sopenharmony_ci/* The device lock is held by the PM core */ 156162306a36Sopenharmony_ciint usb_suspend(struct device *dev, pm_message_t msg) 156262306a36Sopenharmony_ci{ 156362306a36Sopenharmony_ci struct usb_device *udev = to_usb_device(dev); 156462306a36Sopenharmony_ci int r; 156562306a36Sopenharmony_ci 156662306a36Sopenharmony_ci unbind_no_pm_drivers_interfaces(udev); 156762306a36Sopenharmony_ci 156862306a36Sopenharmony_ci /* From now on we are sure all drivers support suspend/resume 156962306a36Sopenharmony_ci * but not necessarily reset_resume() 157062306a36Sopenharmony_ci * so we may still need to unbind and rebind upon resume 157162306a36Sopenharmony_ci */ 157262306a36Sopenharmony_ci choose_wakeup(udev, msg); 157362306a36Sopenharmony_ci r = usb_suspend_both(udev, msg); 157462306a36Sopenharmony_ci if (r) 157562306a36Sopenharmony_ci return r; 157662306a36Sopenharmony_ci 157762306a36Sopenharmony_ci if (udev->quirks & USB_QUIRK_DISCONNECT_SUSPEND) 157862306a36Sopenharmony_ci usb_port_disable(udev); 157962306a36Sopenharmony_ci 158062306a36Sopenharmony_ci return 0; 158162306a36Sopenharmony_ci} 158262306a36Sopenharmony_ci 158362306a36Sopenharmony_ci/* The device lock is held by the PM core */ 158462306a36Sopenharmony_ciint usb_resume_complete(struct device *dev) 158562306a36Sopenharmony_ci{ 158662306a36Sopenharmony_ci struct usb_device *udev = to_usb_device(dev); 158762306a36Sopenharmony_ci 158862306a36Sopenharmony_ci /* For PM complete calls, all we do is rebind interfaces 158962306a36Sopenharmony_ci * whose needs_binding flag is set 159062306a36Sopenharmony_ci */ 159162306a36Sopenharmony_ci if (udev->state != USB_STATE_NOTATTACHED) 159262306a36Sopenharmony_ci rebind_marked_interfaces(udev); 159362306a36Sopenharmony_ci return 0; 159462306a36Sopenharmony_ci} 159562306a36Sopenharmony_ci 159662306a36Sopenharmony_ci/* The device lock is held by the PM core */ 159762306a36Sopenharmony_ciint usb_resume(struct device *dev, pm_message_t msg) 159862306a36Sopenharmony_ci{ 159962306a36Sopenharmony_ci struct usb_device *udev = to_usb_device(dev); 160062306a36Sopenharmony_ci int status; 160162306a36Sopenharmony_ci 160262306a36Sopenharmony_ci /* For all calls, take the device back to full power and 160362306a36Sopenharmony_ci * tell the PM core in case it was autosuspended previously. 160462306a36Sopenharmony_ci * Unbind the interfaces that will need rebinding later, 160562306a36Sopenharmony_ci * because they fail to support reset_resume. 160662306a36Sopenharmony_ci * (This can't be done in usb_resume_interface() 160762306a36Sopenharmony_ci * above because it doesn't own the right set of locks.) 160862306a36Sopenharmony_ci */ 160962306a36Sopenharmony_ci status = usb_resume_both(udev, msg); 161062306a36Sopenharmony_ci if (status == 0) { 161162306a36Sopenharmony_ci pm_runtime_disable(dev); 161262306a36Sopenharmony_ci pm_runtime_set_active(dev); 161362306a36Sopenharmony_ci pm_runtime_enable(dev); 161462306a36Sopenharmony_ci unbind_marked_interfaces(udev); 161562306a36Sopenharmony_ci } 161662306a36Sopenharmony_ci 161762306a36Sopenharmony_ci /* Avoid PM error messages for devices disconnected while suspended 161862306a36Sopenharmony_ci * as we'll display regular disconnect messages just a bit later. 161962306a36Sopenharmony_ci */ 162062306a36Sopenharmony_ci if (status == -ENODEV || status == -ESHUTDOWN) 162162306a36Sopenharmony_ci status = 0; 162262306a36Sopenharmony_ci return status; 162362306a36Sopenharmony_ci} 162462306a36Sopenharmony_ci 162562306a36Sopenharmony_ci/** 162662306a36Sopenharmony_ci * usb_enable_autosuspend - allow a USB device to be autosuspended 162762306a36Sopenharmony_ci * @udev: the USB device which may be autosuspended 162862306a36Sopenharmony_ci * 162962306a36Sopenharmony_ci * This routine allows @udev to be autosuspended. An autosuspend won't 163062306a36Sopenharmony_ci * take place until the autosuspend_delay has elapsed and all the other 163162306a36Sopenharmony_ci * necessary conditions are satisfied. 163262306a36Sopenharmony_ci * 163362306a36Sopenharmony_ci * The caller must hold @udev's device lock. 163462306a36Sopenharmony_ci */ 163562306a36Sopenharmony_civoid usb_enable_autosuspend(struct usb_device *udev) 163662306a36Sopenharmony_ci{ 163762306a36Sopenharmony_ci pm_runtime_allow(&udev->dev); 163862306a36Sopenharmony_ci} 163962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_enable_autosuspend); 164062306a36Sopenharmony_ci 164162306a36Sopenharmony_ci/** 164262306a36Sopenharmony_ci * usb_disable_autosuspend - prevent a USB device from being autosuspended 164362306a36Sopenharmony_ci * @udev: the USB device which may not be autosuspended 164462306a36Sopenharmony_ci * 164562306a36Sopenharmony_ci * This routine prevents @udev from being autosuspended and wakes it up 164662306a36Sopenharmony_ci * if it is already autosuspended. 164762306a36Sopenharmony_ci * 164862306a36Sopenharmony_ci * The caller must hold @udev's device lock. 164962306a36Sopenharmony_ci */ 165062306a36Sopenharmony_civoid usb_disable_autosuspend(struct usb_device *udev) 165162306a36Sopenharmony_ci{ 165262306a36Sopenharmony_ci pm_runtime_forbid(&udev->dev); 165362306a36Sopenharmony_ci} 165462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_disable_autosuspend); 165562306a36Sopenharmony_ci 165662306a36Sopenharmony_ci/** 165762306a36Sopenharmony_ci * usb_autosuspend_device - delayed autosuspend of a USB device and its interfaces 165862306a36Sopenharmony_ci * @udev: the usb_device to autosuspend 165962306a36Sopenharmony_ci * 166062306a36Sopenharmony_ci * This routine should be called when a core subsystem is finished using 166162306a36Sopenharmony_ci * @udev and wants to allow it to autosuspend. Examples would be when 166262306a36Sopenharmony_ci * @udev's device file in usbfs is closed or after a configuration change. 166362306a36Sopenharmony_ci * 166462306a36Sopenharmony_ci * @udev's usage counter is decremented; if it drops to 0 and all the 166562306a36Sopenharmony_ci * interfaces are inactive then a delayed autosuspend will be attempted. 166662306a36Sopenharmony_ci * The attempt may fail (see autosuspend_check()). 166762306a36Sopenharmony_ci * 166862306a36Sopenharmony_ci * The caller must hold @udev's device lock. 166962306a36Sopenharmony_ci * 167062306a36Sopenharmony_ci * This routine can run only in process context. 167162306a36Sopenharmony_ci */ 167262306a36Sopenharmony_civoid usb_autosuspend_device(struct usb_device *udev) 167362306a36Sopenharmony_ci{ 167462306a36Sopenharmony_ci int status; 167562306a36Sopenharmony_ci 167662306a36Sopenharmony_ci usb_mark_last_busy(udev); 167762306a36Sopenharmony_ci status = pm_runtime_put_sync_autosuspend(&udev->dev); 167862306a36Sopenharmony_ci dev_vdbg(&udev->dev, "%s: cnt %d -> %d\n", 167962306a36Sopenharmony_ci __func__, atomic_read(&udev->dev.power.usage_count), 168062306a36Sopenharmony_ci status); 168162306a36Sopenharmony_ci} 168262306a36Sopenharmony_ci 168362306a36Sopenharmony_ci/** 168462306a36Sopenharmony_ci * usb_autoresume_device - immediately autoresume a USB device and its interfaces 168562306a36Sopenharmony_ci * @udev: the usb_device to autoresume 168662306a36Sopenharmony_ci * 168762306a36Sopenharmony_ci * This routine should be called when a core subsystem wants to use @udev 168862306a36Sopenharmony_ci * and needs to guarantee that it is not suspended. No autosuspend will 168962306a36Sopenharmony_ci * occur until usb_autosuspend_device() is called. (Note that this will 169062306a36Sopenharmony_ci * not prevent suspend events originating in the PM core.) Examples would 169162306a36Sopenharmony_ci * be when @udev's device file in usbfs is opened or when a remote-wakeup 169262306a36Sopenharmony_ci * request is received. 169362306a36Sopenharmony_ci * 169462306a36Sopenharmony_ci * @udev's usage counter is incremented to prevent subsequent autosuspends. 169562306a36Sopenharmony_ci * However if the autoresume fails then the usage counter is re-decremented. 169662306a36Sopenharmony_ci * 169762306a36Sopenharmony_ci * The caller must hold @udev's device lock. 169862306a36Sopenharmony_ci * 169962306a36Sopenharmony_ci * This routine can run only in process context. 170062306a36Sopenharmony_ci * 170162306a36Sopenharmony_ci * Return: 0 on success. A negative error code otherwise. 170262306a36Sopenharmony_ci */ 170362306a36Sopenharmony_ciint usb_autoresume_device(struct usb_device *udev) 170462306a36Sopenharmony_ci{ 170562306a36Sopenharmony_ci int status; 170662306a36Sopenharmony_ci 170762306a36Sopenharmony_ci status = pm_runtime_get_sync(&udev->dev); 170862306a36Sopenharmony_ci if (status < 0) 170962306a36Sopenharmony_ci pm_runtime_put_sync(&udev->dev); 171062306a36Sopenharmony_ci dev_vdbg(&udev->dev, "%s: cnt %d -> %d\n", 171162306a36Sopenharmony_ci __func__, atomic_read(&udev->dev.power.usage_count), 171262306a36Sopenharmony_ci status); 171362306a36Sopenharmony_ci if (status > 0) 171462306a36Sopenharmony_ci status = 0; 171562306a36Sopenharmony_ci return status; 171662306a36Sopenharmony_ci} 171762306a36Sopenharmony_ci 171862306a36Sopenharmony_ci/** 171962306a36Sopenharmony_ci * usb_autopm_put_interface - decrement a USB interface's PM-usage counter 172062306a36Sopenharmony_ci * @intf: the usb_interface whose counter should be decremented 172162306a36Sopenharmony_ci * 172262306a36Sopenharmony_ci * This routine should be called by an interface driver when it is 172362306a36Sopenharmony_ci * finished using @intf and wants to allow it to autosuspend. A typical 172462306a36Sopenharmony_ci * example would be a character-device driver when its device file is 172562306a36Sopenharmony_ci * closed. 172662306a36Sopenharmony_ci * 172762306a36Sopenharmony_ci * The routine decrements @intf's usage counter. When the counter reaches 172862306a36Sopenharmony_ci * 0, a delayed autosuspend request for @intf's device is attempted. The 172962306a36Sopenharmony_ci * attempt may fail (see autosuspend_check()). 173062306a36Sopenharmony_ci * 173162306a36Sopenharmony_ci * This routine can run only in process context. 173262306a36Sopenharmony_ci */ 173362306a36Sopenharmony_civoid usb_autopm_put_interface(struct usb_interface *intf) 173462306a36Sopenharmony_ci{ 173562306a36Sopenharmony_ci struct usb_device *udev = interface_to_usbdev(intf); 173662306a36Sopenharmony_ci int status; 173762306a36Sopenharmony_ci 173862306a36Sopenharmony_ci usb_mark_last_busy(udev); 173962306a36Sopenharmony_ci status = pm_runtime_put_sync(&intf->dev); 174062306a36Sopenharmony_ci dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", 174162306a36Sopenharmony_ci __func__, atomic_read(&intf->dev.power.usage_count), 174262306a36Sopenharmony_ci status); 174362306a36Sopenharmony_ci} 174462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_autopm_put_interface); 174562306a36Sopenharmony_ci 174662306a36Sopenharmony_ci/** 174762306a36Sopenharmony_ci * usb_autopm_put_interface_async - decrement a USB interface's PM-usage counter 174862306a36Sopenharmony_ci * @intf: the usb_interface whose counter should be decremented 174962306a36Sopenharmony_ci * 175062306a36Sopenharmony_ci * This routine does much the same thing as usb_autopm_put_interface(): 175162306a36Sopenharmony_ci * It decrements @intf's usage counter and schedules a delayed 175262306a36Sopenharmony_ci * autosuspend request if the counter is <= 0. The difference is that it 175362306a36Sopenharmony_ci * does not perform any synchronization; callers should hold a private 175462306a36Sopenharmony_ci * lock and handle all synchronization issues themselves. 175562306a36Sopenharmony_ci * 175662306a36Sopenharmony_ci * Typically a driver would call this routine during an URB's completion 175762306a36Sopenharmony_ci * handler, if no more URBs were pending. 175862306a36Sopenharmony_ci * 175962306a36Sopenharmony_ci * This routine can run in atomic context. 176062306a36Sopenharmony_ci */ 176162306a36Sopenharmony_civoid usb_autopm_put_interface_async(struct usb_interface *intf) 176262306a36Sopenharmony_ci{ 176362306a36Sopenharmony_ci struct usb_device *udev = interface_to_usbdev(intf); 176462306a36Sopenharmony_ci int status; 176562306a36Sopenharmony_ci 176662306a36Sopenharmony_ci usb_mark_last_busy(udev); 176762306a36Sopenharmony_ci status = pm_runtime_put(&intf->dev); 176862306a36Sopenharmony_ci dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", 176962306a36Sopenharmony_ci __func__, atomic_read(&intf->dev.power.usage_count), 177062306a36Sopenharmony_ci status); 177162306a36Sopenharmony_ci} 177262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_autopm_put_interface_async); 177362306a36Sopenharmony_ci 177462306a36Sopenharmony_ci/** 177562306a36Sopenharmony_ci * usb_autopm_put_interface_no_suspend - decrement a USB interface's PM-usage counter 177662306a36Sopenharmony_ci * @intf: the usb_interface whose counter should be decremented 177762306a36Sopenharmony_ci * 177862306a36Sopenharmony_ci * This routine decrements @intf's usage counter but does not carry out an 177962306a36Sopenharmony_ci * autosuspend. 178062306a36Sopenharmony_ci * 178162306a36Sopenharmony_ci * This routine can run in atomic context. 178262306a36Sopenharmony_ci */ 178362306a36Sopenharmony_civoid usb_autopm_put_interface_no_suspend(struct usb_interface *intf) 178462306a36Sopenharmony_ci{ 178562306a36Sopenharmony_ci struct usb_device *udev = interface_to_usbdev(intf); 178662306a36Sopenharmony_ci 178762306a36Sopenharmony_ci usb_mark_last_busy(udev); 178862306a36Sopenharmony_ci pm_runtime_put_noidle(&intf->dev); 178962306a36Sopenharmony_ci} 179062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_autopm_put_interface_no_suspend); 179162306a36Sopenharmony_ci 179262306a36Sopenharmony_ci/** 179362306a36Sopenharmony_ci * usb_autopm_get_interface - increment a USB interface's PM-usage counter 179462306a36Sopenharmony_ci * @intf: the usb_interface whose counter should be incremented 179562306a36Sopenharmony_ci * 179662306a36Sopenharmony_ci * This routine should be called by an interface driver when it wants to 179762306a36Sopenharmony_ci * use @intf and needs to guarantee that it is not suspended. In addition, 179862306a36Sopenharmony_ci * the routine prevents @intf from being autosuspended subsequently. (Note 179962306a36Sopenharmony_ci * that this will not prevent suspend events originating in the PM core.) 180062306a36Sopenharmony_ci * This prevention will persist until usb_autopm_put_interface() is called 180162306a36Sopenharmony_ci * or @intf is unbound. A typical example would be a character-device 180262306a36Sopenharmony_ci * driver when its device file is opened. 180362306a36Sopenharmony_ci * 180462306a36Sopenharmony_ci * @intf's usage counter is incremented to prevent subsequent autosuspends. 180562306a36Sopenharmony_ci * However if the autoresume fails then the counter is re-decremented. 180662306a36Sopenharmony_ci * 180762306a36Sopenharmony_ci * This routine can run only in process context. 180862306a36Sopenharmony_ci * 180962306a36Sopenharmony_ci * Return: 0 on success. 181062306a36Sopenharmony_ci */ 181162306a36Sopenharmony_ciint usb_autopm_get_interface(struct usb_interface *intf) 181262306a36Sopenharmony_ci{ 181362306a36Sopenharmony_ci int status; 181462306a36Sopenharmony_ci 181562306a36Sopenharmony_ci status = pm_runtime_get_sync(&intf->dev); 181662306a36Sopenharmony_ci if (status < 0) 181762306a36Sopenharmony_ci pm_runtime_put_sync(&intf->dev); 181862306a36Sopenharmony_ci dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", 181962306a36Sopenharmony_ci __func__, atomic_read(&intf->dev.power.usage_count), 182062306a36Sopenharmony_ci status); 182162306a36Sopenharmony_ci if (status > 0) 182262306a36Sopenharmony_ci status = 0; 182362306a36Sopenharmony_ci return status; 182462306a36Sopenharmony_ci} 182562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_autopm_get_interface); 182662306a36Sopenharmony_ci 182762306a36Sopenharmony_ci/** 182862306a36Sopenharmony_ci * usb_autopm_get_interface_async - increment a USB interface's PM-usage counter 182962306a36Sopenharmony_ci * @intf: the usb_interface whose counter should be incremented 183062306a36Sopenharmony_ci * 183162306a36Sopenharmony_ci * This routine does much the same thing as 183262306a36Sopenharmony_ci * usb_autopm_get_interface(): It increments @intf's usage counter and 183362306a36Sopenharmony_ci * queues an autoresume request if the device is suspended. The 183462306a36Sopenharmony_ci * differences are that it does not perform any synchronization (callers 183562306a36Sopenharmony_ci * should hold a private lock and handle all synchronization issues 183662306a36Sopenharmony_ci * themselves), and it does not autoresume the device directly (it only 183762306a36Sopenharmony_ci * queues a request). After a successful call, the device may not yet be 183862306a36Sopenharmony_ci * resumed. 183962306a36Sopenharmony_ci * 184062306a36Sopenharmony_ci * This routine can run in atomic context. 184162306a36Sopenharmony_ci * 184262306a36Sopenharmony_ci * Return: 0 on success. A negative error code otherwise. 184362306a36Sopenharmony_ci */ 184462306a36Sopenharmony_ciint usb_autopm_get_interface_async(struct usb_interface *intf) 184562306a36Sopenharmony_ci{ 184662306a36Sopenharmony_ci int status; 184762306a36Sopenharmony_ci 184862306a36Sopenharmony_ci status = pm_runtime_get(&intf->dev); 184962306a36Sopenharmony_ci if (status < 0 && status != -EINPROGRESS) 185062306a36Sopenharmony_ci pm_runtime_put_noidle(&intf->dev); 185162306a36Sopenharmony_ci dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", 185262306a36Sopenharmony_ci __func__, atomic_read(&intf->dev.power.usage_count), 185362306a36Sopenharmony_ci status); 185462306a36Sopenharmony_ci if (status > 0 || status == -EINPROGRESS) 185562306a36Sopenharmony_ci status = 0; 185662306a36Sopenharmony_ci return status; 185762306a36Sopenharmony_ci} 185862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_autopm_get_interface_async); 185962306a36Sopenharmony_ci 186062306a36Sopenharmony_ci/** 186162306a36Sopenharmony_ci * usb_autopm_get_interface_no_resume - increment a USB interface's PM-usage counter 186262306a36Sopenharmony_ci * @intf: the usb_interface whose counter should be incremented 186362306a36Sopenharmony_ci * 186462306a36Sopenharmony_ci * This routine increments @intf's usage counter but does not carry out an 186562306a36Sopenharmony_ci * autoresume. 186662306a36Sopenharmony_ci * 186762306a36Sopenharmony_ci * This routine can run in atomic context. 186862306a36Sopenharmony_ci */ 186962306a36Sopenharmony_civoid usb_autopm_get_interface_no_resume(struct usb_interface *intf) 187062306a36Sopenharmony_ci{ 187162306a36Sopenharmony_ci struct usb_device *udev = interface_to_usbdev(intf); 187262306a36Sopenharmony_ci 187362306a36Sopenharmony_ci usb_mark_last_busy(udev); 187462306a36Sopenharmony_ci pm_runtime_get_noresume(&intf->dev); 187562306a36Sopenharmony_ci} 187662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(usb_autopm_get_interface_no_resume); 187762306a36Sopenharmony_ci 187862306a36Sopenharmony_ci/* Internal routine to check whether we may autosuspend a device. */ 187962306a36Sopenharmony_cistatic int autosuspend_check(struct usb_device *udev) 188062306a36Sopenharmony_ci{ 188162306a36Sopenharmony_ci int w, i; 188262306a36Sopenharmony_ci struct usb_interface *intf; 188362306a36Sopenharmony_ci 188462306a36Sopenharmony_ci if (udev->state == USB_STATE_NOTATTACHED) 188562306a36Sopenharmony_ci return -ENODEV; 188662306a36Sopenharmony_ci 188762306a36Sopenharmony_ci /* Fail if autosuspend is disabled, or any interfaces are in use, or 188862306a36Sopenharmony_ci * any interface drivers require remote wakeup but it isn't available. 188962306a36Sopenharmony_ci */ 189062306a36Sopenharmony_ci w = 0; 189162306a36Sopenharmony_ci if (udev->actconfig) { 189262306a36Sopenharmony_ci for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { 189362306a36Sopenharmony_ci intf = udev->actconfig->interface[i]; 189462306a36Sopenharmony_ci 189562306a36Sopenharmony_ci /* We don't need to check interfaces that are 189662306a36Sopenharmony_ci * disabled for runtime PM. Either they are unbound 189762306a36Sopenharmony_ci * or else their drivers don't support autosuspend 189862306a36Sopenharmony_ci * and so they are permanently active. 189962306a36Sopenharmony_ci */ 190062306a36Sopenharmony_ci if (intf->dev.power.disable_depth) 190162306a36Sopenharmony_ci continue; 190262306a36Sopenharmony_ci if (atomic_read(&intf->dev.power.usage_count) > 0) 190362306a36Sopenharmony_ci return -EBUSY; 190462306a36Sopenharmony_ci w |= intf->needs_remote_wakeup; 190562306a36Sopenharmony_ci 190662306a36Sopenharmony_ci /* Don't allow autosuspend if the device will need 190762306a36Sopenharmony_ci * a reset-resume and any of its interface drivers 190862306a36Sopenharmony_ci * doesn't include support or needs remote wakeup. 190962306a36Sopenharmony_ci */ 191062306a36Sopenharmony_ci if (udev->quirks & USB_QUIRK_RESET_RESUME) { 191162306a36Sopenharmony_ci struct usb_driver *driver; 191262306a36Sopenharmony_ci 191362306a36Sopenharmony_ci driver = to_usb_driver(intf->dev.driver); 191462306a36Sopenharmony_ci if (!driver->reset_resume || 191562306a36Sopenharmony_ci intf->needs_remote_wakeup) 191662306a36Sopenharmony_ci return -EOPNOTSUPP; 191762306a36Sopenharmony_ci } 191862306a36Sopenharmony_ci } 191962306a36Sopenharmony_ci } 192062306a36Sopenharmony_ci if (w && !device_can_wakeup(&udev->dev)) { 192162306a36Sopenharmony_ci dev_dbg(&udev->dev, "remote wakeup needed for autosuspend\n"); 192262306a36Sopenharmony_ci return -EOPNOTSUPP; 192362306a36Sopenharmony_ci } 192462306a36Sopenharmony_ci 192562306a36Sopenharmony_ci /* 192662306a36Sopenharmony_ci * If the device is a direct child of the root hub and the HCD 192762306a36Sopenharmony_ci * doesn't handle wakeup requests, don't allow autosuspend when 192862306a36Sopenharmony_ci * wakeup is needed. 192962306a36Sopenharmony_ci */ 193062306a36Sopenharmony_ci if (w && udev->parent == udev->bus->root_hub && 193162306a36Sopenharmony_ci bus_to_hcd(udev->bus)->cant_recv_wakeups) { 193262306a36Sopenharmony_ci dev_dbg(&udev->dev, "HCD doesn't handle wakeup requests\n"); 193362306a36Sopenharmony_ci return -EOPNOTSUPP; 193462306a36Sopenharmony_ci } 193562306a36Sopenharmony_ci 193662306a36Sopenharmony_ci udev->do_remote_wakeup = w; 193762306a36Sopenharmony_ci return 0; 193862306a36Sopenharmony_ci} 193962306a36Sopenharmony_ci 194062306a36Sopenharmony_ciint usb_runtime_suspend(struct device *dev) 194162306a36Sopenharmony_ci{ 194262306a36Sopenharmony_ci struct usb_device *udev = to_usb_device(dev); 194362306a36Sopenharmony_ci int status; 194462306a36Sopenharmony_ci 194562306a36Sopenharmony_ci /* A USB device can be suspended if it passes the various autosuspend 194662306a36Sopenharmony_ci * checks. Runtime suspend for a USB device means suspending all the 194762306a36Sopenharmony_ci * interfaces and then the device itself. 194862306a36Sopenharmony_ci */ 194962306a36Sopenharmony_ci if (autosuspend_check(udev) != 0) 195062306a36Sopenharmony_ci return -EAGAIN; 195162306a36Sopenharmony_ci 195262306a36Sopenharmony_ci status = usb_suspend_both(udev, PMSG_AUTO_SUSPEND); 195362306a36Sopenharmony_ci 195462306a36Sopenharmony_ci /* Allow a retry if autosuspend failed temporarily */ 195562306a36Sopenharmony_ci if (status == -EAGAIN || status == -EBUSY) 195662306a36Sopenharmony_ci usb_mark_last_busy(udev); 195762306a36Sopenharmony_ci 195862306a36Sopenharmony_ci /* 195962306a36Sopenharmony_ci * The PM core reacts badly unless the return code is 0, 196062306a36Sopenharmony_ci * -EAGAIN, or -EBUSY, so always return -EBUSY on an error 196162306a36Sopenharmony_ci * (except for root hubs, because they don't suspend through 196262306a36Sopenharmony_ci * an upstream port like other USB devices). 196362306a36Sopenharmony_ci */ 196462306a36Sopenharmony_ci if (status != 0 && udev->parent) 196562306a36Sopenharmony_ci return -EBUSY; 196662306a36Sopenharmony_ci return status; 196762306a36Sopenharmony_ci} 196862306a36Sopenharmony_ci 196962306a36Sopenharmony_ciint usb_runtime_resume(struct device *dev) 197062306a36Sopenharmony_ci{ 197162306a36Sopenharmony_ci struct usb_device *udev = to_usb_device(dev); 197262306a36Sopenharmony_ci int status; 197362306a36Sopenharmony_ci 197462306a36Sopenharmony_ci /* Runtime resume for a USB device means resuming both the device 197562306a36Sopenharmony_ci * and all its interfaces. 197662306a36Sopenharmony_ci */ 197762306a36Sopenharmony_ci status = usb_resume_both(udev, PMSG_AUTO_RESUME); 197862306a36Sopenharmony_ci return status; 197962306a36Sopenharmony_ci} 198062306a36Sopenharmony_ci 198162306a36Sopenharmony_ciint usb_runtime_idle(struct device *dev) 198262306a36Sopenharmony_ci{ 198362306a36Sopenharmony_ci struct usb_device *udev = to_usb_device(dev); 198462306a36Sopenharmony_ci 198562306a36Sopenharmony_ci /* An idle USB device can be suspended if it passes the various 198662306a36Sopenharmony_ci * autosuspend checks. 198762306a36Sopenharmony_ci */ 198862306a36Sopenharmony_ci if (autosuspend_check(udev) == 0) 198962306a36Sopenharmony_ci pm_runtime_autosuspend(dev); 199062306a36Sopenharmony_ci /* Tell the core not to suspend it, though. */ 199162306a36Sopenharmony_ci return -EBUSY; 199262306a36Sopenharmony_ci} 199362306a36Sopenharmony_ci 199462306a36Sopenharmony_cistatic int usb_set_usb2_hardware_lpm(struct usb_device *udev, int enable) 199562306a36Sopenharmony_ci{ 199662306a36Sopenharmony_ci struct usb_hcd *hcd = bus_to_hcd(udev->bus); 199762306a36Sopenharmony_ci int ret = -EPERM; 199862306a36Sopenharmony_ci 199962306a36Sopenharmony_ci if (hcd->driver->set_usb2_hw_lpm) { 200062306a36Sopenharmony_ci ret = hcd->driver->set_usb2_hw_lpm(hcd, udev, enable); 200162306a36Sopenharmony_ci if (!ret) 200262306a36Sopenharmony_ci udev->usb2_hw_lpm_enabled = enable; 200362306a36Sopenharmony_ci } 200462306a36Sopenharmony_ci 200562306a36Sopenharmony_ci return ret; 200662306a36Sopenharmony_ci} 200762306a36Sopenharmony_ci 200862306a36Sopenharmony_ciint usb_enable_usb2_hardware_lpm(struct usb_device *udev) 200962306a36Sopenharmony_ci{ 201062306a36Sopenharmony_ci if (!udev->usb2_hw_lpm_capable || 201162306a36Sopenharmony_ci !udev->usb2_hw_lpm_allowed || 201262306a36Sopenharmony_ci udev->usb2_hw_lpm_enabled) 201362306a36Sopenharmony_ci return 0; 201462306a36Sopenharmony_ci 201562306a36Sopenharmony_ci return usb_set_usb2_hardware_lpm(udev, 1); 201662306a36Sopenharmony_ci} 201762306a36Sopenharmony_ci 201862306a36Sopenharmony_ciint usb_disable_usb2_hardware_lpm(struct usb_device *udev) 201962306a36Sopenharmony_ci{ 202062306a36Sopenharmony_ci if (!udev->usb2_hw_lpm_enabled) 202162306a36Sopenharmony_ci return 0; 202262306a36Sopenharmony_ci 202362306a36Sopenharmony_ci return usb_set_usb2_hardware_lpm(udev, 0); 202462306a36Sopenharmony_ci} 202562306a36Sopenharmony_ci 202662306a36Sopenharmony_ci#endif /* CONFIG_PM */ 202762306a36Sopenharmony_ci 202862306a36Sopenharmony_ciconst struct bus_type usb_bus_type = { 202962306a36Sopenharmony_ci .name = "usb", 203062306a36Sopenharmony_ci .match = usb_device_match, 203162306a36Sopenharmony_ci .uevent = usb_uevent, 203262306a36Sopenharmony_ci .need_parent_lock = true, 203362306a36Sopenharmony_ci}; 2034