The following reply was made to PR usb/188683; it has been noted by GNATS.

From: Ian Lepore <i...@freebsd.org>
To: John Wehle <j...@feith.com>
Cc: freebsd-gnats-sub...@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
 
 
_______________________________________________
freebsd-usb@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-usb
To unsubscribe, send any mail to "freebsd-usb-unsubscr...@freebsd.org"

Reply via email to