On Thu, Apr 15, 2021 at 5:12 PM John Stultz <john.stultz@xxxxxxxxxx> wrote: > > On Thu, Apr 15, 2021 at 3:20 PM Thinh Nguyen <Thinh.Nguyen@xxxxxxxxxxxx> wrote: > > > > From: Yu Chen <chenyu56@xxxxxxxxxx> > > From: John Stultz <john.stultz@xxxxxxxxxx> > > > > According to the programming guide, to switch mode for DRD controller, > > the driver needs to do the following. > > > > To switch from device to host: > > 1. Reset controller with GCTL.CoreSoftReset > > 2. Set GCTL.PrtCapDir(host mode) > > 3. Reset the host with USBCMD.HCRESET > > 4. Then follow up with the initializing host registers sequence > > > > To switch from host to device: > > 1. Reset controller with GCTL.CoreSoftReset > > 2. Set GCTL.PrtCapDir(device mode) > > 3. Reset the device with DCTL.CSftRst > > 4. Then follow up with the initializing registers sequence > > > > Currently we're missing step 1) to do GCTL.CoreSoftReset and step 3) of > > switching from host to device. John Stult reported a lockup issue seen > > with HiKey960 platform without these steps[1]. Similar issue is observed > > with Ferry's testing platform[2]. > > > > So, apply the required steps along with some fixes to Yu Chen's and John > > Stultz's version. The main fixes to their versions are the missing wait > > for clocks synchronization before clearing GCTL.CoreSoftReset and only > > apply DCTL.CSftRst when switching from host to device. > > > > [1] https://lore.kernel.org/linux-usb/20210108015115.27920-1-john.stultz@xxxxxxxxxx/ > > [2] https://lore.kernel.org/linux-usb/0ba7a6ba-e6a7-9cd4-0695-64fc927e01f1@xxxxxxxxx/ > > > > Cc: Andy Shevchenko <andy.shevchenko@xxxxxxxxx> > > Cc: Ferry Toth <fntoth@xxxxxxxxx> > > Cc: Wesley Cheng <wcheng@xxxxxxxxxxxxxx> > > Cc: <stable@xxxxxxxxxxxxxxx> > > Fixes: 41ce1456e1db ("usb: dwc3: core: make dwc3_set_mode() work properly") > > Signed-off-by: Yu Chen <chenyu56@xxxxxxxxxx> > > Signed-off-by: John Stultz <john.stultz@xxxxxxxxxx> > > Signed-off-by: Thinh Nguyen <Thinh.Nguyen@xxxxxxxxxxxx> > > --- > > Changes in v3: > > - Check if the desired mode is OTG, then keep the old flow > > - Remove condition for OTG support only since the device can still be > > configured DRD host/device mode only > > - Remove redundant hw_mode check since __dwc3_set_mode() only applies when > > hw_mode is DRD > > Changes in v2: > > - Initialize mutex per device and not as global mutex. > > - Add additional checks for DRD only mode > > > > I've not been able to test all the different modes on HiKey960 yet, > but with this patch we avoid the !COREIDLE hangs that we see > frequently on bootup, so it looks pretty good to me. I'll get back to > you tonight when I can put hands on the board to test the gadget to > host switching to make sure all is well (I really don't expect any > issues, but just want to be sure). Ok, got a chance to test the mode switching and everything is looking good. Tested-by: John Stultz <john.stultz@xxxxxxxxxx> Thanks again for continuing to push this! -john