From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755913AbdC2Kck (ORCPT ); Wed, 29 Mar 2017 06:32:40 -0400 Received: from mga11.intel.com ([192.55.52.93]:64196 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755116AbdC2Kcj (ORCPT ); Wed, 29 Mar 2017 06:32:39 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,240,1486454400"; d="asc'?scan'208";a="66379113" From: Felipe Balbi To: Roger Quadros Cc: vivek.gautam@codeaurora.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 4/4] usb: dwc3: Workaround for super-speed host on dra7 in dual-role mode In-Reply-To: References: <1487250377-13653-1-git-send-email-rogerq@ti.com> <1487250377-13653-5-git-send-email-rogerq@ti.com> <87o9wlhd1j.fsf@linux.intel.com> Date: Wed, 29 Mar 2017 13:32:31 +0300 Message-ID: <87d1d0l6f4.fsf@linux.intel.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Hi, Roger Quadros writes: >> Roger Quadros writes: >>> dra7 OTG core limits the host controller to USB2.0 (high-speed) mode >>> when we're operating in dual-role. >>=20 >> yeah, that's not a quirk. DRA7 supports OTGv2, not OTGv3. There was no >> USB3 when OTGv2 was written. >>=20 >> DRA7 just shouldn't use OTG core altogether. In fact, this is the very >> thing I've been saying for a long time. Make the simplest implementation >> possible. The dead simple, does-one-thing-only sort of implementation. >>=20 >> All we need for Dual-Role (without OTG extras) is some input for ID and >> VBUS, then we add/remove HCD/UDC conditionally and set PRTCAPDIR. >>=20 > > The catch is that on AM437x there is no way to get ID and VBUS events oth= er > than the OTG controller so we have to rely on the OTG controller for that= . :( okay, so AM437x can get OTG interrupts properly. That's fine. We can still do everything we need using code that's already existing in dwc3 if we refactor it a bit and hook it up to the OTG IRQ handler. Here's what we do: * First we re-factor all necessary code around so the API for OTG/DRD is resumed to calling: dwc3_add_udc(dwc); dwc3_del_udc(dwc); dwc3_add_hcd(dwc); dwc3_del_hcd(dwc); the semantics of these should be easy to understand and you can implement each in their respective host.c/gadget.c files. * Second step is to modify our dwc3_init_mode() (or whatever that function was called, sorry, didn't check) to make sure we have something like: case OTG: dwc3_add_udc(dwc); break; We should *not* add HCD in this case yet. * After that we add otg.c (or drd.c, no preference) and make that call dwc3_add_udc(dwc) and, also, provide dwc3_add_otg(dwc)/dwc3_del_otg(dwc) calls. Then patch the switch statement above to: case OTG: dwc3_add_otg(dwc); break; Note that at this point, this is simply a direct replacement of dwc3_add_udc() to dwc3_add_otg(). This should maintain current behavior (which is starting with peripheral mode by default), but it should also add support for OTG interrupts to change the mode (from an interrupt thead) otg_isr() { /* don't forget to remove preivous mode if necessary */ if (perimode) dwc3_add_udc(dwc); else dwc3_add_hcd(dwc); } * The next patch would be to choose default conditionally based on PERIMODE or whatever. Of course, this is an oversimplified view of reality. You still need to poke around at PRTCAPDIR, etc. But all this can, actually, be prototyped using our "mode" debugfs file. Just make that call dwc3_add/del_udc/hcd() apart from fiddling with PRTCAPDIR in GCTL. Your first implementation could be just that. Refactoring what needs to be refactored, then patching "mode" debugfs to work properly in that case. Only add otg.c/drd.c after "mode" debugfs file is stable, because then you know what needs to be taken into consideration. Just to be clear, I'm not saying we should *ONLY* get the debugfs interface for v4.12, I'm saying you should start with that and get that stable and working properly (make an infinite loop constantly changing modes and keep it running over the weekend) before you add support for OTG interrupts, which could come in the same series ;-) =2D-=20 balbi --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEElLzh7wn96CXwjh2IzL64meEamQYFAljbjT8ACgkQzL64meEa mQaZfg//b7f0lxKH07R4qAYeoRTvq/9skunrvvUarj9n910oHky6UEu3kQjaBr29 5Fovr3nRXEHkkiwaZJ58tvZrPk+jE7SLUBwlkYdhys+zk5xvupC9F5oFeiB6cbPR zbRb4gR2tEzGpcAhFBISX8wQ6E5hvyUS3sym5cs8p1DJtmWjngAZgzu7gIEj4tsU ojnG9za/YaI5iOQagWSyXcEOuY7tcpsNVzzXH0E2gSlTBfEdesD+ix+86JXIDf4v wjDAnQQWH1cLaukOlG7fzkugxx5xo5+Gk7DpRA6asXcjfM9C1h1t4dJ9/sI9wX9O 7b8uTUSeWsYtBsRg6rrGvrbf/4LMaXmOqyKI7KePrcGAAovAXKg5HkcXhenZiFh5 2so5mBKOdEu7nkOXq1K9fwynCXZeFS/coJPQzuN8ms6R8lY6k92lDSsXPV/AcKt4 eJ5YgaUEtSsnYjFWUwSC5LEUkm9bhbkRx7h9P9U6iyk6K+Tsw2IQCLNmv4aqE3d0 4/arRTKPhbA3F5SgmvZ5BSKnDAQCnp1y2EidJXARlj5Pvo/aOIUP6q1Jg2LqBVLE 0IdtPlOWzXnYrYySihp7NUsdAFf1HLX4ehEppnI491f/c0PvE39t+M5i6ojco5Fy ycyhqeSMPBpIFxB0iQKmAQXmzepJiEv8aPaq+pFGBw5hHRutz6E= =ISLk -----END PGP SIGNATURE----- --=-=-=--