Hello,
Allwinner V3s shares one USB port with MUSB OTG module and EHCI/OHCI.
The default route of USB-PHY is to OTG module so we have to add workaround
to sys/dev/fdt/ehci_fdt.c that the port connects to host controller.
(reference: sun4i_usb_phy0_reroute() at drivers/phy/allwinner/phy-sun4i-usb.c,
Linux-5.0-RC6 code)
Index: ehci_fdt.c
===================================================================
RCS file: /cvs/src/sys/dev/fdt/ehci_fdt.c,v
retrieving revision 1.4
diff -u -p -u -r1.4 ehci_fdt.c
--- ehci_fdt.c 6 Aug 2018 10:52:30 -0000 1.4
+++ ehci_fdt.c 20 Feb 2019 10:42:49 -0000
@@ -254,6 +254,57 @@ ehci_init_phys(struct ehci_fdt_softc *sc
#define SUNXI_AHB_INCR8 (1 << 10)
#define SUNXI_AHB_INCR16 (1 << 11)
+#define SUNXI_OTG_CTL 0x020
+#define SUNXI_ROUTE_MUSB (1 << 0)
+
+/*
+ * Allwinner V3s shares one USB port with MUSB OTG module and OHCI/EHCI.
+ * Different from other Allwinner SoCs, V3s has no dedicated port connected
+ * to host controller. And default port routing is to MUSB OTG.
+ * So this workaround is needed.
+ */
+void
+sun4i_port_routing(struct ehci_fdt_softc *sc, uint32_t *cells)
+{
+ bus_space_tag_t iot;
+ bus_space_handle_t ioh;
+ int idx, len, node;
+ uint32_t *reg;
+ uint32_t val;
+
+ node = OF_getnodebyphandle(cells[0]);
+ if (node == 0)
+ return;
+
+ if (!OF_is_compatible(node, "allwinner,sun8i-v3s-usb-phy"))
+ return;
+
+ idx = OF_getindex(node, "phy_ctrl", "reg-names");
+ if (idx < 0)
+ return;
+
+ len = OF_getproplen(node, "reg");
+ if (len <= 0)
+ return;
+
+ reg = malloc(len, M_TEMP, M_WAITOK);
+ OF_getpropintarray(node, "reg", reg, len);
+
+ iot = sc->sc.iot;
+ if (bus_space_map(iot, reg[idx], reg[idx + 1], 0, &ioh)) {
+ free(reg, M_TEMP, len);
+ return;
+ }
+
+ /* assign USB port to OHCI/EHCI */
+ val = bus_space_read_4(iot, ioh, SUNXI_OTG_CTL);
+ val &= ~SUNXI_ROUTE_MUSB;
+ bus_space_write_4(iot, ioh, SUNXI_OTG_CTL, val);
+
+ bus_space_unmap(iot, ioh, reg[idx + 1]);
+ free(reg, M_TEMP, len);
+}
+
void
sun4i_phy_init(struct ehci_fdt_softc *sc, uint32_t *cells)
{
@@ -278,6 +329,7 @@ sun4i_phy_init(struct ehci_fdt_softc *sc
*/
if (OF_is_compatible(node, "allwinner,sun8i-h3-usb-phy") ||
OF_is_compatible(node, "allwinner,sun8i-r40-usb-phy") ||
+ OF_is_compatible(node, "allwinner,sun8i-v3s-usb-phy") ||
OF_is_compatible(node, "allwinner,sun50i-a64-usb-phy")) {
val = bus_space_read_4(sc->sc.iot, sc->sc.ioh, 0x810);
val &= ~(1 << 1);
@@ -306,6 +358,8 @@ sun4i_phy_init(struct ehci_fdt_softc *sc
vbus_supply = OF_getpropint(node, name, 0);
if (vbus_supply)
regulator_enable(vbus_supply);
+
+ sun4i_port_routing(sc, cells);
}
void
--------
To support OHCI/EHCI on LicheePi Zero, we have to modify devicetree
like this diff. ehci (and maybe ohci) node needs phys and phy-names
property.
--- sun8i-v3s.dtsi.orig Thu Feb 14 21:59:49 2019
+++ sun8i-v3s.dtsi Wed Feb 20 12:59:19 2019
@@ -180,6 +180,29 @@
#phy-cells = <1>;
};
+ ehci0: usb@01c1a000 {
+ compatible = "allwinner,sun8i-v3s-ehci", "generic-ehci";
+ reg = <0x01c1a000 0x100>;
+ interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&ccu CLK_BUS_EHCI0>, <&ccu CLK_BUS_OHCI0>;
+ resets = <&ccu RST_BUS_EHCI0>, <&ccu RST_BUS_OHCI0>;
+ phys = <&usbphy 0>;
+ phy-names = "usb";
+ status = "disabled";
+ };
+
+ ohci0: usb@01c1a400 {
+ compatible = "allwinner,sun8i-v3s-ohci", "generic-ohci";
+ reg = <0x01c1a400 0x100>;
+ interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&ccu CLK_BUS_EHCI0>, <&ccu CLK_BUS_OHCI0>,
+ <&ccu CLK_USB_OHCI0>;
+ resets = <&ccu RST_BUS_EHCI0>, <&ccu RST_BUS_OHCI0>;
+ phys = <&usbphy 0>;
+ phy-names = "usb";
+ status = "disabled";
+ };
+
ccu: clock@01c20000 {
compatible = "allwinner,sun8i-v3s-ccu";
reg = <0x01c20000 0x400>;
--- sun8i-v3s-licheepi-zero.dts.orig Thu Feb 14 21:59:49 2019
+++ sun8i-v3s-licheepi-zero.dts Thu Feb 14 22:46:31 2019
@@ -57,6 +57,10 @@
};
};
+&ehci0 {
+ status = "okay";
+};
+
&mmc0 {
pinctrl-0 = <&mmc0_pins_a>;
pinctrl-names = "default";
@@ -64,6 +68,10 @@
bus-width = <4>;
vmmc-supply = <®_vcc3v3>;
status = "okay";
+};
+
+&ohci0 {
+ status = "okay";
};
&uart0 {
Regards,
--
SASANO Takayoshi (JG1UAA) <[email protected]>