Page MenuHomeFreeBSD

D32256.id96068.diff
No OneTemporary

D32256.id96068.diff

Index: sys/conf/files.arm64
===================================================================
--- sys/conf/files.arm64
+++ sys/conf/files.arm64
@@ -283,7 +283,9 @@
dev/uart/uart_dev_pl011.c optional uart pl011
dev/usb/controller/dwc_otg_hisi.c optional dwcotg fdt soc_hisi_hi6220
-dev/usb/controller/dwc3.c optional fdt dwc3
+dev/usb/controller/dwc3.c optional xhci acpi dwc3 | xhci fdt dwc3
+dev/usb/controller/dwc3_acpi.c optional xhci acpi dwc3
+dev/usb/controller/dwc3_fdt.c optional xhci fdt dwc3
dev/usb/controller/ehci_mv.c optional ehci_mv fdt
dev/usb/controller/generic_ehci.c optional ehci
dev/usb/controller/generic_ehci_acpi.c optional ehci acpi
Index: sys/dev/usb/controller/dwc3.h
===================================================================
--- sys/dev/usb/controller/dwc3.h
+++ sys/dev/usb/controller/dwc3.h
@@ -90,6 +90,7 @@
#define DWC3_GUSB3PIPECTL0 0xc2c0
#define DWC3_GUSB3PIPECTL0_PHYSOFTRST (1 << 31)
+#define DWC3_GUSB3PIPECTL0_DISRXDETINP3 (1 << 28)
#define DWC3_GUSB3PIPECTL0_DELAYP1TRANS (1 << 18)
#define DWC3_GTXFIFOSIZ(x) (0xc300 + 0x4 * (x))
@@ -113,4 +114,26 @@
#define DWC3_DGCMD 0xc714
#define DWC3_DALEPENA 0xc720
+struct snps_dwc3_common_softc {
+ struct xhci_softc xsc;
+ device_t dev;
+ struct resource * mem_res;
+ bus_space_tag_t bst;
+ bus_space_handle_t bsh;
+};
+
+#define DWC3_WRITE(_csc, _off, _val) \
+ bus_space_write_4((_csc)->bst, (_csc)->bsh, _off, _val)
+#define DWC3_READ(_csc, _off) \
+ bus_space_read_4((_csc)->bst, (_csc)->bsh, _off)
+
+int snps_dwc3_attach_xhci(struct snps_dwc3_common_softc *);
+#if 0
+void snsp_dwc3_dump_regs(struct snps_dwc3_common_softc *);
+#endif
+void snps_dwc3_reset(struct snps_dwc3_common_softc *);
+void snps_dwc3_configure_host(struct snps_dwc3_common_softc *);
+void snps_dwc3_do_quirks(struct snps_dwc3_common_softc *);
+int snps_dwc3_probe_common(device_t);
+
#endif /* _DWC3_H_ */
Index: sys/dev/usb/controller/dwc3.c
===================================================================
--- sys/dev/usb/controller/dwc3.c
+++ sys/dev/usb/controller/dwc3.c
@@ -2,6 +2,7 @@
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2019 Emmanuel Vadot <manu@FreeBSD.Org>
+ * Copyright (c) 2021 Bjoern A. Zeeb <bz@FreeBSD.ORG>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -25,7 +26,6 @@
* SUCH DAMAGE.
*
* $FreeBSD$
- *
*/
#include <sys/cdefs.h>
@@ -38,16 +38,8 @@
#include <sys/condvar.h>
#include <sys/kernel.h>
#include <sys/module.h>
-#include <sys/gpio.h>
#include <machine/bus.h>
-#include <dev/fdt/simplebus.h>
-
-#include <dev/fdt/fdt_common.h>
-#include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_bus_subr.h>
-#include <dev/ofw/ofw_subr.h>
-
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
@@ -60,85 +52,60 @@
#include <dev/usb/controller/xhci.h>
#include <dev/usb/controller/dwc3.h>
-#include <dev/extres/clk/clk.h>
-#include <dev/extres/phy/phy_usb.h>
-
#include "generic_xhci.h"
-static struct ofw_compat_data compat_data[] = {
- { "snps,dwc3", 1 },
- { NULL, 0 }
-};
-
-struct snps_dwc3_softc {
- struct xhci_softc sc;
- device_t dev;
- char dr_mode[16];
- struct resource * mem_res;
- bus_space_tag_t bst;
- bus_space_handle_t bsh;
- phandle_t node;
- phy_t usb2_phy;
- phy_t usb3_phy;
-};
-
-#define DWC3_WRITE(_sc, _off, _val) \
- bus_space_write_4(_sc->bst, _sc->bsh, _off, _val)
-#define DWC3_READ(_sc, _off) \
- bus_space_read_4(_sc->bst, _sc->bsh, _off)
-
-static int
-snps_dwc3_attach_xhci(device_t dev)
+int
+snps_dwc3_attach_xhci(struct snps_dwc3_common_softc *csc)
{
- struct snps_dwc3_softc *snps_sc = device_get_softc(dev);
- struct xhci_softc *sc = &snps_sc->sc;
+ device_t dev = csc->dev;
+ struct xhci_softc *xsc = &csc->xsc;
int err = 0, rid = 0;
- sc->sc_io_res = snps_sc->mem_res;
- sc->sc_io_tag = snps_sc->bst;
- sc->sc_io_hdl = snps_sc->bsh;
- sc->sc_io_size = rman_get_size(snps_sc->mem_res);
+ xsc->sc_io_res = csc->mem_res;
+ xsc->sc_io_tag = csc->bst;
+ xsc->sc_io_hdl = csc->bsh;
+ xsc->sc_io_size = rman_get_size(csc->mem_res);
- sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
+ xsc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
RF_SHAREABLE | RF_ACTIVE);
- if (sc->sc_irq_res == NULL) {
+ if (xsc->sc_irq_res == NULL) {
device_printf(dev, "Failed to allocate IRQ\n");
return (ENXIO);
}
- sc->sc_bus.bdev = device_add_child(dev, "usbus", -1);
- if (sc->sc_bus.bdev == NULL) {
+ xsc->sc_bus.bdev = device_add_child(dev, "usbus", -1);
+ if (xsc->sc_bus.bdev == NULL) {
device_printf(dev, "Failed to add USB device\n");
return (ENXIO);
}
- device_set_ivars(sc->sc_bus.bdev, &sc->sc_bus);
+ device_set_ivars(xsc->sc_bus.bdev, &xsc->sc_bus);
- sprintf(sc->sc_vendor, "Synopsys");
- device_set_desc(sc->sc_bus.bdev, "Synopsys");
+ sprintf(xsc->sc_vendor, "Synopsys");
+ device_set_desc(xsc->sc_bus.bdev, "Synopsys");
- err = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
- NULL, (driver_intr_t *)xhci_interrupt, sc, &sc->sc_intr_hdl);
+ err = bus_setup_intr(dev, xsc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
+ NULL, (driver_intr_t *)xhci_interrupt, xsc, &xsc->sc_intr_hdl);
if (err != 0) {
device_printf(dev, "Failed to setup IRQ, %d\n", err);
- sc->sc_intr_hdl = NULL;
+ xsc->sc_intr_hdl = NULL;
return (err);
}
- err = xhci_init(sc, dev, 1);
+ err = xhci_init(xsc, dev, 1);
if (err != 0) {
device_printf(dev, "Failed to init XHCI, with error %d\n", err);
return (ENXIO);
}
- err = xhci_start_controller(sc);
+ err = xhci_start_controller(xsc);
if (err != 0) {
device_printf(dev, "Failed to start XHCI controller, with error %d\n", err);
return (ENXIO);
}
- device_printf(sc->sc_bus.bdev, "trying to attach\n");
- err = device_probe_and_attach(sc->sc_bus.bdev);
+ device_printf(xsc->sc_bus.bdev, "trying to attach\n");
+ err = device_probe_and_attach(xsc->sc_bus.bdev);
if (err != 0) {
device_printf(dev, "Failed to initialize USB, with error %d\n", err);
return (ENXIO);
@@ -148,203 +115,115 @@
}
#if 0
-static void
-snsp_dwc3_dump_regs(struct snps_dwc3_softc *sc)
+void
+snsp_dwc3_dump_regs(struct snps_dwc3_common_softc *csc)
{
uint32_t reg;
- reg = DWC3_READ(sc, DWC3_GCTL);
- device_printf(sc->dev, "GCTL: %x\n", reg);
- reg = DWC3_READ(sc, DWC3_GUCTL1);
- device_printf(sc->dev, "GUCTL1: %x\n", reg);
- reg = DWC3_READ(sc, DWC3_GUSB2PHYCFG0);
- device_printf(sc->dev, "GUSB2PHYCFG0: %x\n", reg);
- reg = DWC3_READ(sc, DWC3_GUSB3PIPECTL0);
- device_printf(sc->dev, "GUSB3PIPECTL0: %x\n", reg);
- reg = DWC3_READ(sc, DWC3_DCFG);
- device_printf(sc->dev, "DCFG: %x\n", reg);
+ reg = DWC3_READ(csc, DWC3_GCTL);
+ device_printf(csc->dev, "GCTL: %x\n", reg);
+ reg = DWC3_READ(csc, DWC3_GUCTL1);
+ device_printf(csc->dev, "GUCTL1: %x\n", reg);
+ reg = DWC3_READ(csc, DWC3_GUSB2PHYCFG0);
+ device_printf(csc->dev, "GUSB2PHYCFG0: %x\n", reg);
+ reg = DWC3_READ(csc, DWC3_GUSB3PIPECTL0);
+ device_printf(csc->dev, "GUSB3PIPECTL0: %x\n", reg);
+ reg = DWC3_READ(csc, DWC3_DCFG);
+ device_printf(csc->dev, "DCFG: %x\n", reg);
}
#endif
-static void
-snps_dwc3_reset(struct snps_dwc3_softc *sc)
+void
+snps_dwc3_reset(struct snps_dwc3_common_softc *csc)
{
uint32_t gctl, phy2, phy3;
- if (sc->usb2_phy)
- phy_enable(sc->usb2_phy);
- if (sc->usb3_phy)
- phy_enable(sc->usb3_phy);
-
- gctl = DWC3_READ(sc, DWC3_GCTL);
+ gctl = DWC3_READ(csc, DWC3_GCTL);
gctl |= DWC3_GCTL_CORESOFTRESET;
- DWC3_WRITE(sc, DWC3_GCTL, gctl);
+ DWC3_WRITE(csc, DWC3_GCTL, gctl);
- phy2 = DWC3_READ(sc, DWC3_GUSB2PHYCFG0);
+ phy2 = DWC3_READ(csc, DWC3_GUSB2PHYCFG0);
phy2 |= DWC3_GUSB2PHYCFG0_PHYSOFTRST;
- DWC3_WRITE(sc, DWC3_GUSB2PHYCFG0, phy2);
+ DWC3_WRITE(csc, DWC3_GUSB2PHYCFG0, phy2);
- phy3 = DWC3_READ(sc, DWC3_GUSB3PIPECTL0);
+ phy3 = DWC3_READ(csc, DWC3_GUSB3PIPECTL0);
phy3 |= DWC3_GUSB3PIPECTL0_PHYSOFTRST;
- DWC3_WRITE(sc, DWC3_GUSB3PIPECTL0, phy3);
+ DWC3_WRITE(csc, DWC3_GUSB3PIPECTL0, phy3);
DELAY(1000);
phy2 &= ~DWC3_GUSB2PHYCFG0_PHYSOFTRST;
- DWC3_WRITE(sc, DWC3_GUSB2PHYCFG0, phy2);
+ DWC3_WRITE(csc, DWC3_GUSB2PHYCFG0, phy2);
phy3 &= ~DWC3_GUSB3PIPECTL0_PHYSOFTRST;
- DWC3_WRITE(sc, DWC3_GUSB3PIPECTL0, phy3);
+ DWC3_WRITE(csc, DWC3_GUSB3PIPECTL0, phy3);
gctl &= ~DWC3_GCTL_CORESOFTRESET;
- DWC3_WRITE(sc, DWC3_GCTL, gctl);
-
+ DWC3_WRITE(csc, DWC3_GCTL, gctl);
}
-static void
-snps_dwc3_configure_host(struct snps_dwc3_softc *sc)
+void
+snps_dwc3_configure_host(struct snps_dwc3_common_softc *csc)
{
uint32_t reg;
- reg = DWC3_READ(sc, DWC3_GCTL);
+ reg = DWC3_READ(csc, DWC3_GCTL);
reg &= ~DWC3_GCTL_PRTCAPDIR_MASK;
reg |= DWC3_GCTL_PRTCAPDIR_HOST;
- DWC3_WRITE(sc, DWC3_GCTL, reg);
+ DWC3_WRITE(csc, DWC3_GCTL, reg);
}
-static void
-snps_dwc3_configure_phy(struct snps_dwc3_softc *sc)
+void
+snps_dwc3_do_quirks(struct snps_dwc3_common_softc *csc)
{
- char *phy_type;
uint32_t reg;
- int nphy_types;
-
- phy_type = NULL;
- nphy_types = OF_getprop_alloc(sc->node, "phy_type", (void **)&phy_type);
- if (nphy_types <= 0)
- return;
-
- reg = DWC3_READ(sc, DWC3_GUSB2PHYCFG0);
- if (strncmp(phy_type, "utmi_wide", 9) == 0) {
- reg &= ~(DWC3_GUSB2PHYCFG0_PHYIF | DWC3_GUSB2PHYCFG0_USBTRDTIM(0xf));
- reg |= DWC3_GUSB2PHYCFG0_PHYIF |
- DWC3_GUSB2PHYCFG0_USBTRDTIM(DWC3_GUSB2PHYCFG0_USBTRDTIM_16BITS);
- } else {
- reg &= ~(DWC3_GUSB2PHYCFG0_PHYIF | DWC3_GUSB2PHYCFG0_USBTRDTIM(0xf));
- reg |= DWC3_GUSB2PHYCFG0_PHYIF |
- DWC3_GUSB2PHYCFG0_USBTRDTIM(DWC3_GUSB2PHYCFG0_USBTRDTIM_8BITS);
- }
- DWC3_WRITE(sc, DWC3_GUSB2PHYCFG0, reg);
- OF_prop_free(phy_type);
-}
-static void
-snps_dwc3_do_quirks(struct snps_dwc3_softc *sc)
-{
- uint32_t reg;
-
- reg = DWC3_READ(sc, DWC3_GUSB2PHYCFG0);
- if (OF_hasprop(sc->node, "snps,dis-u2-freeclk-exists-quirk"))
+ reg = DWC3_READ(csc, DWC3_GUSB2PHYCFG0);
+ if (device_has_property(csc->dev, "snps,dis-u2-freeclk-exists-quirk"))
reg &= ~DWC3_GUSB2PHYCFG0_U2_FREECLK_EXISTS;
else
reg |= DWC3_GUSB2PHYCFG0_U2_FREECLK_EXISTS;
- if (OF_hasprop(sc->node, "snps,dis_u2_susphy_quirk"))
+ if (device_has_property(csc->dev, "snps,dis_u2_susphy_quirk"))
reg &= ~DWC3_GUSB2PHYCFG0_SUSPENDUSB20;
else
reg |= DWC3_GUSB2PHYCFG0_SUSPENDUSB20;
- if (OF_hasprop(sc->node, "snps,dis_enblslpm_quirk"))
+ if (device_has_property(csc->dev, "snps,dis_enblslpm_quirk"))
reg &= ~DWC3_GUSB2PHYCFG0_ENBLSLPM;
else
reg |= DWC3_GUSB2PHYCFG0_ENBLSLPM;
- DWC3_WRITE(sc, DWC3_GUSB2PHYCFG0, reg);
+ DWC3_WRITE(csc, DWC3_GUSB2PHYCFG0, reg);
- reg = DWC3_READ(sc, DWC3_GUCTL1);
- if (OF_hasprop(sc->node, "snps,dis-tx-ipgap-linecheck-quirk"))
+ reg = DWC3_READ(csc, DWC3_GUCTL1);
+ if (device_has_property(csc->dev, "snps,dis-tx-ipgap-linecheck-quirk"))
reg |= DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS;
- DWC3_WRITE(sc, DWC3_GUCTL1, reg);
+ DWC3_WRITE(csc, DWC3_GUCTL1, reg);
- if (OF_hasprop(sc->node, "snps,dis-del-phy-power-chg-quirk")) {
- reg = DWC3_READ(sc, DWC3_GUSB3PIPECTL0);
+ reg = DWC3_READ(csc, DWC3_GUSB3PIPECTL0);
+ if (device_has_property(csc->dev, "snps,dis-del-phy-power-chg-quirk"))
reg |= DWC3_GUSB3PIPECTL0_DELAYP1TRANS;
- DWC3_WRITE(sc, DWC3_GUSB3PIPECTL0, reg);
- }
+ if (device_has_property(csc->dev, "snps,dis_rxdet_inp3_quirk"))
+ reg |= DWC3_GUSB3PIPECTL0_DISRXDETINP3;
+ DWC3_WRITE(csc, DWC3_GUSB3PIPECTL0, reg);
}
-static int
-snps_dwc3_probe(device_t dev)
+int
+snps_dwc3_probe_common(device_t dev)
{
- struct snps_dwc3_softc *sc;
-
- if (!ofw_bus_status_okay(dev))
- return (ENXIO);
+ char dr_mode[16];
+ ssize_t s;
- if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
+ s = device_get_property(dev, "dr_mode", dr_mode, sizeof(dr_mode));
+ if (s == -1) {
+ device_printf(dev, "Cannot determine dr_mode\n");
return (ENXIO);
-
- sc = device_get_softc(dev);
- sc->node = ofw_bus_get_node(dev);
- OF_getprop(sc->node, "dr_mode", sc->dr_mode, sizeof(sc->dr_mode));
- if (strcmp(sc->dr_mode, "host") != 0) {
- device_printf(dev, "Only host mode is supported\n");
+ }
+ if (strcmp(dr_mode, "host") != 0) {
+ device_printf(dev, "Found dr_mode '%s' but only "
+ "'host' supported.\n", dr_mode);
return (ENXIO);
}
device_set_desc(dev, "Synopsys Designware DWC3");
return (BUS_PROBE_DEFAULT);
}
-
-static int
-snps_dwc3_attach(device_t dev)
-{
- struct snps_dwc3_softc *sc;
- int rid = 0;
-
- sc = device_get_softc(dev);
- sc->dev = dev;
-
- sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
- RF_ACTIVE);
- if (sc->mem_res == NULL) {
- device_printf(dev, "Failed to map memory\n");
- return (ENXIO);
- }
- sc->bst = rman_get_bustag(sc->mem_res);
- sc->bsh = rman_get_bushandle(sc->mem_res);
-
- if (bootverbose)
- device_printf(dev, "snps id: %x\n", DWC3_READ(sc, DWC3_GSNPSID));
-
- /* Get the phys */
- phy_get_by_ofw_name(dev, sc->node, "usb2-phy", &sc->usb2_phy);
- phy_get_by_ofw_name(dev, sc->node, "usb3-phy", &sc->usb3_phy);
-
- snps_dwc3_reset(sc);
- snps_dwc3_configure_host(sc);
- snps_dwc3_configure_phy(sc);
- snps_dwc3_do_quirks(sc);
-#if 0
- snsp_dwc3_dump_regs(sc);
-#endif
- snps_dwc3_attach_xhci(dev);
-
- return (0);
-}
-
-static device_method_t snps_dwc3_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, snps_dwc3_probe),
- DEVMETHOD(device_attach, snps_dwc3_attach),
-
- DEVMETHOD_END
-};
-
-static driver_t snps_dwc3_driver = {
- "xhci",
- snps_dwc3_methods,
- sizeof(struct snps_dwc3_softc)
-};
-
-static devclass_t snps_dwc3_devclass;
-DRIVER_MODULE(snps_dwc3, simplebus, snps_dwc3_driver, snps_dwc3_devclass, 0, 0);
-MODULE_DEPEND(snps_dwc3, xhci, 1, 1, 1);
Index: sys/dev/usb/controller/dwc3_acpi.c
===================================================================
--- /dev/null
+++ sys/dev/usb/controller/dwc3_acpi.c
@@ -0,0 +1,141 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2019 Emmanuel Vadot <manu@FreeBSD.Org>
+ * Copyright (c) 2021 Bjoern A. Zeeb <bz@FreeBSD.ORG>
+ *
+ * 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 AUTHOR 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 AUTHOR 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.
+ *
+ * $FreeBSD$
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_acpi.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+#include <sys/condvar.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/gpio.h>
+#include <machine/bus.h>
+
+#include <contrib/dev/acpica/include/acpi.h>
+#include <contrib/dev/acpica/include/accommon.h>
+
+#include <dev/acpica/acpivar.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+
+#include <dev/usb/usb_core.h>
+#include <dev/usb/usb_busdma.h>
+#include <dev/usb/usb_process.h>
+
+#include <dev/usb/usb_controller.h>
+#include <dev/usb/usb_bus.h>
+#include <dev/usb/controller/xhci.h>
+#include <dev/usb/controller/dwc3.h>
+
+#include "generic_xhci.h"
+
+#define IS_DMA_32B 1
+
+struct snps_dwc3_acpi_softc {
+ struct snps_dwc3_common_softc csc;
+};
+
+static char *dwc3_acpi_ids[] = {
+ "808622B7",
+ NULL
+};
+
+static int
+snps_dwc3_acpi_probe(device_t dev)
+{
+ int rc;
+
+ if (acpi_disabled("snps_dwc3"))
+ return (ENXIO);
+
+ rc = ACPI_ID_PROBE(device_get_parent(dev), dev, dwc3_acpi_ids, NULL);
+ if (rc > 0)
+ return (rc);
+
+ return (snps_dwc3_probe_common(dev));
+}
+
+static int
+snps_dwc3_acpi_attach(device_t dev)
+{
+ struct snps_dwc3_acpi_softc *sc;
+ struct snps_dwc3_common_softc *csc;
+ int rid = 0;
+
+ sc = device_get_softc(dev);
+ csc = &sc->csc;
+ csc->dev = dev;
+
+ csc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
+ RF_ACTIVE);
+ if (csc->mem_res == NULL) {
+ device_printf(dev, "Failed to map memory\n");
+ return (ENXIO);
+ }
+ csc->bst = rman_get_bustag(csc->mem_res);
+ csc->bsh = rman_get_bushandle(csc->mem_res);
+
+ if (bootverbose)
+ device_printf(dev, "snps id: %x\n", DWC3_READ(csc, DWC3_GSNPSID));
+
+ snps_dwc3_reset(csc);
+ snps_dwc3_configure_host(csc);
+ snps_dwc3_do_quirks(csc);
+#if 0
+ snsp_dwc3_dump_regs(csc);
+#endif
+ snps_dwc3_attach_xhci(csc);
+
+ return (0);
+}
+
+static device_method_t snps_dwc3_acpi_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, snps_dwc3_acpi_probe),
+ DEVMETHOD(device_attach, snps_dwc3_acpi_attach),
+
+ DEVMETHOD_END
+};
+
+DEFINE_CLASS_1(xhci, snps_dwc3_acpi_driver, snps_dwc3_acpi_methods,
+ sizeof(struct snps_dwc3_acpi_softc), generic_xhci_driver);
+
+static devclass_t snps_dwc3_acpi_devclass;
+
+DRIVER_MODULE(snps_dwc3_acpi, acpi, snps_dwc3_acpi_driver,
+ snps_dwc3_acpi_devclass, 0, 0);
+MODULE_DEPEND(snps_dwc3_acpi, usb, 1, 1, 1);
Index: sys/dev/usb/controller/dwc3_fdt.c
===================================================================
--- /dev/null
+++ sys/dev/usb/controller/dwc3_fdt.c
@@ -0,0 +1,181 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2019 Emmanuel Vadot <manu@FreeBSD.Org>
+ *
+ * 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 AUTHOR 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 AUTHOR 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.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+#include <sys/condvar.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/gpio.h>
+#include <machine/bus.h>
+
+#include <dev/fdt/simplebus.h>
+
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_subr.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+
+#include <dev/usb/usb_core.h>
+#include <dev/usb/usb_busdma.h>
+#include <dev/usb/usb_process.h>
+
+#include <dev/usb/usb_controller.h>
+#include <dev/usb/usb_bus.h>
+#include <dev/usb/controller/xhci.h>
+#include <dev/usb/controller/dwc3.h>
+
+#include <dev/extres/clk/clk.h>
+#include <dev/extres/phy/phy_usb.h>
+
+#include "generic_xhci.h"
+
+static struct ofw_compat_data compat_data[] = {
+ { "snps,dwc3", 1 },
+ { NULL, 0 }
+};
+
+struct snps_dwc3_fdt_softc {
+ struct snps_dwc3_common_softc csc;
+ phandle_t node;
+ phy_t usb2_phy;
+ phy_t usb3_phy;
+};
+
+static void
+snps_dwc3_configure_phy(struct snps_dwc3_fdt_softc *sc)
+{
+ char *phy_type;
+ uint32_t reg;
+ int nphy_types;
+
+ phy_type = NULL;
+ nphy_types = OF_getprop_alloc(sc->node, "phy_type", (void **)&phy_type);
+ if (nphy_types <= 0)
+ return;
+
+ reg = DWC3_READ(&sc->csc, DWC3_GUSB2PHYCFG0);
+ if (strncmp(phy_type, "utmi_wide", 9) == 0) {
+ reg &= ~(DWC3_GUSB2PHYCFG0_PHYIF | DWC3_GUSB2PHYCFG0_USBTRDTIM(0xf));
+ reg |= DWC3_GUSB2PHYCFG0_PHYIF |
+ DWC3_GUSB2PHYCFG0_USBTRDTIM(DWC3_GUSB2PHYCFG0_USBTRDTIM_16BITS);
+ } else {
+ reg &= ~(DWC3_GUSB2PHYCFG0_PHYIF | DWC3_GUSB2PHYCFG0_USBTRDTIM(0xf));
+ reg |= DWC3_GUSB2PHYCFG0_PHYIF |
+ DWC3_GUSB2PHYCFG0_USBTRDTIM(DWC3_GUSB2PHYCFG0_USBTRDTIM_8BITS);
+ }
+ DWC3_WRITE(&sc->csc, DWC3_GUSB2PHYCFG0, reg);
+ OF_prop_free(phy_type);
+}
+
+static int
+snps_dwc3_fdt_probe(device_t dev)
+{
+
+ if (!ofw_bus_status_okay(dev))
+ return (ENXIO);
+
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
+ return (ENXIO);
+
+ return (snps_dwc3_probe_common(dev));
+}
+
+static int
+snps_dwc3_fdt_attach(device_t dev)
+{
+ struct snps_dwc3_fdt_softc *sc;
+ struct snps_dwc3_common_softc *csc;
+ int rid = 0;
+
+ sc = device_get_softc(dev);
+ csc = &sc->csc;
+ csc->dev = dev;
+
+ csc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
+ RF_ACTIVE);
+ if (csc->mem_res == NULL) {
+ device_printf(dev, "Failed to map memory\n");
+ return (ENXIO);
+ }
+ csc->bst = rman_get_bustag(csc->mem_res);
+ csc->bsh = rman_get_bushandle(csc->mem_res);
+
+ if (bootverbose)
+ device_printf(dev, "snps id: %x\n", DWC3_READ(csc, DWC3_GSNPSID));
+
+ sc->node = ofw_bus_get_node(dev);
+
+ /* Get the phys */
+ phy_get_by_ofw_name(dev, sc->node, "usb2-phy", &sc->usb2_phy);
+ phy_get_by_ofw_name(dev, sc->node, "usb3-phy", &sc->usb3_phy);
+
+ if (sc->usb2_phy)
+ phy_enable(sc->usb2_phy);
+ if (sc->usb3_phy)
+ phy_enable(sc->usb3_phy);
+
+ snps_dwc3_reset(csc);
+ snps_dwc3_configure_host(csc);
+ snps_dwc3_configure_phy(sc);
+ snps_dwc3_do_quirks(csc);
+#if 0
+ snsp_dwc3_dump_regs(csc);
+#endif
+ snps_dwc3_attach_xhci(csc);
+
+ return (0);
+}
+
+static device_method_t snps_dwc3_fdt_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, snps_dwc3_fdt_probe),
+ DEVMETHOD(device_attach, snps_dwc3_fdt_attach),
+
+ DEVMETHOD_END
+};
+
+static driver_t snps_dwc3_fdt_driver = {
+ "xhci",
+ snps_dwc3_fdt_methods,
+ sizeof(struct snps_dwc3_fdt_softc)
+};
+
+static devclass_t snps_dwc3_fdt_devclass;
+DRIVER_MODULE(snps_dwc3_fdt, simplebus, snps_dwc3_fdt_driver,
+ snps_dwc3_fdt_devclass, 0, 0);
+MODULE_DEPEND(snps_dwc3_fdt, xhci, 1, 1, 1);

File Metadata

Mime Type
text/plain
Expires
Thu, Apr 16, 10:42 AM (14 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31596811
Default Alt Text
D32256.id96068.diff (22 KB)

Event Timeline