[v2,02/10] usb: host: xhci: mvebu: add reset on resume quirk
diff mbox series

Message ID 20190111133133.24803-3-miquel.raynal@bootlin.com
State New
Headers show
Series
  • A3700 USB S2RAM support
Related show

Commit Message

Miquel Raynal Jan. 11, 2019, 1:31 p.m. UTC
From: Ofer Heifetz <oferh@marvell.com>

The mvebu xHCI host driver does not have suspend/resume support. Use of
the XHCI_RESET_ON_RESUME quirk is mandatory in order to avoid failures
after resume. This will work only if no USB device is plugged-in.

While at it, mention in the Kconfig file that this IP is also present
on the A3700 SoC.

Signed-off-by: Ofer Heifetz <oferh@marvell.com>
[miquel.raynal@bootlin.com: Reword the commit message]
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
---
 drivers/usb/host/Kconfig      |  4 ++--
 drivers/usb/host/xhci-mvebu.c | 11 +++++++++++
 drivers/usb/host/xhci-mvebu.h |  6 ++++++
 drivers/usb/host/xhci-plat.c  |  7 +++++++
 4 files changed, 26 insertions(+), 2 deletions(-)

Comments

Gregory CLEMENT Jan. 18, 2019, 4:04 p.m. UTC | #1
Hi Miquel,
 
 On ven., janv. 11 2019, Miquel Raynal <miquel.raynal@bootlin.com> wrote:

> From: Ofer Heifetz <oferh@marvell.com>
>
> The mvebu xHCI host driver does not have suspend/resume support. Use of
> the XHCI_RESET_ON_RESUME quirk is mandatory in order to avoid failures
> after resume. This will work only if no USB device is plugged-in.
>
> While at it, mention in the Kconfig file that this IP is also present
> on the A3700 SoC.
>
> Signed-off-by: Ofer Heifetz <oferh@marvell.com>
> [miquel.raynal@bootlin.com: Reword the commit message]
> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> ---
>  drivers/usb/host/Kconfig      |  4 ++--
>  drivers/usb/host/xhci-mvebu.c | 11 +++++++++++
>  drivers/usb/host/xhci-mvebu.h |  6 ++++++
>  drivers/usb/host/xhci-plat.c  |  7 +++++++
>  4 files changed, 26 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
> index 16758b12a5e9..13d59be6a6aa 100644
> --- a/drivers/usb/host/Kconfig
> +++ b/drivers/usb/host/Kconfig
> @@ -69,13 +69,13 @@ config USB_XHCI_MTK
>  	  If unsure, say N.
>  
>  config USB_XHCI_MVEBU
> -	tristate "xHCI support for Marvell Armada 375/38x"
> +	tristate "xHCI support for Marvell Armada 375/38x/3700"

I would name it 37xx to be consistent with 38x

>  	select USB_XHCI_PLATFORM
>  	depends on HAS_IOMEM
>  	depends on ARCH_MVEBU || COMPILE_TEST
>  	---help---
>  	  Say 'Y' to enable the support for the xHCI host controller
> -	  found in Marvell Armada 375/38x ARM SOCs.
> +	  found in Marvell Armada 375/38x/3700 ARM SOCs.
same here


>  
>  config USB_XHCI_RCAR
>  	tristate "xHCI support for Renesas R-Car SoCs"
> diff --git a/drivers/usb/host/xhci-mvebu.c b/drivers/usb/host/xhci-mvebu.c
> index 32e158568788..60651a50770f 100644
> --- a/drivers/usb/host/xhci-mvebu.c
> +++ b/drivers/usb/host/xhci-mvebu.c
> @@ -13,6 +13,7 @@
>  #include <linux/usb/hcd.h>
>  
>  #include "xhci-mvebu.h"
> +#include "xhci.h"
>  
>  #define USB3_MAX_WINDOWS	4
>  #define USB3_WIN_CTRL(w)	(0x0 + ((w) * 8))
> @@ -72,3 +73,13 @@ int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd)
>  
>  	return 0;
>  }
> +
> +int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd)
> +{
> +	struct xhci_hcd	*xhci = hcd_to_xhci(hcd);
> +
> +	/* Without reset on resume, the HC won't work at all */
> +	xhci->quirks |= XHCI_RESET_ON_RESUME;
> +
> +	return 0;
> +}
> diff --git a/drivers/usb/host/xhci-mvebu.h b/drivers/usb/host/xhci-mvebu.h
> index 09791df2cec0..ca0a3a5721dd 100644
> --- a/drivers/usb/host/xhci-mvebu.h
> +++ b/drivers/usb/host/xhci-mvebu.h
> @@ -12,10 +12,16 @@ struct usb_hcd;
>  
>  #if IS_ENABLED(CONFIG_USB_XHCI_MVEBU)
>  int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd);
> +int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd);
>  #else
>  static inline int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd)
>  {
>  	return 0;
>  }
> +
> +static inline int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd)
> +{
> +	return 0;
> +}
>  #endif
>  #endif /* __LINUX_XHCI_MVEBU_H */
> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
> index ef09cb06212f..0ac4ec975547 100644
> --- a/drivers/usb/host/xhci-plat.c
> +++ b/drivers/usb/host/xhci-plat.c
> @@ -98,6 +98,10 @@ static const struct xhci_plat_priv xhci_plat_marvell_armada = {
>  	.init_quirk = xhci_mvebu_mbus_init_quirk,
>  };
>  
> +static const struct xhci_plat_priv xhci_plat_marvell_armada3700 = {
> +	.init_quirk = xhci_mvebu_a3700_init_quirk,
> +};
> +
>  static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen2 = {
>  	.firmware_name = XHCI_RCAR_FIRMWARE_NAME_V1,
>  	.init_quirk = xhci_rcar_init_quirk,
> @@ -123,6 +127,9 @@ static const struct of_device_id usb_xhci_of_match[] = {
>  	}, {
>  		.compatible = "marvell,armada-380-xhci",
>  		.data = &xhci_plat_marvell_armada,
> +	}, {
> +		.compatible = "marvell,armada3700-xhci",
> +		.data = &xhci_plat_marvell_armada3700,


Reviewed-by: Gregory CLEMENT <gregory.clement@bootlin.com>

Thanks,

Gregory
Miquel Raynal Jan. 21, 2019, 10:54 a.m. UTC | #2
Hi Gregory,

Gregory CLEMENT <gregory.clement@bootlin.com> wrote on Fri, 18 Jan 2019
17:04:01 +0100:

> Hi Miquel,
>  
>  On ven., janv. 11 2019, Miquel Raynal <miquel.raynal@bootlin.com> wrote:
> 
> > From: Ofer Heifetz <oferh@marvell.com>
> >
> > The mvebu xHCI host driver does not have suspend/resume support. Use of
> > the XHCI_RESET_ON_RESUME quirk is mandatory in order to avoid failures
> > after resume. This will work only if no USB device is plugged-in.
> >
> > While at it, mention in the Kconfig file that this IP is also present
> > on the A3700 SoC.
> >
> > Signed-off-by: Ofer Heifetz <oferh@marvell.com>
> > [miquel.raynal@bootlin.com: Reword the commit message]
> > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> > ---
> >  drivers/usb/host/Kconfig      |  4 ++--
> >  drivers/usb/host/xhci-mvebu.c | 11 +++++++++++
> >  drivers/usb/host/xhci-mvebu.h |  6 ++++++
> >  drivers/usb/host/xhci-plat.c  |  7 +++++++
> >  4 files changed, 26 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
> > index 16758b12a5e9..13d59be6a6aa 100644
> > --- a/drivers/usb/host/Kconfig
> > +++ b/drivers/usb/host/Kconfig
> > @@ -69,13 +69,13 @@ config USB_XHCI_MTK
> >  	  If unsure, say N.
> >  
> >  config USB_XHCI_MVEBU
> > -	tristate "xHCI support for Marvell Armada 375/38x"
> > +	tristate "xHCI support for Marvell Armada 375/38x/3700"  
> 
> I would name it 37xx to be consistent with 38x
> 
> >  	select USB_XHCI_PLATFORM
> >  	depends on HAS_IOMEM
> >  	depends on ARCH_MVEBU || COMPILE_TEST
> >  	---help---
> >  	  Say 'Y' to enable the support for the xHCI host controller
> > -	  found in Marvell Armada 375/38x ARM SOCs.
> > +	  found in Marvell Armada 375/38x/3700 ARM SOCs.  
> same here
> 

Sure!


Thanks,
Miquèl

Patch
diff mbox series

diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index 16758b12a5e9..13d59be6a6aa 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -69,13 +69,13 @@  config USB_XHCI_MTK
 	  If unsure, say N.
 
 config USB_XHCI_MVEBU
-	tristate "xHCI support for Marvell Armada 375/38x"
+	tristate "xHCI support for Marvell Armada 375/38x/3700"
 	select USB_XHCI_PLATFORM
 	depends on HAS_IOMEM
 	depends on ARCH_MVEBU || COMPILE_TEST
 	---help---
 	  Say 'Y' to enable the support for the xHCI host controller
-	  found in Marvell Armada 375/38x ARM SOCs.
+	  found in Marvell Armada 375/38x/3700 ARM SOCs.
 
 config USB_XHCI_RCAR
 	tristate "xHCI support for Renesas R-Car SoCs"
diff --git a/drivers/usb/host/xhci-mvebu.c b/drivers/usb/host/xhci-mvebu.c
index 32e158568788..60651a50770f 100644
--- a/drivers/usb/host/xhci-mvebu.c
+++ b/drivers/usb/host/xhci-mvebu.c
@@ -13,6 +13,7 @@ 
 #include <linux/usb/hcd.h>
 
 #include "xhci-mvebu.h"
+#include "xhci.h"
 
 #define USB3_MAX_WINDOWS	4
 #define USB3_WIN_CTRL(w)	(0x0 + ((w) * 8))
@@ -72,3 +73,13 @@  int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd)
 
 	return 0;
 }
+
+int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd)
+{
+	struct xhci_hcd	*xhci = hcd_to_xhci(hcd);
+
+	/* Without reset on resume, the HC won't work at all */
+	xhci->quirks |= XHCI_RESET_ON_RESUME;
+
+	return 0;
+}
diff --git a/drivers/usb/host/xhci-mvebu.h b/drivers/usb/host/xhci-mvebu.h
index 09791df2cec0..ca0a3a5721dd 100644
--- a/drivers/usb/host/xhci-mvebu.h
+++ b/drivers/usb/host/xhci-mvebu.h
@@ -12,10 +12,16 @@  struct usb_hcd;
 
 #if IS_ENABLED(CONFIG_USB_XHCI_MVEBU)
 int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd);
+int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd);
 #else
 static inline int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd)
 {
 	return 0;
 }
+
+static inline int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd)
+{
+	return 0;
+}
 #endif
 #endif /* __LINUX_XHCI_MVEBU_H */
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index ef09cb06212f..0ac4ec975547 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -98,6 +98,10 @@  static const struct xhci_plat_priv xhci_plat_marvell_armada = {
 	.init_quirk = xhci_mvebu_mbus_init_quirk,
 };
 
+static const struct xhci_plat_priv xhci_plat_marvell_armada3700 = {
+	.init_quirk = xhci_mvebu_a3700_init_quirk,
+};
+
 static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen2 = {
 	.firmware_name = XHCI_RCAR_FIRMWARE_NAME_V1,
 	.init_quirk = xhci_rcar_init_quirk,
@@ -123,6 +127,9 @@  static const struct of_device_id usb_xhci_of_match[] = {
 	}, {
 		.compatible = "marvell,armada-380-xhci",
 		.data = &xhci_plat_marvell_armada,
+	}, {
+		.compatible = "marvell,armada3700-xhci",
+		.data = &xhci_plat_marvell_armada3700,
 	}, {
 		.compatible = "renesas,xhci-r8a7790",
 		.data = &xhci_plat_renesas_rcar_gen2,