Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F152513514
D32256.id96068.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
22 KB
Referenced Files
None
Subscribers
None
D32256.id96068.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D32256: USB: split dwc3 (Synopsys) up for FDT and ACPI attachment
Attached
Detach File
Event Timeline
Log In to Comment