Commit 12453a89 authored by Ofer Heifetz's avatar Ofer Heifetz Committed by Greg Kroah-Hartman
Browse files

usb: host: xhci: mvebu: add reset on resume quirk



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: default avatarOfer Heifetz <oferh@marvell.com>
[miquel.raynal@bootlin.com: Reword the commit message]
Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Reviewed-by: default avatarGregory CLEMENT <gregory.clement@bootlin.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b97a3134
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -70,13 +70,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/37xx"
	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/37xx ARM SOCs.

config USB_XHCI_RCAR
	tristate "xHCI support for Renesas R-Car SoCs"
+11 −0
Original line number Diff line number Diff line
@@ -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;
}
+6 −0
Original line number Diff line number Diff line
@@ -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 */
+7 −0
Original line number Diff line number Diff line
@@ -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,