diff options
Diffstat (limited to 'drivers/usb/core')
| -rw-r--r-- | drivers/usb/core/hub.c | 8 | ||||
| -rw-r--r-- | drivers/usb/core/port.c | 10 | ||||
| -rw-r--r-- | drivers/usb/core/quirks.c | 3 | 
3 files changed, 17 insertions, 4 deletions
| diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 1d212f82c69b..54cd8ef795ec 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -988,13 +988,17 @@ int usb_remove_device(struct usb_device *udev)  {  	struct usb_hub *hub;  	struct usb_interface *intf; +	int ret;  	if (!udev->parent)	/* Can't remove a root hub */  		return -EINVAL;  	hub = usb_hub_to_struct_hub(udev->parent);  	intf = to_usb_interface(hub->intfdev); -	usb_autopm_get_interface(intf); +	ret = usb_autopm_get_interface(intf); +	if (ret < 0) +		return ret; +  	set_bit(udev->portnum, hub->removed_bits);  	hub_port_logical_disconnect(hub, udev->portnum);  	usb_autopm_put_interface(intf); @@ -1866,7 +1870,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)  	if (id->driver_info & HUB_QUIRK_DISABLE_AUTOSUSPEND) {  		hub->quirk_disable_autosuspend = 1; -		usb_autopm_get_interface(intf); +		usb_autopm_get_interface_no_resume(intf);  	}  	if (hub_configure(hub, &desc->endpoint[0].desc) >= 0) diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c index bbbb35fa639f..235a7c645503 100644 --- a/drivers/usb/core/port.c +++ b/drivers/usb/core/port.c @@ -213,7 +213,10 @@ static int usb_port_runtime_resume(struct device *dev)  	if (!port_dev->is_superspeed && peer)  		pm_runtime_get_sync(&peer->dev); -	usb_autopm_get_interface(intf); +	retval = usb_autopm_get_interface(intf); +	if (retval < 0) +		return retval; +  	retval = usb_hub_set_port_power(hdev, hub, port1, true);  	msleep(hub_power_on_good_delay(hub));  	if (udev && !retval) { @@ -266,7 +269,10 @@ static int usb_port_runtime_suspend(struct device *dev)  	if (usb_port_block_power_off)  		return -EBUSY; -	usb_autopm_get_interface(intf); +	retval = usb_autopm_get_interface(intf); +	if (retval < 0) +		return retval; +  	retval = usb_hub_set_port_power(hdev, hub, port1, false);  	usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_C_CONNECTION);  	if (!port_dev->is_superspeed) diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 2b24336a72e5..2dac3e7cdd97 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c @@ -231,6 +231,9 @@ static const struct usb_device_id usb_quirk_list[] = {  	/* Logitech PTZ Pro Camera */  	{ USB_DEVICE(0x046d, 0x0853), .driver_info = USB_QUIRK_DELAY_INIT }, +	/* Logitech Screen Share */ +	{ USB_DEVICE(0x046d, 0x086c), .driver_info = USB_QUIRK_NO_LPM }, +  	/* Logitech Quickcam Fusion */  	{ USB_DEVICE(0x046d, 0x08c1), .driver_info = USB_QUIRK_RESET_RESUME }, |