Date: Thu, 17 Apr 2014 04:50:00 GMT From: John Wehle <john@feith.com> To: freebsd-usb@FreeBSD.org Subject: Re: usb/188683: dwc_otg FDT support for specifying usb controller mode Message-ID: <201404170450.s3H4o0L0068795@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR usb/188683; it has been noted by GNATS. From: John Wehle <john@feith.com> To: ian@FreeBSD.org Cc: freebsd-gnats-submit@FreeBSD.org Subject: Re: usb/188683: dwc_otg FDT support for specifying usb controller mode Date: Thu, 17 Apr 2014 00:27:49 -0400 (EDT) > - 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. Patch revised per your comments attached below. -- John --------------------8<------------------------8<------------------------- 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, "dr_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, "peripheral") == 0) + sc->sc_otg.sc_mode = DWC_MODE_DEVICE; + else if (strcmp((char *)prop, "otg") == 0) + ; + else + device_printf(dev, + "ignoring unknown value for dr_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); ------------------------------------------------------------------------- | Feith Systems | Voice: 1-215-646-8000 | Email: john@feith.com | | John Wehle | Fax: 1-215-540-5495 | | -------------------------------------------------------------------------
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201404170450.s3H4o0L0068795>