Module Name: src
Committed By: skrll
Date: Thu Jan 18 07:48:57 UTC 2024
Modified Files:
src/sys/arch/riscv/conf: GENERIC64
src/sys/arch/riscv/starfive: files.starfive
src/sys/dev/fdt: files.fdt
Added Files:
src/sys/arch/riscv/starfive: jh71x0_usb.c
src/sys/dev/fdt: cdns3_fdt.c
Log Message:
risc-v: attach the Cadence XHCI usb controller on the JH7100 SoC
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/riscv/conf/GENERIC64
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/riscv/starfive/files.starfive
cvs rdiff -u -r0 -r1.1 src/sys/arch/riscv/starfive/jh71x0_usb.c
cvs rdiff -u -r0 -r1.1 src/sys/dev/fdt/cdns3_fdt.c
cvs rdiff -u -r1.71 -r1.72 src/sys/dev/fdt/files.fdt
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/riscv/conf/GENERIC64
diff -u src/sys/arch/riscv/conf/GENERIC64:1.3 src/sys/arch/riscv/conf/GENERIC64:1.4
--- src/sys/arch/riscv/conf/GENERIC64:1.3 Tue Jan 16 09:06:46 2024
+++ src/sys/arch/riscv/conf/GENERIC64 Thu Jan 18 07:48:56 2024
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC64,v 1.3 2024/01/16 09:06:46 skrll Exp $
+# $NetBSD: GENERIC64,v 1.4 2024/01/18 07:48:56 skrll Exp $
#
# GENERIC machine description file
#
@@ -52,5 +52,14 @@ ccache* at fdt? # SiFive FU[57]40 L2
# Clock controller
jh7100clkc* at fdt? pass 2 # StarFive JH7100 clock controller
+# USB
+jh71x0usb* at fdt? # StarFive JH71x0 usb
+
+# USB
+xhci* at fdt? # XHCI
+usb* at usbus?
+include "dev/usb/usbdevices.config"
+midi* at midibus?
+
# Pull in optional local configuration - always at end
cinclude "arch/riscv/conf/GENERIC64.local"
Index: src/sys/arch/riscv/starfive/files.starfive
diff -u src/sys/arch/riscv/starfive/files.starfive:1.1 src/sys/arch/riscv/starfive/files.starfive:1.2
--- src/sys/arch/riscv/starfive/files.starfive:1.1 Tue Jan 16 09:06:46 2024
+++ src/sys/arch/riscv/starfive/files.starfive Thu Jan 18 07:48:57 2024
@@ -1,4 +1,4 @@
-# $NetBSD: files.starfive,v 1.1 2024/01/16 09:06:46 skrll Exp $
+# $NetBSD: files.starfive,v 1.2 2024/01/18 07:48:57 skrll Exp $
#
# Configuration info for StarFive SoCs
#
@@ -8,3 +8,7 @@ device jh7100clkc
attach jh7100clkc at fdt with jh7100_clkc
file arch/riscv/starfive/jh7100_clkc.c jh7100_clkc
+# JH71x0 USB
+device jh71x0usb
+attach jh71x0usb at fdt with jh71x0_usb
+file arch/riscv/starfive/jh71x0_usb.c jh71x0_usb
Index: src/sys/dev/fdt/files.fdt
diff -u src/sys/dev/fdt/files.fdt:1.71 src/sys/dev/fdt/files.fdt:1.72
--- src/sys/dev/fdt/files.fdt:1.71 Fri Dec 29 23:31:44 2023
+++ src/sys/dev/fdt/files.fdt Thu Jan 18 07:48:57 2024
@@ -1,4 +1,4 @@
-# $NetBSD: files.fdt,v 1.71 2023/12/29 23:31:44 thorpej Exp $
+# $NetBSD: files.fdt,v 1.72 2024/01/18 07:48:57 skrll Exp $
include "external/bsd/libfdt/conf/files.libfdt"
@@ -150,6 +150,10 @@ file dev/fdt/ehci_fdt.c ehci_fdt
attach ohci at fdt with ohci_fdt
file dev/fdt/ohci_fdt.c ohci_fdt
+# Cadence USB3 XHCI
+attach xhci at fdt with cdns3_fdt
+file dev/fdt/cdns3_fdt.c cdns3_fdt
+
# Designware USB2 OTG
attach dwctwo at fdt with dwc2_fdt
file dev/fdt/dwc2_fdt.c dwc2_fdt
Added files:
Index: src/sys/arch/riscv/starfive/jh71x0_usb.c
diff -u /dev/null src/sys/arch/riscv/starfive/jh71x0_usb.c:1.1
--- /dev/null Thu Jan 18 07:48:57 2024
+++ src/sys/arch/riscv/starfive/jh71x0_usb.c Thu Jan 18 07:48:57 2024
@@ -0,0 +1,247 @@
+/* $NetBSD: jh71x0_usb.c,v 1.1 2024/01/18 07:48:57 skrll Exp $ */
+
+/*-
+ * Copyright (c) 2023 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Nick Hudson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: jh71x0_usb.c,v 1.1 2024/01/18 07:48:57 skrll Exp $");
+
+#include <sys/param.h>
+
+
+#include <dev/fdt/fdtvar.h>
+#include <dev/fdt/syscon.h>
+
+struct jh71x0_usb_softc {
+ device_t sc_dev;
+ bus_space_tag_t sc_bst;
+ bus_space_handle_t sc_bsh;
+ int sc_phandle;
+
+ int sc_syscon_phandle;
+ const struct syscon *sc_syscon;
+};
+
+
+#define RD4(sc, reg) \
+ bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, (reg))
+#define WR4(sc, reg, val) \
+ bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, (reg), (val))
+
+
+/* Register definitions */
+
+#define JH7100_USB0 0x20
+#define JH7100_USB0_MODE_STRAP_MASK __BITS(2, 0)
+#define JH7100_USB0_MODE_STRAP_HOST 2
+
+#define JH7100_USB3 0x2c
+#define JH7100_USB3_UTMI_IDDIG __BIT(21)
+
+#define JH7100_USB7 0x3c
+#define JH7100_USB7_SSRX_SEL __BIT(18)
+#define JH7100_USB7_SSTX_SEL __BIT(19)
+#define JH7100_USB7_PLL_EN __BIT(23)
+#define JH7100_USB7_EQ_EN __BIT(25)
+
+#define JH7110_STRAP_HOST __BIT(17)
+#define JH7110_STRAP_DEVICE __BIT(18)
+#define JH7110_STRAP_MASK __BITS(18, 16)
+
+#define JH7110_SUSPENDM_HOST __BIT(19)
+#define JH7110_SUSPENDM_MASK __BIT(19)
+
+#define JH7110_MISC_CFG_MASK __BITS(23, 20)
+#define JH7110_SUSPENDM_BYPS __BIT(20)
+#define JH7110_PLL_EN __BIT(22)
+#define JH7110_REFCLK_MODE __BIT(23)
+
+
+
+enum usb_dr_mode {
+ USB_DR_MODE_UNKNOWN,
+ USB_DR_MODE_HOST,
+ USB_DR_MODE_PERIPHERAL,
+ USB_DR_MODE_OTG,
+};
+
+static inline void
+jh71x0_syscon_update(struct jh71x0_usb_softc *sc, bus_size_t off,
+ uint32_t clr, uint32_t set)
+{
+ syscon_lock(sc->sc_syscon);
+ const uint32_t old = syscon_read_4(sc->sc_syscon, off);
+ const uint32_t new = (old & ~clr) | set;
+ if (old != new) {
+ syscon_write_4(sc->sc_syscon, off, new);
+ }
+ syscon_unlock(sc->sc_syscon);
+}
+
+static int
+jh7100_usb_init(struct jh71x0_usb_softc *sc, const u_int *syscon_data )
+{
+ enum usb_dr_mode mode = USB_DR_MODE_HOST;
+
+ switch (mode) {
+ case USB_DR_MODE_HOST:
+ jh71x0_syscon_update(sc, JH7100_USB0,
+ JH7100_USB0_MODE_STRAP_MASK, JH7100_USB0_MODE_STRAP_HOST);
+ jh71x0_syscon_update(sc, JH7100_USB7,
+ JH7100_USB7_PLL_EN, JH7100_USB7_PLL_EN);
+ jh71x0_syscon_update(sc, JH7100_USB7,
+ JH7100_USB7_EQ_EN, JH7100_USB7_EQ_EN);
+ jh71x0_syscon_update(sc, JH7100_USB7,
+ JH7100_USB7_SSRX_SEL, JH7100_USB7_SSRX_SEL);
+ jh71x0_syscon_update(sc, JH7100_USB7,
+ JH7100_USB7_SSTX_SEL, JH7100_USB7_SSTX_SEL);
+ jh71x0_syscon_update(sc, JH7100_USB3,
+ JH7100_USB3_UTMI_IDDIG, JH7100_USB3_UTMI_IDDIG);
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static int
+jh7110_usb_init(struct jh71x0_usb_softc *sc, const u_int *syscon_data)
+{
+ enum usb_dr_mode mode = USB_DR_MODE_HOST;
+ bus_size_t usb_mode = be32dec(&syscon_data[1]);
+
+ jh71x0_syscon_update(sc, usb_mode, JH7110_MISC_CFG_MASK,
+ JH7110_SUSPENDM_BYPS | JH7110_PLL_EN | JH7110_REFCLK_MODE);
+
+ switch (mode) {
+ case USB_DR_MODE_HOST:
+ jh71x0_syscon_update(sc, usb_mode, JH7110_STRAP_MASK, JH7110_STRAP_HOST);
+ jh71x0_syscon_update(sc, usb_mode, JH7110_SUSPENDM_MASK, JH7110_SUSPENDM_HOST);
+ break;
+
+ case USB_DR_MODE_PERIPHERAL:
+ jh71x0_syscon_update(sc, usb_mode, JH7110_STRAP_MASK, JH7110_STRAP_DEVICE);
+ jh71x0_syscon_update(sc, usb_mode, JH7110_SUSPENDM_MASK, 0);
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+struct jh71x0_usb_config {
+ int (*jhuc_init)(struct jh71x0_usb_softc *, const u_int *);
+ const char *jhuc_syscon;
+ size_t jhuc_sclen;
+};
+
+struct jh71x0_usb_config jh7100_usb_data = {
+ .jhuc_init = jh7100_usb_init,
+ .jhuc_syscon = "starfive,syscon",
+ .jhuc_sclen = 1 * sizeof(uint32_t),
+};
+
+struct jh71x0_usb_config jh7110_usb_data = {
+ .jhuc_init = jh7110_usb_init,
+ .jhuc_syscon = "starfive,stg-syscon",
+ .jhuc_sclen = 2 * sizeof(uint32_t),
+};
+
+/* Compat string(s) */
+static const struct device_compatible_entry compat_data[] = {
+ { .compat = "starfive,jh7100-usb", .data = &jh7100_usb_data },
+ { .compat = "starfive,jh7110-usb", .data = &jh7110_usb_data },
+ DEVICE_COMPAT_EOL
+};
+
+static int
+jh71x0_usb_match(device_t parent, cfdata_t cf, void *aux)
+{
+ struct fdt_attach_args * const faa = aux;
+
+ return of_compatible_match(faa->faa_phandle, compat_data);
+}
+
+static void
+jh71x0_usb_attach(device_t parent, device_t self, void *aux)
+{
+ struct jh71x0_usb_softc *sc = device_private(self);
+ struct fdt_attach_args * const faa = aux;
+ const int phandle = faa->faa_phandle;
+
+ sc->sc_dev = self;
+ sc->sc_phandle = phandle;
+ sc->sc_bst = faa->faa_bst;
+
+ const struct jh71x0_usb_config *jhuc =
+ of_compatible_lookup(sc->sc_phandle, compat_data)->data;
+
+ int len;
+ const u_int *syscon_data =
+ fdtbus_get_prop(phandle, jhuc->jhuc_syscon, &len);
+ if (syscon_data == NULL) {
+ aprint_error(": couldn't get '%s' property\n",
+ jhuc->jhuc_syscon);
+ return;
+ }
+ if (len != jhuc->jhuc_sclen) {
+ aprint_error(": incorrect syscon data (len = %u)\n",
+ len);
+ return;
+ }
+
+ int syscon_phandle =
+ fdtbus_get_phandle_from_native(be32dec(&syscon_data[0]));
+
+ sc->sc_syscon = fdtbus_syscon_lookup(syscon_phandle);
+ if (sc->sc_syscon == NULL) {
+ aprint_error(": couldn't get syscon\n");
+ return;
+ }
+
+ jhuc->jhuc_init(sc, syscon_data);
+
+ aprint_naive("\n");
+ aprint_normal(": USB\n");
+
+ for (int child = OF_child(phandle); child; child = OF_peer(child)) {
+ if (!fdtbus_status_okay(child))
+ continue;
+ fdt_add_child(parent, child, faa, 0);
+ }
+
+ //fdtbus_register_phy_controller(self, phandle, &XXX_usbphy_funcs);
+
+}
+
+
+CFATTACH_DECL_NEW(jh71x0_usb, sizeof(struct jh71x0_usb_softc),
+ jh71x0_usb_match, jh71x0_usb_attach, NULL, NULL);
Index: src/sys/dev/fdt/cdns3_fdt.c
diff -u /dev/null src/sys/dev/fdt/cdns3_fdt.c:1.1
--- /dev/null Thu Jan 18 07:48:57 2024
+++ src/sys/dev/fdt/cdns3_fdt.c Thu Jan 18 07:48:57 2024
@@ -0,0 +1,210 @@
+/* $NetBSD: cdns3_fdt.c,v 1.1 2024/01/18 07:48:57 skrll Exp $ */
+
+/*-
+ * Copyright (c) 2023 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Nick Hudson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: cdns3_fdt.c,v 1.1 2024/01/18 07:48:57 skrll Exp $");
+
+#include <sys/param.h>
+
+#include <sys/bus.h>
+#include <sys/device.h>
+#include <sys/intr.h>
+
+#include <dev/usb/xhcireg.h>
+#include <dev/usb/xhcivar.h>
+
+#include <dev/fdt/fdtvar.h>
+
+struct cdns3_fdt_softc {
+ struct xhci_softc sc_xhci;
+ bus_space_tag_t sc_otg_bst;
+ bus_space_handle_t sc_otg_bsh;
+ void *sc_ih;
+};
+
+#define OTGRD4(sc, reg) \
+ bus_space_read_4((sc)->sc_otg_bst, (sc)->sc_otg_bsh, (reg))
+#define OTGWR4(sc, reg, val) \
+ bus_space_write_4((sc)->sc_otg_bst, (sc)->sc_otg_bsh, (reg), (val))
+
+
+/*
+ * Cadence USB3 controller.
+ */
+
+#define OTG_DID 0x0000
+#define OTG_DID_V1 0x4024e
+#define OTG_CMD 0x10
+#define OTG_CMD_HOST_BUS_REQ __BIT(1)
+#define OTG_CMD_OTG_DIS __BIT(3)
+#define OTG_STS 0x14
+#define OTG_STS_XHCI_READY __BIT(26)
+
+
+static const struct device_compatible_entry compat_data[] = {
+ { .compat = "cdns,usb3" },
+ DEVICE_COMPAT_EOL
+};
+
+static int
+cdns3_fdt_match(device_t parent, cfdata_t cf, void *aux)
+{
+ struct fdt_attach_args * const faa = aux;
+
+ return of_compatible_match(faa->faa_phandle, compat_data);
+}
+
+static void
+cdns3_fdt_attach(device_t parent, device_t self, void *aux)
+{
+ struct cdns3_fdt_softc * const cfsc = device_private(self);
+ struct xhci_softc * const sc = &cfsc->sc_xhci;
+ struct fdt_attach_args * const faa = aux;
+ const int phandle = faa->faa_phandle;
+
+ struct fdtbus_phy *phy;
+ char intrstr[128];
+ bus_addr_t addr;
+ bus_size_t size;
+ int error;
+
+ /*
+ * Only host mode is supported, but this includes otg devices
+ * that have 'usb-role-switch' and 'role-switch-default-mode' of
+ * 'host'
+ */
+ const char *dr_mode = fdtbus_get_string(phandle, "dr_mode");
+ if (dr_mode == NULL || strcmp(dr_mode, "otg") == 0) {
+ bool ok = false;
+ if (of_hasprop(phandle, "usb-role-switch")) {
+ const char *rsdm = fdtbus_get_string(phandle,
+ "role-switch-default-mode");
+ if (rsdm != NULL && strcmp(rsdm, "host") == 0)
+ ok = true;
+
+ if (!ok) {
+ aprint_error(": host is not default mode\n");
+ return;
+ }
+ }
+ if (!ok) {
+ aprint_error(": cannot switch 'otg' mode to host\n");
+ return;
+ }
+ } else if (strcmp(dr_mode, "host") != 0) {
+ aprint_error(": '%s' not supported\n", dr_mode);
+ return;
+ }
+
+ sc->sc_dev = self;
+ sc->sc_bus.ub_hcpriv = sc;
+ sc->sc_bus.ub_dmatag = faa->faa_dmat;
+ sc->sc_iot = faa->faa_bst;
+
+ bus_space_handle_t bsh;
+ if (fdtbus_get_reg_byname(phandle, "otg", &addr, &size) != 0 ||
+ bus_space_map(faa->faa_bst, addr, size, 0, &bsh) != 0) {
+ aprint_error(": couldn't map otg registers\n");
+ return;
+ }
+ cfsc->sc_otg_bst = faa->faa_bst;
+ cfsc->sc_otg_bsh = bsh;
+
+ if (fdtbus_get_reg_byname(phandle, "xhci", &addr, &size) != 0 ||
+ bus_space_map(faa->faa_bst, addr, size, 0, &bsh) != 0) {
+ aprint_error(": couldn't map xhci registers\n");
+ return;
+ }
+
+ sc->sc_ios = size;
+ sc->sc_ioh = bsh;
+
+ uint32_t did = OTGRD4(cfsc, OTG_DID);
+ if (did != OTG_DID_V1) {
+ aprint_error(": unsupported IP (%#x)\n", did);
+ return;
+ }
+ OTGWR4(cfsc, OTG_CMD, OTG_CMD_HOST_BUS_REQ | OTG_CMD_OTG_DIS);
+ int tries;
+ uint32_t sts;
+ for (tries = 100; tries > 0; tries--) {
+ sts = OTGRD4(cfsc, OTG_STS);
+ if (sts & OTG_STS_XHCI_READY)
+ break;
+ delay(1000);
+ }
+ if (tries == 0) {
+ aprint_error(": not ready (%#x)\n", sts);
+ return;
+ }
+
+ aprint_naive("\n");
+ aprint_normal(": Cadence USB3 XHCI\n");
+
+ /* Enable PHY devices */
+ for (u_int i = 0; ; i++) {
+ phy = fdtbus_phy_get_index(phandle, i);
+ if (phy == NULL)
+ break;
+ if (fdtbus_phy_enable(phy, true) != 0)
+ aprint_error_dev(self, "couldn't enable phy #%d\n", i);
+ }
+
+ if (!fdtbus_intr_str(phandle, 0, intrstr, sizeof(intrstr))) {
+ aprint_error_dev(self, "failed to decode interrupt\n");
+ return;
+ }
+
+ void *ih = fdtbus_intr_establish_xname(phandle, 0, IPL_USB,
+ FDT_INTR_MPSAFE, xhci_intr, sc, device_xname(self));
+ if (ih == NULL) {
+ aprint_error_dev(self, "couldn't establish interrupt on %s\n",
+ intrstr);
+ return;
+ }
+ aprint_normal_dev(self, "interrupting on %s\n", intrstr);
+
+ sc->sc_bus.ub_revision = USBREV_3_0;
+ error = xhci_init(sc);
+ if (error) {
+ aprint_error_dev(self, "init failed, error = %d\n", error);
+ return;
+ }
+
+ sc->sc_child = config_found(self, &sc->sc_bus, usbctlprint, CFARGS_NONE);
+ sc->sc_child2 = config_found(self, &sc->sc_bus2, usbctlprint,
+ CFARGS_NONE);
+}
+
+
+CFATTACH_DECL2_NEW(cdns3_fdt, sizeof(struct cdns3_fdt_softc),
+ cdns3_fdt_match, cdns3_fdt_attach, NULL,
+ xhci_activate, NULL, xhci_childdet);