| From horms@vergenet.net Tue Sep 5 10:07:53 2017 |
| From: Simon Horman <horms@verge.net.au> |
| Date: Tue, 5 Sep 2017 10:06:45 +0200 |
| Subject: [PATCH 10/13] usb: host: ehci-platform: fix usb 1.1 device is not connected in system resume |
| To: Greg KH <gregkh@linuxfoundation.org> |
| Cc: ltsi-dev@lists.linuxfoundation.org, linux-renesas-soc@vger.kernel.org, Magnus Damm <magnus.damm@gmail.com> |
| Message-ID: <1504598808-19810-11-git-send-email-horms@verge.net.au> |
| |
| |
| From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> |
| |
| This patch fixes an issue that a usb 1.1 device is not connected in |
| system resume and then the following message appeared if debug messages |
| are enabled: |
| usb 2-1: Waited 2000ms for CONNECT |
| |
| To resolve this issue, the EHCI controller must be resumed after its |
| companion controllers. So, this patch adds such code on the driver. |
| |
| Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| (cherry picked from commit d4d75128b8fd727d42c775a16b41634d09409dba) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/usb/host/ehci-platform.c | 7 +++++++ |
| 1 file changed, 7 insertions(+) |
| |
| --- a/drivers/usb/host/ehci-platform.c |
| +++ b/drivers/usb/host/ehci-platform.c |
| @@ -34,6 +34,7 @@ |
| #include <linux/usb.h> |
| #include <linux/usb/hcd.h> |
| #include <linux/usb/ehci_pdriver.h> |
| +#include <linux/usb/of.h> |
| |
| #include "ehci.h" |
| |
| @@ -297,6 +298,7 @@ static int ehci_platform_probe(struct pl |
| goto err_power; |
| |
| device_wakeup_enable(hcd->self.controller); |
| + device_enable_async_suspend(hcd->self.controller); |
| platform_set_drvdata(dev, hcd); |
| |
| return err; |
| @@ -370,6 +372,7 @@ static int ehci_platform_resume(struct d |
| struct usb_ehci_pdata *pdata = dev_get_platdata(dev); |
| struct platform_device *pdev = to_platform_device(dev); |
| struct ehci_platform_priv *priv = hcd_to_ehci_priv(hcd); |
| + struct device *companion_dev; |
| |
| if (pdata->power_on) { |
| int err = pdata->power_on(pdev); |
| @@ -377,6 +380,10 @@ static int ehci_platform_resume(struct d |
| return err; |
| } |
| |
| + companion_dev = usb_of_get_companion_dev(hcd->self.controller); |
| + if (companion_dev) |
| + device_pm_wait_for_dev(hcd->self.controller, companion_dev); |
| + |
| ehci_resume(hcd, priv->reset_on_resume); |
| return 0; |
| } |