| From 174e9a14644894909e20cf6a9ff8646563bf7513 Mon Sep 17 00:00:00 2001 |
| From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> |
| Date: Wed, 19 Apr 2017 16:55:48 +0300 |
| Subject: [PATCH 203/286] usb: host: xhci-plat: set resume_quirk() for R-Car |
| controllers |
| |
| This patch sets resume_quirk() for R-Car controllers to re-download |
| the firmware in resume timing. Otherwise, if the controller's power |
| is down in suspend timing, the firmware in the controller goes away, |
| and then the controller doesn't work after resume. |
| |
| Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> |
| Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| (cherry picked from commit 435cc1138ec94af7497ea68c8eb8b0c17cfcf002) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/usb/host/xhci-plat.c | 3 +++ |
| drivers/usb/host/xhci-rcar.c | 11 +++++++++++ |
| drivers/usb/host/xhci-rcar.h | 6 ++++++ |
| 3 files changed, 20 insertions(+) |
| |
| --- a/drivers/usb/host/xhci-plat.c |
| +++ b/drivers/usb/host/xhci-plat.c |
| @@ -102,18 +102,21 @@ static const struct xhci_plat_priv xhci_ |
| .firmware_name = XHCI_RCAR_FIRMWARE_NAME_V1, |
| .init_quirk = xhci_rcar_init_quirk, |
| .plat_start = xhci_rcar_start, |
| + .resume_quirk = xhci_rcar_resume_quirk, |
| }; |
| |
| static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen3 = { |
| .firmware_name = XHCI_RCAR_FIRMWARE_NAME_V2, |
| .init_quirk = xhci_rcar_init_quirk, |
| .plat_start = xhci_rcar_start, |
| + .resume_quirk = xhci_rcar_resume_quirk, |
| }; |
| |
| static const struct xhci_plat_priv xhci_plat_renesas_rcar_r8a7796 = { |
| .firmware_name = XHCI_RCAR_FIRMWARE_NAME_V3, |
| .init_quirk = xhci_rcar_init_quirk, |
| .plat_start = xhci_rcar_start, |
| + .resume_quirk = xhci_rcar_resume_quirk, |
| }; |
| |
| static const struct of_device_id usb_xhci_of_match[] = { |
| --- a/drivers/usb/host/xhci-rcar.c |
| +++ b/drivers/usb/host/xhci-rcar.c |
| @@ -198,3 +198,14 @@ int xhci_rcar_init_quirk(struct usb_hcd |
| |
| return xhci_rcar_download_firmware(hcd); |
| } |
| + |
| +int xhci_rcar_resume_quirk(struct usb_hcd *hcd) |
| +{ |
| + int ret; |
| + |
| + ret = xhci_rcar_download_firmware(hcd); |
| + if (!ret) |
| + xhci_rcar_start(hcd); |
| + |
| + return ret; |
| +} |
| --- a/drivers/usb/host/xhci-rcar.h |
| +++ b/drivers/usb/host/xhci-rcar.h |
| @@ -18,6 +18,7 @@ |
| #if IS_ENABLED(CONFIG_USB_XHCI_RCAR) |
| void xhci_rcar_start(struct usb_hcd *hcd); |
| int xhci_rcar_init_quirk(struct usb_hcd *hcd); |
| +int xhci_rcar_resume_quirk(struct usb_hcd *hcd); |
| #else |
| static inline void xhci_rcar_start(struct usb_hcd *hcd) |
| { |
| @@ -27,5 +28,10 @@ static inline int xhci_rcar_init_quirk(s |
| { |
| return 0; |
| } |
| + |
| +static inline int xhci_rcar_resume_quirk(struct usb_hcd *hcd) |
| +{ |
| + return 0; |
| +} |
| #endif |
| #endif /* _XHCI_RCAR_H */ |