Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Apr 2014 13:10:01 GMT
From:      Ian Lepore <ian@FreeBSD.org>
To:        freebsd-usb@FreeBSD.org
Subject:   Re: usb/188683: dwc_otg FDT support for specifying usb controller mode
Message-ID:  <201404161310.s3GDA164057386@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: Ian Lepore <ian@FreeBSD.org>
To: John Wehle <john@feith.com>
Cc: freebsd-gnats-submit@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
 
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201404161310.s3GDA164057386>