Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751897AbcDVF6G (ORCPT ); Fri, 22 Apr 2016 01:58:06 -0400 Received: from relmlor3.renesas.com ([210.160.252.173]:28450 "EHLO relmlie2.idc.renesas.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751067AbcDVF6D convert rfc822-to-8bit (ORCPT ); Fri, 22 Apr 2016 01:58:03 -0400 X-IronPort-AV: E=Sophos;i="5.22,559,1449500400"; d="scan'208";a="209480364" From: Yoshihiro Shimoda To: Peter Chen CC: Roger Quadros , "stern@rowland.harvard.edu" , "balbi@kernel.org" , "gregkh@linuxfoundation.org" , "peter.chen@freescale.com" , "dan.j.williams@intel.com" , "jun.li@freescale.com" , "mathias.nyman@linux.intel.com" , "tony@atomide.com" , "Joao.Pinto@synopsys.com" , "abrestic@chromium.org" , "r.baldyga@samsung.com" , "linux-usb@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "linux-omap@vger.kernel.org" Subject: RE: [PATCH v6 07/12] usb: otg: add OTG/dual-role core Thread-Topic: [PATCH v6 07/12] usb: otg: add OTG/dual-role core Thread-Index: AQHRj0Tb371d8JP1IUix4M6r6OgSS59+LbDwgAA5sgCAAYajwIAEtH8AgASOAyCAACp4gIAAAhUAgAAG6oCAAUYGkIAAMvNAgApwkACAACOdAIAAJvqA Date: Fri, 22 Apr 2016 05:57:56 +0000 Message-ID: References: <57064850.3060405@ti.com> <570B8268.6090700@ti.com> <570F7827.8050707@ti.com> <570F7FB3.2040807@ti.com> <20160422012646.GA29299@shlinux2.ap.freescale.net> <20160422033414.GB29299@shlinux2.ap.freescale.net> In-Reply-To: <20160422033414.GB29299@shlinux2.ap.freescale.net> Accept-Language: ja-JP, en-US Content-Language: ja-JP X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: gmail.com; dkim=none (message not signed) header.d=none;gmail.com; dmarc=none action=none header.from=renesas.com; x-originating-ip: [211.11.155.144] x-ms-office365-filtering-correlation-id: 38249353-f0aa-4d26-226a-08d36a730d52 x-microsoft-exchange-diagnostics: 1;SG2PR06MB0919;5:6NsXStQNgyIcq0g9B2GSG94Bovap54LdFKbcuksGYV+B+PeGHwjoUIHhFHXo6GzTUAVPGt8nJGkLel0sjOwqWkxpt9ddjNiHR9eY7bzZKJz8fx6M4YBHObU0j9dFOgTDm8xCKjhZp6aU63YsILtHs8tlWvk53Wk0Zpxa+uXpLIX7DUBxr4GZf0Vl3XRGmgDq;24:yN4rZFh9vwaDvAiN/dLySVpw0/WVN5zeMZzWPLDbs2r/S/zsZ97r0vUm5eqBIKFEseXY/5M/2w8MUYhuGgMdZrixEwuBgUeC75B3y8a/EdI=;7:X9rIKZHeJMQ3pQsky8VofHccwAVQdFvBDbQ+rEdEE9mW0PPEYlO+BnpN+sXxG2ibt3Xw3uKpQ8rE3PB97+ZzK7Zf196HL5b1hMgNp1NL6+Ko4P2w2Pd6JRX3SdA8I80Puqycpa8v0qV8nN1klJJ+kq7goeW/91MjVZ5/5MBEUdbg7FXUxJC5PHNsdrAo653KJY0wQpt2BYTqUrpzVYWVsPhf5rho8nerFO3E32t4G8I=;20:u7Si8aD+UcvS0m9ZoDvH+svAGfsR5EmLZbqTD10lod4dU5yzyQqCYOUqgUxTVurdRcFXaeSAhbhJeKqG/CfXs1N15b1ByvyT7X6FeiHZEU0onDb4eej1t389vLWpKlQ2XSaKUc80/mb5symQW0MqanyaSQjJYIRG7Ig6Fl7TbG8= x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SG2PR06MB0919; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(9101521026)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6055026);SRVR:SG2PR06MB0919;BCL:0;PCL:0;RULEID:;SRVR:SG2PR06MB0919; x-forefront-prvs: 0920602B08 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(6009001)(24454002)(57704003)(377454003)(1411001)(50986999)(189998001)(76176999)(54356999)(5003600100002)(66066001)(9686002)(92566002)(81166005)(87936001)(74316001)(5002640100001)(5008740100001)(110136002)(76576001)(10400500002)(122556002)(586003)(93886004)(4326007)(106116001)(19580405001)(19580395003)(77096005)(345774005)(1096002)(3846002)(11100500001)(102836003)(6116002)(2906002)(3660700001)(2900100001)(2950100001)(33656002)(1220700001)(3280700002)(86362001)(5004730100002)(7059030);DIR:OUT;SFP:1102;SCL:1;SRVR:SG2PR06MB0919;H:SG2PR06MB0919.apcprd06.prod.outlook.com;FPR:;SPF:None;MLV:sfv;LANG:en; spamdiagnosticoutput: 1:23 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Apr 2016 05:57:56.3516 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 53d82571-da19-47e4-9cb4-625a166a4a2a X-MS-Exchange-Transport-CrossTenantHeadersStamped: SG2PR06MB0919 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 9553 Lines: 232 Hi, > From: Peter Chen > Sent: Friday, April 22, 2016 12:34 PM > > On Fri, Apr 22, 2016 at 09:26:46AM +0800, Peter Chen wrote: > > On Fri, Apr 15, 2016 at 10:03:16AM +0000, Yoshihiro Shimoda wrote: > > > Hi, > > > > > > > From: Yoshihiro Shimoda > > > > Sent: Friday, April 15, 2016 6:59 PM > > > > > > > > Hi, > > > > > > > > > From: Roger Quadros > > > > > Sent: Thursday, April 14, 2016 8:32 PM > > > > > > > > > > On 14/04/16 14:15, Yoshihiro Shimoda wrote: > > > > > > Hi, > > > > > > > > > > < snip > > > > > > >>> @@ -865,7 +867,8 @@ int usb_otg_register_hcd(struct usb_hcd *hcd, unsigned int irqnum, > > > > > >>> * we're ready only if we have shared HCD > > > > > >>> * or we don't need shared HCD. > > > > > >>> */ > > > > > >>> - if (otg->shared_hcd.hcd || !otg->primary_hcd.hcd->shared_hcd) { > > > > > >>> + if (otg->shared_hcd.hcd || (!otg->caps->needs_companion && > > > > > >>> + !otg->primary_hcd.hcd->shared_hcd)) { > > > > > >>> otg->host = hcd_to_bus(hcd); > > > > > >>> /* FIXME: set bus->otg_port if this is true OTG port with HNP */ > > > > > >>> > > > > > >> > > > > > >> These changes look good to me. Thanks. > > > > > > > > > > > > Thank you for the comment. > > > > > > If we change the "needs_companion" place to the otg_config, > > > > > > do we need to add a flag into the otg, instead of otg->caps? > > > > > > > > > > Yes we can add a flag in struct usb_otg. > > > > > > > > Thank you for the comment. > > > > > > > > I made a fixed patch. > > > > So, should I send this patch to ML after you sent v7 patches? > > > > Or, would you apply this patch before you send v7 patches? > > > > > > Oops, I sent this email without my patch... > > > > > > --- > > > Subject: [PATCH] usb: otg: add hcd companion support > > > > > > Since some host controller (e.g. EHCI) needs a companion host controller > > > (e.g. OHCI), this patch adds such a configuration to use it in the OTG > > > core. > > > > > > Signed-off-by: Yoshihiro Shimoda > > > --- > > > Documentation/devicetree/bindings/usb/generic.txt | 3 +++ > > > drivers/usb/common/usb-otg.c | 17 +++++++++++++---- > > > include/linux/usb/otg.h | 7 ++++++- > > > 3 files changed, 22 insertions(+), 5 deletions(-) > > > > > > diff --git a/Documentation/devicetree/bindings/usb/generic.txt b/Documentation/devicetree/bindings/usb/generic.txt > > > index f6866c1..1db1c33 100644 > > > --- a/Documentation/devicetree/bindings/usb/generic.txt > > > +++ b/Documentation/devicetree/bindings/usb/generic.txt > > > @@ -27,6 +27,9 @@ Optional properties: > > > - otg-controller: phandle to otg controller. Host or gadget controllers can > > > contain this property to link it to a particular OTG > > > controller. > > > + - hcd-needs-companion: must be present if otg controller is dealing with > > > + EHCI host controller that needs a companion OHCI host > > > + controller. > > > > > > This is an attribute to a USB controller such as: > > > > > > diff --git a/drivers/usb/common/usb-otg.c b/drivers/usb/common/usb-otg.c > > > index 41e762a..83c8c96 100644 > > > --- a/drivers/usb/common/usb-otg.c > > > +++ b/drivers/usb/common/usb-otg.c > > > @@ -20,6 +20,7 @@ > > > #include > > > #include > > > #include > > > +#include > > > #include > > > #include > > > #include > > > @@ -600,6 +601,10 @@ struct usb_otg *usb_otg_register(struct device *dev, > > > else > > > INIT_WORK(&otg->work, usb_otg_work); > > > > > > + if (of_find_property(dev->of_node, "hcd-needs-companion", NULL) || > > > + config->hcd_needs_companion) /* needs comanion ? */ > > > + otg->flags |= OTG_FLAG_HCD_NEEDS_COMPANION; > > > + > > > otg->wq = create_singlethread_workqueue("usb_otg"); > > > if (!otg->wq) { > > > dev_err(dev, "otg: %s: can't create workqueue\n", > > > @@ -823,13 +828,15 @@ int usb_otg_register_hcd(struct usb_hcd *hcd, unsigned int irqnum, > > > /* HCD will be started by OTG fsm when needed */ > > > mutex_lock(&otg->fsm.lock); > > > if (otg->primary_hcd.hcd) { > > > - /* probably a shared HCD ? */ > > > - if (usb_otg_hcd_is_primary_hcd(hcd)) { > > > + /* probably a shared HCD or a companion OHCI HCD ? */ > > > + if (!(otg->flags & OTG_FLAG_HCD_NEEDS_COMPANION) && > > > + usb_otg_hcd_is_primary_hcd(hcd)) { > > > dev_err(otg_dev, "otg: primary host already registered\n"); > > > goto err; > > > } > > > > > > - if (hcd->shared_hcd == otg->primary_hcd.hcd) { > > > + if (otg->flags & OTG_FLAG_HCD_NEEDS_COMPANION || > > > + (hcd->shared_hcd == otg->primary_hcd.hcd)) { > > > if (otg->shared_hcd.hcd) { > > > dev_err(otg_dev, "otg: shared host already registered\n"); > > > goto err; > > > @@ -865,7 +872,9 @@ int usb_otg_register_hcd(struct usb_hcd *hcd, unsigned int irqnum, > > > * we're ready only if we have shared HCD > > > * or we don't need shared HCD. > > > */ > > > - if (otg->shared_hcd.hcd || !otg->primary_hcd.hcd->shared_hcd) { > > > + if (otg->shared_hcd.hcd || > > > + (!(otg->flags & OTG_FLAG_HCD_NEEDS_COMPANION) && > > > + !otg->primary_hcd.hcd->shared_hcd)) { > > > otg->host = hcd_to_bus(hcd); > > > /* FIXME: set bus->otg_port if this is true OTG port with HNP */ > > > > > > diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h > > > index b094352..6f4ca77 100644 > > > --- a/include/linux/usb/otg.h > > > +++ b/include/linux/usb/otg.h > > > @@ -57,7 +57,8 @@ struct otg_hcd { > > > * @list: list of otg controllers > > > * @work: otg state machine work > > > * @wq: otg state machine work queue > > > - * @flags: to track if host/gadget is running > > > + * @flags: to track if host/gadget is running, or to indicate if hcd needs > > > + * companion > > > */ > > > struct usb_otg { > > > u8 default_a; > > > @@ -84,6 +85,7 @@ struct usb_otg { > > > u32 flags; > > > #define OTG_FLAG_GADGET_RUNNING (1 << 0) > > > #define OTG_FLAG_HOST_RUNNING (1 << 1) > > > +#define OTG_FLAG_HCD_NEEDS_COMPANION (1 << 2) > > > /* use otg->fsm.lock for serializing access */ > > > > > > /*------------- deprecated interface -----------------------------*/ > > > @@ -125,11 +127,14 @@ struct usb_otg_caps { > > > * @caps: otg capabilities of the controller > > > * @ops: otg fsm operations > > > * @otg_work: optional custom otg state machine work function > > > + * @hcd_needs_companion: Indicates if host controller needs a companion > > > + * controller > > > */ > > > struct usb_otg_config { > > > struct usb_otg_caps *otg_caps; > > > struct otg_fsm_ops *fsm_ops; > > > void (*otg_work)(struct work_struct *work); > > > + bool hcd_needs_companion; > > > }; > > > > > > extern const char *usb_otg_state_string(enum usb_otg_state state); > > > -- > > > > Hi Yoshihiro, the shared_hcd is used for USB3 only [1], this patch may > > not be suitable for supporting companion controller at OTG framework. > > For companion or other USB2 controllers, both primary hcd and shard hcd > > are NULL for HCD core. > > > > Oh, I may be wrong. It should be ok for companion controller by using > this patch. Yoshihiro, do all below variables are NULL after both hcds > call usb_otg_register_hcd? > > otg->primary_hcd.hcd->shared_hcd > otg->primary_hcd.hcd->primary_hcd > otg->shared_hcd.hcd->shared_hcd > otg->shared_hcd.hcd->primary_hcd Thank you for the review twice! :) I checked these variables and the variables was set to NULL after both hcds call usb_otg_register_hcd. < a patch for the check > diff --git a/drivers/usb/common/usb-otg.c b/drivers/usb/common/usb-otg.c index 83c8c96..1fb7ea0 100644 --- a/drivers/usb/common/usb-otg.c +++ b/drivers/usb/common/usb-otg.c @@ -884,6 +884,19 @@ int usb_otg_register_hcd(struct usb_hcd *hcd, unsigned int irqnum, dev_dbg(otg_dev, "otg: can't start till shared host registers\n"); } + if (otg->primary_hcd.hcd) { + dev_info(otg_dev, "primary_hcd.hcd->shared_hcd = %p\n", + otg->primary_hcd.hcd->shared_hcd); + dev_info(otg_dev, "primary_hcd.hcd->primary_hcd = %p\n", + otg->primary_hcd.hcd->primary_hcd); + } + if (otg->shared_hcd.hcd) { + dev_info(otg_dev, "shared_hcd.hcd->shared_hcd = %p\n", + otg->shared_hcd.hcd->shared_hcd); + dev_info(otg_dev, "shared_hcd.hcd->primary_hcd = %p\n", + otg->shared_hcd.hcd->primary_hcd); + } + mutex_unlock(&otg->fsm.lock); return 0; < result > [ 1.797122] phy_rcar_gen3_usb2 ee080200.usb-phy: otg: limiting to dual-role [ 1.804228] phy_rcar_gen3_usb2 ee080200.usb-phy: otg: primary host ee080100.usb registered [ 1.812168] phy_rcar_gen3_usb2 ee080200.usb-phy: primary_hcd.hcd->shared_hcd = (null) [ 1.820520] phy_rcar_gen3_usb2 ee080200.usb-phy: primary_hcd.hcd->primary_hcd = (null) [ 1.829136] phy_rcar_gen3_usb2 ee080200.usb-phy: otg: shared host ee080000.usb registered [ 1.836993] phy_rcar_gen3_usb2 ee080200.usb-phy: otg: can't start till gadget registers [ 1.844675] phy_rcar_gen3_usb2 ee080200.usb-phy: primary_hcd.hcd->shared_hcd = (null) [ 1.853024] phy_rcar_gen3_usb2 ee080200.usb-phy: primary_hcd.hcd->primary_hcd = (null) [ 1.861458] phy_rcar_gen3_usb2 ee080200.usb-phy: shared_hcd.hcd->shared_hcd = (null) [ 1.869724] phy_rcar_gen3_usb2 ee080200.usb-phy: shared_hcd.hcd->primary_hcd = (null) Best regards, Yoshihiro Shimoda > -- > > Best Regards, > Peter Chen