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