[PATCH 4/4] usb: host: xhci-plat: add support for the R-Car H3 xHCI controllers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The R-Car H3 has two xHCI controllers. This SoC is compatible with
R-Car Gen2 SoCs, however this SoC doesn't need some specific registers
setting, and need a new firmware.

Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@xxxxxxxxxxx>
---
 Documentation/devicetree/bindings/usb/usb-xhci.txt |  4 ++--
 drivers/usb/host/xhci-plat.c                       |  1 +
 drivers/usb/host/xhci-rcar.c                       | 23 +++++++++++++++++++++-
 3 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/usb/usb-xhci.txt b/Documentation/devicetree/bindings/usb/usb-xhci.txt
index 106299a..0825732 100644
--- a/Documentation/devicetree/bindings/usb/usb-xhci.txt
+++ b/Documentation/devicetree/bindings/usb/usb-xhci.txt
@@ -3,8 +3,8 @@ USB xHCI controllers
 Required properties:
   - compatible: should be one of "generic-xhci",
     "marvell,armada-375-xhci", "marvell,armada-380-xhci",
-    "renesas,xhci-r8a7790", "renesas,xhci-r8a7791", "renesas,xhci-r8a7793"
-    (deprecated: "xhci-platform").
+    "renesas,xhci-r8a7790", "renesas,xhci-r8a7791", "renesas,xhci-r8a7793",
+    "renesas,xhci-r8a7795" (deprecated: "xhci-platform").
   - reg: should contain address and length of the standard XHCI
     register set for the device.
   - interrupts: one XHCI interrupt should be described here.
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index 401110f..358febb 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -253,6 +253,7 @@ static const struct of_device_id usb_xhci_of_match[] = {
 	{ .compatible = "renesas,xhci-r8a7790"},
 	{ .compatible = "renesas,xhci-r8a7791"},
 	{ .compatible = "renesas,xhci-r8a7793"},
+	{ .compatible = "renesas,xhci-r8a7795"},
 	{ },
 };
 MODULE_DEVICE_TABLE(of, usb_xhci_of_match);
diff --git a/drivers/usb/host/xhci-rcar.c b/drivers/usb/host/xhci-rcar.c
index acfa03a..eb1aed0 100644
--- a/drivers/usb/host/xhci-rcar.c
+++ b/drivers/usb/host/xhci-rcar.c
@@ -17,8 +17,16 @@
 #include "xhci.h"
 #include "xhci-rcar.h"
 
+/*
+ * - The V2 firmware is possible to use on R-Car Gen2. However, the V2 causes
+ *   performance degradation. So, this driver continues to use the V1 if R-Car
+ *   Gen2.
+ * - The V1 firmware is impossible to use on R-Car Gen3.
+ */
 #define FIRMWARE_NAME_V1	"r8a779x_usb3_v1.dlmem"
+#define FIRMWARE_NAME_V2	"r8a779x_usb3_v2.dlmem"
 MODULE_FIRMWARE(FIRMWARE_NAME_V1);
+MODULE_FIRMWARE(FIRMWARE_NAME_V2);
 
 /*** Register Offset ***/
 #define RCAR_USB3_INT_ENA	0x224	/* Interrupt Enable */
@@ -69,9 +77,20 @@ static bool xhci_rcar_is_compatible_with_gen2(struct usb_hcd *hcd)
 	return false;
 }
 
+static bool xhci_rcar_is_compatible_with_gen3(struct usb_hcd *hcd)
+{
+	struct device_node *of_node = hcd->self.controller->of_node;
+
+	if (of_device_is_compatible(of_node, "renesas,xhci-r8a7795"))
+		return true;
+
+	return false;
+}
+
 bool xhci_rcar_is_compatible(struct usb_hcd *hcd)
 {
-	if (xhci_rcar_is_compatible_with_gen2(hcd))
+	if (xhci_rcar_is_compatible_with_gen2(hcd) ||
+	    xhci_rcar_is_compatible_with_gen3(hcd))
 		return true;
 
 	return false;
@@ -176,6 +195,8 @@ int xhci_rcar_init_quirk(struct usb_hcd *hcd)
 
 	if (xhci_rcar_is_compatible_with_gen2(hcd))
 		firmware_name = FIRMWARE_NAME_V1;
+	if (xhci_rcar_is_compatible_with_gen3(hcd))
+		firmware_name = FIRMWARE_NAME_V2;
 
 	return xhci_rcar_download_firmware(hcd->self.controller, hcd->regs,
 					   firmware_name);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux