usb/188683: dwc_otg FDT support for specifying usb controller mode
Ian Lepore
ian at FreeBSD.org
Wed Apr 16 13:10:01 UTC 2014
The following reply was made to PR usb/188683; it has been noted by GNATS.
From: Ian Lepore <ian at FreeBSD.org>
To: John Wehle <john at feith.com>
Cc: freebsd-gnats-submit at FreeBSD.org
Subject: Re: usb/188683: dwc_otg FDT support for specifying usb controller
mode
Date: Wed, 16 Apr 2014 07:09:26 -0600
On Wed, 2014-04-16 at 07:17 +0000, John Wehle wrote:
> >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:
The DeviceTree docs indicate there's a standard property name and values
for this:
- dr_mode: tells Dual-Role USB controllers that we want to work on a
particular mode. Valid arguments are "host", "peripheral" and "otg". In
case this attribute isn't passed via DT, USB DRD controllers should
default to OTG.
-- Ian
More information about the freebsd-usb
mailing list