Date: Wed, 16 Apr 2014 07:17:05 GMT From: John Wehle <john@feith.com> To: freebsd-gnats-submit@FreeBSD.org Subject: usb/188683: dwc_otg FDT support for specifying usb controller mode Message-ID: <201404160717.s3G7H5Sw018185@cgiserv.freebsd.org> Resent-Message-ID: <201404160720.s3G7K1Ds041134@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 188683 >Category: usb >Synopsis: dwc_otg FDT support for specifying usb controller mode >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-usb >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Apr 16 07:20:01 UTC 2014 >Closed-Date: >Last-Modified: >Originator: John Wehle >Release: 11 r264251 >Organization: Personal >Environment: Not Yet >Description: In my spare time I'm working on bringing FreeBSD up on amlogic based arm processors. The amlogic SoC contains a dwc USB controller. If I enable the controller on a Visson ATV-102 box (mine appears to be based on the aml8726-m6 SoC) which uses a GL850G usb hub chip the driver fails to detect GOTGCTL_ASESVLD so it doesn't work. The attached patch allows the mode to be specifed in the FDT ... if the mode is set to host, then the driver doesn't looks for GOTGCTL_ASESVLD ... it assumes VBUS is driven. This suffices for basic USB functionality on the Visson ATV-102. >How-To-Repeat: Build FreeBSD 11 for the Visson ATV-102 (this requires code for the amlogic platform which I'll be supplying in the future) and attempt to use USB. >Fix: Apply the patch to optionally specify the controller mode and added mode = "host"; to the usb block in vsatv102-m6.dts. Patch attached with submission follows: Index: sys/dev/usb/controller/dwc_otg_fdt.c =================================================================== --- sys/dev/usb/controller/dwc_otg_fdt.c (revision 264251) +++ sys/dev/usb/controller/dwc_otg_fdt.c (working copy) @@ -91,9 +91,27 @@ dwc_otg_attach(device_t dev) { struct dwc_otg_super_softc *sc = device_get_softc(dev); + pcell_t *prop; + phandle_t node; + ssize_t len; int err; int rid; + node = ofw_bus_get_node(dev); + len = OF_getprop_alloc(node, "mode", sizeof(char), (void **)&prop); + if (len >= 0) { + if (strcmp((char *)prop, "host") == 0) + sc->sc_otg.sc_mode = DWC_MODE_HOST; + else if (strcmp((char *)prop, "device") == 0) + sc->sc_otg.sc_mode = DWC_MODE_DEVICE; + else if (strcmp((char *)prop, "otg") == 0) + ; + else + device_printf(dev, + "ignoring unknown value for mode attribute in FDT\n"); + } + free(prop, M_OFWPROP); + /* initialise some bus fields */ sc->sc_otg.sc_bus.parent = dev; sc->sc_otg.sc_bus.devices = sc->sc_otg.sc_devices; Index: sys/dev/usb/controller/dwc_otg.c =================================================================== --- sys/dev/usb/controller/dwc_otg.c (revision 264251) +++ sys/dev/usb/controller/dwc_otg.c (working copy) @@ -2332,7 +2332,7 @@ DPRINTFN(5, "GOTGCTL=0x%08x\n", temp); - dwc_otg_vbus_interrupt(sc, + dwc_otg_vbus_interrupt(sc, (sc->sc_mode == DWC_MODE_HOST) ? 1 : (temp & (GOTGCTL_ASESVLD | GOTGCTL_BSESVLD)) ? 1 : 0); } @@ -3182,7 +3182,7 @@ 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 */ @@ -3233,7 +3233,7 @@ DPRINTFN(5, "GOTCTL=0x%08x\n", temp); - dwc_otg_vbus_interrupt(sc, + dwc_otg_vbus_interrupt(sc, (sc->sc_mode == DWC_MODE_HOST) ? 1 : (temp & (GOTGCTL_ASESVLD | GOTGCTL_BSESVLD)) ? 1 : 0); USB_BUS_UNLOCK(&sc->sc_bus); >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201404160717.s3G7H5Sw018185>