Re: FYI: Rock64 USB3 port no longer works for main [so: 14] (looks like dtb changes invalidating use of the old .dtbo and needing kernel changes)

From: Mark Millard <marklmi_at_yahoo.com>
Date: Tue, 15 Nov 2022 21:03:45 UTC
On Nov 15, 2022, at 05:05, Emmanuel Vadot <manu@bidouilliste.com> wrote:

> On Fri, 4 Nov 2022 12:31:51 -0700
> Mark Millard <marklmi@yahoo.com> wrote:
> 
>> On 2022-Oct-22, at 23:00, Mark Millard <marklmi@yahoo.com> wrote:
>> 
>>> Well, turns out that part of the "Import device-tree files
>>> from Linux 5.14" is:
>>> 
>>> https://cgit.freebsd.org/src/commit/sys/contrib/device-tree/src/arm64/rockchip/rk3328-rock64.dts?id=5956d97f4b32
>>> 
>>> which has:
>>> 
>>> diff --git a/sys/contrib/device-tree/src/arm64/rockchip/rk3328-rock64.dts b/sys/contrib/device-tree/src/arm64/rockchip/rk3328-rock64.dts
>>> index 3bef1f39bc6e..1b0f7e4551ea 100644
>>> --- a/sys/contrib/device-tree/src/arm64/rockchip/rk3328-rock64.dts
>>> +++ b/sys/contrib/device-tree/src/arm64/rockchip/rk3328-rock64.dts
>>> @@ -381,6 +381,11 @@
>>> status = "okay";
>>> };
>>> 
>>> +&usbdrd3 {
>>> + dr_mode = "host";
>>> + status = "okay";
>>> +};
>>> +
>>> &usb_host0_ehci {
>>> status = "okay";
>>> };
>>> 
>>> usbdrd3 is for USB3, so "host" now has a sort of dtb change
>>> in the interfacing for supporting host-mode USB3. The old:
>>> 
>>> /usr/main-src/sys/dts/arm64/overlays/rk3328-dwc3.dtso
>>> 
>>> has, in part:
>>> 
>>>       usbdrd3: usb@ff600000 {
>>>               compatible = "rockchip,rk3328-dwc3";
>>>               clocks = <&cru SCLK_USB3OTG_REF>, <&cru SCLK_USB3OTG_SUSPEND>,
>>>                        <&cru ACLK_USB3OTG>;
>>>               clock-names = "ref_clk", "suspend_clk",
>>>                             "bus_clk";
>>>               #address-cells = <2>;
>>>               #size-cells = <2>;
>>>               ranges;
>>>               status = "okay";
>>> 
>>>               usbdrd_dwc3: dwc3@ff600000 {
>>>                       compatible = "snps,dwc3";
>>>                       reg = <0x0 0xff600000 0x0 0x100000>;
>>>                       interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
>>>                       dr_mode = "host";
>>>                       phy_type = "utmi_wide";
>>>                       snps,dis_enblslpm_quirk;
>>>                       snps,dis-u2-freeclk-exists-quirk;
>>>                       snps,dis_u2_susphy_quirk;
>>>                       snps,dis_u3_susphy_quirk;
>>>                       snps,dis-del-phy-power-chg-quirk;
>>>                       snps,dis-tx-ipgap-linecheck-quirk;
>>>                       status = "okay";
>>>               };
>>>       };
>>> 
>>> which looks to me to likely now conflict with the below --given
>>> the added "host" usage as of 5.14 reported above:
>>> 
>>> /usr/main-src/sys/contrib/device-tree/src/arm64/rockchip/rk3328.dtsi
>>> 
>>> that, as of the 5.13 import, has:
>>> 
>>>       usbdrd3: usb@ff600000 {
>>>               compatible = "rockchip,rk3328-dwc3", "snps,dwc3";
>>>               reg = <0x0 0xff600000 0x0 0x100000>;
>>>               interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
>>>               clocks = <&cru SCLK_USB3OTG_REF>, <&cru SCLK_USB3OTG_SUSPEND>,
>>>                        <&cru ACLK_USB3OTG>;
>>>               clock-names = "ref_clk", "suspend_clk",
>>>                             "bus_clk";
>>>               dr_mode = "otg";
>>>               phy_type = "utmi_wide";
>>>               snps,dis-del-phy-power-chg-quirk;
>>>               snps,dis_enblslpm_quirk;
>>>               snps,dis-tx-ipgap-linecheck-quirk;
>>>               snps,dis-u2-freeclk-exists-quirk;
>>>               snps,dis_u2_susphy_quirk;
>>>               snps,dis_u3_susphy_quirk;
>>>               status = "disabled";
>>>       };
>>> 
>>> My guess would be that some kernel changes are required
>>> in order to track this structural changes, not just
>>> avoiding the old .dtbo . Testing showed that disabling
>>> the load of the .dtbo was insufficient to fix things.
>> 
>> FYI:
>> 
>> The mainline Linux commit that addeed usbdrd3 to
>> arch/arm64/boot/dts/rockchip/rk3328.dtsi is the
>> following from 2021-03-24:
>> 
>> https://github.com/torvalds/linux/commit/44dd5e2106dc2fd01697b539085818d1d1c58df0
>> 
>> The mainline Linux commit that added the enabling of
>> the USB3 host mode in
>> arch/arm64/boot/dts/rockchip/rk3328-rock64.dts
>> is the following from 2021-05-01:
>> 
>> https://github.com/torvalds/linux/commit/bbac8bd65f5402281cb7b0452c1c5f367387b459
>> 
>> ===
>> Mark Millard
>> marklmi at yahoo.com
>> 
>> 
> 
> Hi Mark,
> 
> See https://reviews.freebsd.org/D37392 (and child reviews) for a fix.
> This was indeed the import of the new DTS files that caused the first
> problem (there is no glue node in rk3328.dtsi like in other SoCs or
> like our overlay). The other commit responsible for breaking USB3
> support was the addition to RK356x SoC, the check was bad for when to
> force USB2.

Thanks.

I applied the diff and the 2 child diff's and rebuilt and
installed, including updating the kernel on the e.MMC that
is historically used to mount the rootfs on USB3 when the
USB3 drive is plugged in there. (U-boot does not handle
the USB context I want.)

Unfortunately, the kernel still only manages to find the
rootfs when plugged into USB2 instead of USB3.

I do not see any references to dwc3 in the console log.
There are references to EHCI and OHCI but not XHCI.
There is:

usbus0: 480Mbps High Speed USB v2.0
usbus1: 12Mbps Full Speed USB v1.0
usbus3: 480Mbps High Speed USB v2.0

but nothing for the USB3 rate.

I do have the old rk3328-dwc3.dtbo reference commented out
in /boot/loader.conf :

#fdt_overlays="rk3328-dwc3.dtbo"

The context was (long output line split for readability):

# uname -apKU
FreeBSD RPi_4_3_2v1p2 14.0-CURRENT FreeBSD 14.0-CURRENT #48
main-n259064-f83db6441a2f-dirty: Tue Nov 15 10:19:44 PST 2022
root@CA72_16Gp_ZFS:/usr/obj/BUILDs/main-CA53-nodbg-clang/usr/main-src/arm64.aarch64/sys/GENERIC-NODBG-CA53
arm64 aarch64 1400073 1400073

(Shown from a USB2 based boot.)

The Console output from ---<<BOOT>>--- on for the failure was:

---<<BOOT>>---
GDB: debug ports: uart
GDB: current port: uart
KDB: debugger backends: ddb gdb
KDB: current backend: ddb
WARNING: Cannot find freebsd,dts-version property, cannot check DTB compliance
Copyright (c) 1992-2022 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 14.0-CURRENT #48 main-n259064-f83db6441a2f-dirty: Tue Nov 15 10:19:44 PST 2022
    root@CA72_16Gp_ZFS:/usr/obj/BUILDs/main-CA53-nodbg-clang/usr/main-src/arm64.aarch64/sys/GENERIC-NODBG-CA53 arm64
FreeBSD clang version 14.0.5 (https://github.com/llvm/llvm-project.git llvmorg-14.0.5-0-gc12386ae247c)
VT: init without driver.
module firmware already present!
real memory  = 4276092928 (4078 MB)
avail memory = 4145885184 (3953 MB)
Starting CPU 1 (1)
Starting CPU 2 (2)
Starting CPU 3 (3)
FreeBSD/SMP: Multiprocessor System Detected: 4 CPUs
random: unblocking device.
random: entropy device external interface
MAP fbf17000 mode 2 pages 1
MAP fbf1b000 mode 2 pages 1
MAP fbf1d000 mode 2 pages 2
MAP fbf20000 mode 2 pages 4
MAP fef30000 mode 2 pages 16
kbd0 at kbdmux0
ofwbus0: <Open Firmware Device Tree>
clk_fixed0: <Fixed clock> on ofwbus0
rk_grf0: <RockChip General Register Files> mem 0xff100000-0xff100fff on ofwbus0
rk3328_cru0: <Rockchip RK3328 Clock and Reset Unit> mem 0xff440000-0xff440fff on ofwbus0
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
Cannot set frequency for clk: aclk_bus_pre_c, error: 34
rk3328_cru0: Failed to set aclk_bus_pre to a frequency of 15000000
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
Cannot set frequency for clk: aclk_peri_pre, error: 34
rk3328_cru0: Failed to set aclk_peri_pre to a frequency of 15000000
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy
Cannot get frequency for clk: hdmi_phy, error: 9
clk_fixed1: <Fixed clock> on ofwbus0
regfix0: <Fixed Regulator> on ofwbus0
regfix1: <Fixed Regulator> on ofwbus0
regfix2: <Fixed Regulator> on ofwbus0
regfix3: <Fixed Regulator> on ofwbus0
simple_mfd0: <Simple MFD (Multi-Functions Device)> mem 0xff450000-0xff45ffff on ofwbus0
psci0: <ARM Power State Co-ordination Interface Driver> on ofwbus0
gic0: <ARM Generic Interrupt Controller> mem 0xff811000-0xff811fff,0xff812000-0xff813fff,0xff814000-0xff815fff,0xff816000-0xff817fff irq 52 on ofwbus0
gic0: pn 0x2, arch 0x2, rev 0x1, implementer 0x43b irqs 160
rk_pinctrl0: <RockChip Pinctrl controller> on ofwbus0
gpio0: <RockChip GPIO Bank controller> mem 0xff210000-0xff2100ff irq 53 on rk_pinctrl0
gpiobus0: <OFW GPIO bus> on gpio0
gpio1: <RockChip GPIO Bank controller> mem 0xff220000-0xff2200ff irq 54 on rk_pinctrl0
gpiobus1: <OFW GPIO bus> on gpio1
gpio2: <RockChip GPIO Bank controller> mem 0xff230000-0xff2300ff irq 55 on rk_pinctrl0
gpiobus2: <OFW GPIO bus> on gpio2
gpio3: <RockChip GPIO Bank controller> mem 0xff240000-0xff2400ff irq 56 on rk_pinctrl0
gpiobus3: <OFW GPIO bus> on gpio3
rk_i2c0: <RockChip I2C> mem 0xff160000-0xff160fff irq 16 on ofwbus0
iicbus0: <OFW I2C bus> on rk_i2c0
rk805_pmu0: <RockChip RK805 PMIC> at addr 0x30 irq 57 on iicbus0
generic_timer0: <ARMv8 Generic Timer> irq 4,5,6,7 on ofwbus0
Timecounter "ARM MPCore Timecounter" frequency 24000000 Hz quality 1000
Event timer "ARM MPCore Eventtimer" frequency 24000000 Hz quality 1000
rk_tsadc0: <RockChip temperature sensors> mem 0xff250000-0xff2500ff irq 24 on ofwbus0
cpulist0: <Open Firmware CPU Group> on ofwbus0
cpu0: <Open Firmware CPU> on cpulist0
cpufreq_dt0: <Generic cpufreq driver> on cpu0
cpufreq_dt0: Found cpu-supply
cpu1: <Open Firmware CPU> on cpulist0
cpufreq_dt1: <Generic cpufreq driver> on cpu1
cpufreq_dt1: Found cpu-supply
cpu2: <Open Firmware CPU> on cpulist0
cpufreq_dt2: <Generic cpufreq driver> on cpu2
cpufreq_dt2: Found cpu-supply
cpu3: <Open Firmware CPU> on cpulist0
cpufreq_dt3: <Generic cpufreq driver> on cpu3
cpufreq_dt3: Found cpu-supply
pcm0: <simple-audio-card> on ofwbus0
pmu0: <Performance Monitoring Unit> irq 0,1,2,3 on ofwbus0
pcm1: <simple-audio-card> on ofwbus0
i2s0: <Rockchip I2S> mem 0xff000000-0xff000fff irq 8 on ofwbus0
Cannot set frequency for clk: xin12m, error: 34
Cannot set frequency for clk: xin12m, error: 34
i2s1: <Rockchip I2S> mem 0xff010000-0xff010fff irq 9 on ofwbus0
Cannot set frequency for clk: clkin_i2s1, error: 34
Cannot set frequency for clk: xin12m, error: 34
uart0: <16750 or compatible> mem 0xff130000-0xff1300ff irq 14 on ofwbus0
uart0: console (1500000,n,8,1)
iic0: <I2C generic I/O> on iicbus0
spi0: <Rockchip SPI> mem 0xff190000-0xff190fff irq 19 on ofwbus0
spibus0: <OFW SPI bus> on spi0
spibus0: <unknown card> at cs 0 mode 0
rockchip_dwmmc0: <Synopsys DesignWare Mobile Storage Host Controller (RockChip)> mem 0xff500000-0xff503fff irq 43 on ofwbus0
rockchip_dwmmc0: Hardware version ID is 270a
rockchip_dwmmc1: <Synopsys DesignWare Mobile Storage Host Controller (RockChip)> mem 0xff520000-0xff523fff irq 45 on ofwbus0
rockchip_dwmmc1: Hardware version ID is 270a
mmc0: <MMC/SD bus> on rockchip_dwmmc1
dwc0: <Rockchip Gigabit Ethernet Controller> mem 0xff540000-0xff54ffff irq 46 on ofwbus0
miibus0: <MII bus> on dwc0
rgephy0: <RTL8169S/8110S/8211 1000BASE-T media interface> PHY 0 on miibus0
rgephy0:  none, 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT-FDX, 1000baseT-FDX-master, auto
rgephy1: <RTL8169S/8110S/8211 1000BASE-T media interface> PHY 1 on miibus0
rgephy1:  none, 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT-FDX, 1000baseT-FDX-master, auto
dwc0: Ethernet address: d2:64:d7:54:db:8c
ehci0: <Generic EHCI Controller> mem 0xff5c0000-0xff5cffff irq 48 on ofwbus0
usbus0: EHCI version 1.0
usbus0 on ehci0
ohci0: <Generic OHCI Controller> mem 0xff5d0000-0xff5dffff irq 49 on ofwbus0
usbus1 on ohci0
dwcotg0: <DWC OTG 2.0 integrated USB controller> mem 0xff580000-0xff5bffff irq 51 on ofwbus0
usbus3 on dwcotg0
gpioc0: <GPIO controller> on gpio0
gpioc1: <GPIO controller> on gpio1
gpioc2: <GPIO controller> on gpio2
gpioc3: <GPIO controller> on gpio3
gpioled0: <GPIO LEDs> on ofwbus0
gpioled0: <led-0> failed to map pin
gpioled0: <led-1> failed to map pin
pcm2: <simple-audio-card> on ofwbus0
armv8crypto0: <AES-CBC,AES-XTS,AES-GCM>
Timecounters tick every 1.000 msec
rk805_pmu0: registered as a time-of-day clock, resolution 1.000000s
pcm0: no driver attached to codec node
pcm1: no driver attached to codec node
usbus0: 480Mbps High Speed USB v2.0
usbus1: 12Mbps Full Speed USB v1.0
usbus3: 480Mbps High Speed USB v2.0
ugen0.1: <Generic EHCI root HUB> at usbus0
uhub0 on usbus0
uhub0: <Generic EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus0
ugen3.1: <DWCOTG OTG Root HUB> at usbus3
uhub1 on usbus3
uhub1: <DWCOTG OTG Root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus3
ugen1.1: <Generic OHCI root HUB> at usbus1
uhub2 on usbus1
uhub2: <Generic OHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus1
mmcsd0: 125GB <MMCHC DJNB4R 0.7 SN 9F43B2AE MFG 06/2016 by 21 0x0000> at mmc0 52.0MHz/8bit/1016-block
mmcsd0boot0: 4MB partition 1 at mmcsd0
mmcsd0boot1: 4MB partition 2 at mmcsd0
mmcsd0rpmb: 4MB partition 3 at mmcsd0
pcm2: no driver attached to cpu node
CPU  0: ARM Cortex-A53 r0p4 affinity:  0
                   Cache Type = <64 byte D-cacheline,64 byte I-cacheline,VIPT ICache,64 byte ERG,64 byte CWG>
 Instruction Set Attributes 0 = <CRC32,SHA2,SHA1,AES+PMULL>
 Instruction Set Attributes 1 = <>
 Instruction Set Attributes 2 = <>
         Processor Features 0 = <AdvSIMD,FP,EL3 32,EL2 32,EL1 32,EL0 32>
         Processor Features 1 = <>
      Memory Model Features 0 = <TGran4,TGran64,SNSMem,BigEnd,16bit ASID,1TB PA>
      Memory Model Features 1 = <8bit VMID>
      Memory Model Features 2 = <32bit CCIDX,48bit VA>
             Debug Features 0 = <DoubleLock,2 CTX BKPTs,4 Watchpoints,6 Breakpoints,PMUv3,Debugv8>
             Debug Features 1 = <>
         Auxiliary Features 0 = <>
         Auxiliary Features 1 = <>
AArch32 Instruction Set Attributes 5 = <CRC32,SHA2,SHA1,AES+VMULL,SEVL>
AArch32 Media and VFP Features 0 = <FPRound,FPSqrt,FPDivide,DP VFPv3+v4,SP VFPv3+v4,AdvSIMD>
AArch32 Media and VFP Features 1 = <SIMDFMAC,FPHP DP Conv,SIMDHP SP Conv,SIMDSP,SIMDInt,SIMDLS,FPDNaN,FPFtZ>
CPU  1: ARM Cortex-A53 r0p4 affinity:  1
CPU  2: ARM Cortex-A53 r0p4 affinity:  2
CPU  3: ARM Cortex-A53 r0p4 affinity:  3
Release APs...done
Unresolved linked clock found: hdmi_phy
Unresolved linked clock found: usb480m_phy
Trying to mount root from ufs:/dev/gpt/Rock64root []...
uhub2: 1 port with 1 removable, self powered
uhub1: 1 port with 1 removable, self powered
uhub0: 1 port with 1 removable, self powered
Root mount waiting for: CAM
Root mount waiting for: CAM
Root mount waiting for: CAM
Root mount waiting for: CAM
Root mount waiting for: CAM
Root mount waiting for: CAM
Root mount waiting for: CAM
Root mount waiting for: CAM
Root mount waiting for: CAM
Mounting from ufs:/dev/gpt/Rock64root failed with error 22; retrying for 3 more seconds
Mounting from ufs:/dev/gpt/Rock64root failed with error 22: Invalid fstype.


For reference for the patching I applied (whitespace
details may not be preserved):

# git -C /usr/main-src/ diff sys/dev/usb/controller/ sys/arm64/rockchip/
diff --git a/sys/arm64/rockchip/rk_dwc3.c b/sys/arm64/rockchip/rk_dwc3.c
index 8582f7a86999..645a1cffbd95 100644
--- a/sys/arm64/rockchip/rk_dwc3.c
+++ b/sys/arm64/rockchip/rk_dwc3.c
@@ -54,12 +54,10 @@ __FBSDID("$FreeBSD$");
 #include <dev/extres/syscon/syscon.h>
   enum rk_dwc3_type {
-       RK3328 = 1,
-       RK3399,
+       RK3399 = 1,
 };
   static struct ofw_compat_data compat_data[] = {
-       { "rockchip,rk3328-dwc3",       RK3328 },
        { "rockchip,rk3399-dwc3",       RK3399 },
        { NULL,                         0 }
 };
diff --git a/sys/dev/usb/controller/dwc3.c b/sys/dev/usb/controller/dwc3.c
index 2e8f868bc47b..40405927685e 100644
--- a/sys/dev/usb/controller/dwc3.c
+++ b/sys/dev/usb/controller/dwc3.c
@@ -86,6 +86,14 @@ struct snps_dwc3_softc {
        bus_space_tag_t         bst;
        bus_space_handle_t      bsh;
        uint32_t                snpsid;
+       uint32_t                snpsversion;
+       uint32_t                snpsrevision;
+       uint32_t                snpsversion_type;
+#ifdef FDT
+       clk_t                   clk_ref;
+       clk_t                   clk_suspend;
+       clk_t                   clk_bus;
+#endif
 };
   #define        DWC3_WRITE(_sc, _off, _val)             \
@@ -384,8 +392,31 @@ snps_dwc3_common_attach(device_t dev, bool is_fdt)
        sc->bsh = rman_get_bushandle(sc->mem_res);
          sc->snpsid = DWC3_READ(sc, DWC3_GSNPSID);
-       if (bootverbose)
-               device_printf(sc->dev, "snps id: %#012x\n", sc->snpsid);
+       sc->snpsversion = DWC3_VERSION(sc->snpsid);
+       sc->snpsrevision = DWC3_REVISION(sc->snpsid);
+       if (sc->snpsversion == DWC3_1_IP_ID ||
+           sc->snpsversion == DWC3_2_IP_ID) {
+               sc->snpsrevision = DWC3_READ(sc, DWC3_1_VER_NUMBER);
+               sc->snpsversion_type = DWC3_READ(sc, DWC3_1_VER_TYPE);
+       }
+       if (bootverbose) {
+               switch (sc->snpsversion) {
+               case DWC3_IP_ID:
+                       device_printf(sc->dev, "SNPS Version: DWC3 (%x %x)\n",
+                           sc->snpsversion, sc->snpsrevision);
+                       break;
+               case DWC3_1_IP_ID:
+                       device_printf(sc->dev, "SNPS Version: DWC3.1 (%x %x %x)\n",
+                           sc->snpsversion, sc->snpsrevision,
+                           sc->snpsversion_type);
+                       break;
+               case DWC3_2_IP_ID:
+                       device_printf(sc->dev, "SNPS Version: DWC3.2 (%x %x %x)\n",
+                           sc->snpsversion, sc->snpsrevision,
+                           sc->snpsversion_type);
+                       break;
+               }
+       }
 #ifdef DWC3_DEBUG
        snps_dwc3_dump_ctrlparams(sc);
 #endif
@@ -394,9 +425,32 @@ snps_dwc3_common_attach(device_t dev, bool is_fdt)
        if (!is_fdt)
                goto skip_phys;
  -       /* Get the phys */
        node = ofw_bus_get_node(dev);
  +       /* Get the clocks if any */
+       if (ofw_bus_is_compatible(dev, "rockchip,rk3328-dwc3") == 1) {
+               if (clk_get_by_ofw_name(dev, node, "ref_clk", &sc->clk_ref) != 0)
+                       device_printf(dev, "Cannot get ref_clk\n");
+               if (clk_get_by_ofw_name(dev, node, "suspend_clk", &sc->clk_suspend) != 0)
+                       device_printf(dev, "Cannot get suspend_clk\n");
+               if (clk_get_by_ofw_name(dev, node, "bus_clk", &sc->clk_bus) != 0)
+                       device_printf(dev, "Cannot get bus_clk\n");
+       }
+
+       if (sc->clk_ref != NULL) {
+               if (clk_enable(sc->clk_ref) != 0)
+                       device_printf(dev, "Cannot enable ref_clk\n");
+       }
+       if (sc->clk_suspend != NULL) {
+               if (clk_enable(sc->clk_suspend) != 0)
+                       device_printf(dev, "Cannot enable suspend_clk\n");
+       }
+       if (sc->clk_bus != NULL) {
+               if (clk_enable(sc->clk_bus) != 0)
+                       device_printf(dev, "Cannot enable bus_clk\n");
+       }
+
+       /* Get the phys */
        usb2_phy = usb3_phy = NULL;
        error = phy_get_by_ofw_name(dev, node, "usb2-phy", &usb2_phy);
        if (error == 0 && usb2_phy != NULL)
@@ -427,6 +481,16 @@ snps_dwc3_common_attach(device_t dev, bool is_fdt)
        snsp_dwc3_dump_regs(sc, "Post XHCI init");
 #endif
  +#ifdef FDT
+       if (error) {
+               if (sc->clk_ref != NULL)
+                       clk_disable(sc->clk_ref);
+               if (sc->clk_suspend != NULL)
+                       clk_disable(sc->clk_suspend);
+               if (sc->clk_bus != NULL)
+                       clk_disable(sc->clk_bus);
+       }
+#endif
        return (error);
 }
  diff --git a/sys/dev/usb/controller/dwc3.h b/sys/dev/usb/controller/dwc3.h
index 21a87a1917ee..c69672072209 100644
--- a/sys/dev/usb/controller/dwc3.h
+++ b/sys/dev/usb/controller/dwc3.h
@@ -31,6 +31,15 @@
 #ifndef _DWC3_H_
 #define        _DWC3_H_
  +#define        DWC3_IP_ID              0x5533
+#define        DWC3_1_IP_ID            0x3331
+#define        DWC3_2_IP_ID            0x3332
+
+#define        DWC3_VERSION_MASK       0xFFFF0000
+#define        DWC3_REVISION_MASK      0xFFFF
+#define        DWC3_VERSION(x)         (((x) & DWC3_VERSION_MASK) >> 16)
+#define        DWC3_REVISION(x)        ((x) & DWC3_REVISION_MASK)
+
 #define        DWC3_GSBUSCFG0          0xc100
 #define        DWC3_GSBUSCFG1          0xc104
 #define        DWC3_GTXTHRCFG          0xc108
@@ -80,6 +89,9 @@
 #define        DWC3_GPRTBIMAP_HSLO     0xc180
 #define        DWC3_GPRTBIMAP_FSLO     0xc188
  +#define        DWC3_1_VER_NUMBER       0xc1a0
+#define        DWC3_1_VER_TYPE         0xc1a4
+
 #define        DWC3_GUSB2PHYCFG0       0xc200
 #define         DWC3_GUSB2PHYCFG0_PHYSOFTRST           (1 << 31)
 #define         DWC3_GUSB2PHYCFG0_U2_FREECLK_EXISTS    (1 << 30)


===
Mark Millard
marklmi at yahoo.com