Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1633385imu; Wed, 23 Jan 2019 22:19:33 -0800 (PST) X-Google-Smtp-Source: ALg8bN4dVeOKYl0NCHDl5r/Z0WMfWjVdDJM6gnX6FOSheGadSXDOUgat+W0ONuuqBWeocKBmh8ov X-Received: by 2002:a63:658:: with SMTP id 85mr4762042pgg.373.1548310773735; Wed, 23 Jan 2019 22:19:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548310773; cv=none; d=google.com; s=arc-20160816; b=P01VPpugaplOHWXchBCzhfPcaw2HljzgXAD5AGXbBo0952RxNWgmNRFlbgaO2/FLvs 5i7I1ch+mEvlOVGLrrVaYmknx+xRtdunwV0Uy31p/Ky8rGqPFXT4yJISZ0WibR4Cx41F fhYBG/VM37UERjJ/STK29OvW7KyrK9B7PRpLEGqUGvZ9hfDXmJiUI8xKMNHhhv0gHLoF xD+fI6X/XytMWXLiylsfFOrqx8XHxnknpm+mJiKZv00fxrnQqL32dHS7GQe3UtTJlbhH rRNlgLeEyxHgcrdYRT/OHXuzMxRJdpVnfr5ZWNq0cqofGZrgLNvfBKSqpfhwt467B8+3 snVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=Vw2tH5UsQelWrxhWk2DYofqhJbPJ+6lrEVNoA1P4qYo=; b=Id0EJinY353J9QC24jvcbGiAgf8MkkF5dkkpeDgkMkgqUFze5nnzmMS9wnhC3TbP1b xWnInEGiB8N4WmN8O1nRW2X5ZMPEaVDnFUnrDUaRt5C82HIkbMdeQna9Vm/L0j1NoOU/ fhBs5JKmuD8afizAyuCburQzcbCWhvuC/od69AzlnmNIWk5HPLH0Jchg7//Xe6gSb/KO fSY+B9IAGfVI77oKhFIaknjSywRVQCZb+wy+aGGBsgaGW/G77zmPcVEAtYX891yqXdHX Rn+RmzUF73QZilxSeB1mifcyfgYoIDqvaHK7iJhtRyV6Ck8/L5ivnO48Gn5wqBOGRAIq jzbw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d4si20919640pls.348.2019.01.23.22.19.18; Wed, 23 Jan 2019 22:19:33 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726061AbfAXGQt (ORCPT + 99 others); Thu, 24 Jan 2019 01:16:49 -0500 Received: from youngberry.canonical.com ([91.189.89.112]:44824 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725287AbfAXGQt (ORCPT ); Thu, 24 Jan 2019 01:16:49 -0500 Received: from 61-220-137-37.hinet-ip.hinet.net ([61.220.137.37] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1gmYJj-000846-3n; Thu, 24 Jan 2019 06:16:47 +0000 From: Kai-Heng Feng To: gregkh@linuxfoundation.org Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Kai-Heng Feng Subject: [PATCH v2] USB: Disable USB2 LPM at shutdown Date: Thu, 24 Jan 2019 14:16:43 +0800 Message-Id: <20190124061643.11663-1-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The QCA Rome USB Bluetooth controller has several issues once LPM gets enabled: - Fails to get enumerated in coldboot. [1] - Drains more power (~ 0.2W) when the system is in S5. [2] - Disappears after a warmboot. [2] The issue happens because the device lingers at LPM L1 in S5, so device can't get enumerated even after a reboot. Disable LPM at shutdown to solve the issue. [1] https://bugs.launchpad.net/bugs/1757218 [2] https://patchwork.kernel.org/patch/10607097/ Signed-off-by: Kai-Heng Feng --- v2: Use new LPM helpers. drivers/usb/core/port.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c index 1a06a4b5fbb1..bbbb35fa639f 100644 --- a/drivers/usb/core/port.c +++ b/drivers/usb/core/port.c @@ -285,6 +285,14 @@ static int usb_port_runtime_suspend(struct device *dev) } #endif +static void usb_port_shutdown(struct device *dev) +{ + struct usb_port *port_dev = to_usb_port(dev); + + if (port_dev->child) + usb_disable_usb2_hardware_lpm(port_dev->child); +} + static const struct dev_pm_ops usb_port_pm_ops = { #ifdef CONFIG_PM .runtime_suspend = usb_port_runtime_suspend, @@ -301,6 +309,7 @@ struct device_type usb_port_device_type = { static struct device_driver usb_port_driver = { .name = "usb", .owner = THIS_MODULE, + .shutdown = usb_port_shutdown, }; static int link_peers(struct usb_port *left, struct usb_port *right) -- 2.17.1