svn commit: r264642 - in head/sys: dev/usb/controller modules/usb/dwc_otg
Hans Petter Selasky
hselasky at FreeBSD.org
Fri Apr 18 08:31:57 UTC 2014
Author: hselasky
Date: Fri Apr 18 08:31:55 2014
New Revision: 264642
URL: http://svnweb.freebsd.org/changeset/base/264642
Log:
Add support for specifying USB controller mode via FDT.
Add FDT support to the DWC OTG kernel module.
Submitted by: John Wehle <john at feith.com>
PR: usb/188683
MFC after: 1 week
Modified:
head/sys/dev/usb/controller/dwc_otg.c
head/sys/dev/usb/controller/dwc_otg_fdt.c
head/sys/modules/usb/dwc_otg/Makefile
Modified: head/sys/dev/usb/controller/dwc_otg.c
==============================================================================
--- head/sys/dev/usb/controller/dwc_otg.c Fri Apr 18 07:50:25 2014 (r264641)
+++ head/sys/dev/usb/controller/dwc_otg.c Fri Apr 18 08:31:55 2014 (r264642)
@@ -2149,7 +2149,12 @@ dwc_otg_vbus_interrupt(struct dwc_otg_so
{
DPRINTFN(5, "vbus = %u\n", is_on);
- if (is_on) {
+ /*
+ * If the USB host mode is forced, then assume VBUS is always
+ * present else rely on the input to this function:
+ */
+ if ((is_on != 0) || (sc->sc_mode == DWC_MODE_HOST)) {
+
if (!sc->sc_flags.status_vbus) {
sc->sc_flags.status_vbus = 1;
@@ -3182,7 +3187,7 @@ dwc_otg_init(struct dwc_otg_softc *sc)
sc->sc_host_ch_max);
/* setup FIFO */
- if (dwc_otg_init_fifo(sc, DWC_MODE_OTG))
+ if (dwc_otg_init_fifo(sc, sc->sc_mode))
return (EINVAL);
/* enable interrupts */
Modified: head/sys/dev/usb/controller/dwc_otg_fdt.c
==============================================================================
--- head/sys/dev/usb/controller/dwc_otg_fdt.c Fri Apr 18 07:50:25 2014 (r264641)
+++ head/sys/dev/usb/controller/dwc_otg_fdt.c Fri Apr 18 08:31:55 2014 (r264642)
@@ -91,6 +91,7 @@ static int
dwc_otg_attach(device_t dev)
{
struct dwc_otg_super_softc *sc = device_get_softc(dev);
+ char usb_mode[24];
int err;
int rid;
@@ -99,6 +100,23 @@ dwc_otg_attach(device_t dev)
sc->sc_otg.sc_bus.devices = sc->sc_otg.sc_devices;
sc->sc_otg.sc_bus.devices_max = DWC_OTG_MAX_DEVICES;
+ /* get USB mode, if any */
+ if (OF_getprop(ofw_bus_get_node(dev), "dr_mode",
+ &usb_mode, sizeof(usb_mode)) > 0) {
+
+ /* ensure proper zero termination */
+ usb_mode[sizeof(usb_mode) - 1] = 0;
+
+ if (strcasecmp(usb_mode, "host") == 0)
+ sc->sc_otg.sc_mode = DWC_MODE_HOST;
+ else if (strcasecmp(usb_mode, "peripheral") == 0)
+ sc->sc_otg.sc_mode = DWC_MODE_DEVICE;
+ else if (strcasecmp(usb_mode, "otg") != 0) {
+ device_printf(dev, "Invalid FDT dr_mode: %s\n",
+ usb_mode);
+ }
+ }
+
/* get all DMA memory */
if (usb_bus_mem_alloc_all(&sc->sc_otg.sc_bus,
USB_GET_DMA_TAG(dev), NULL)) {
Modified: head/sys/modules/usb/dwc_otg/Makefile
==============================================================================
--- head/sys/modules/usb/dwc_otg/Makefile Fri Apr 18 07:50:25 2014 (r264641)
+++ head/sys/modules/usb/dwc_otg/Makefile Fri Apr 18 08:31:55 2014 (r264642)
@@ -31,8 +31,8 @@ S= ${.CURDIR}/../../..
KMOD= dwc_otg
SRCS= bus_if.h device_if.h usb_if.h \
- opt_bus.h opt_usb.h \
- dwc_otg.c \
+ opt_bus.h opt_usb.h ofw_bus_if.h \
+ dwc_otg.c dwc_otg_fdt.c \
pci_if.h
.if defined(HAS_ATMELARM)
More information about the svn-src-all
mailing list