All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
To: Roger Quadros <rogerq@ti.com>,
	"stern@rowland.harvard.edu" <stern@rowland.harvard.edu>,
	"balbi@kernel.org" <balbi@kernel.org>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"peter.chen@freescale.com" <peter.chen@freescale.com>
Cc: "dan.j.williams@intel.com" <dan.j.williams@intel.com>,
	"jun.li@freescale.com" <jun.li@freescale.com>,
	"mathias.nyman@linux.intel.com" <mathias.nyman@linux.intel.com>,
	"tony@atomide.com" <tony@atomide.com>,
	"Joao.Pinto@synopsys.com" <Joao.Pinto@synopsys.com>,
	"abrestic@chromium.org" <abrestic@chromium.org>,
	"r.baldyga@samsung.com" <r.baldyga@samsung.com>,
	"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-omap@vger.kernel.org" <linux-omap@vger.kernel.org>
Subject: RE: [PATCH v6 07/12] usb: otg: add OTG/dual-role core
Date: Thu, 14 Apr 2016 08:36:54 +0000	[thread overview]
Message-ID: <SG2PR06MB0919398D3CF4944A6EA2754DD8970@SG2PR06MB0919.apcprd06.prod.outlook.com> (raw)
In-Reply-To: <570B8268.6090700@ti.com>

Hi,

> From: Roger Quadros
> Sent: Monday, April 11, 2016 7:55 PM
> 
> On 08/04/16 14:22, Yoshihiro Shimoda wrote:
> > Hi,
> >
> >> From: Roger Quadros
> >> Sent: Thursday, April 07, 2016 8:45 PM
> >>
> >> Hi,
> >>
> >> On 07/04/16 11:52, Yoshihiro Shimoda wrote:
> >>> Hi,
> >>>
> >>>> From: Roger Quadros
> >>>> Sent: Tuesday, April 05, 2016 11:05 PM
> > < snip >
> >>> diff --git a/drivers/usb/common/usb-otg.c b/drivers/usb/common/usb-otg.c
> >>> index 41e762a..4d7f043 100644
> >>> --- a/drivers/usb/common/usb-otg.c
> >>> +++ b/drivers/usb/common/usb-otg.c
> >>> @@ -825,11 +825,16 @@ int usb_otg_register_hcd(struct usb_hcd *hcd, unsigned int irqnum,
> >>>  	if (otg->primary_hcd.hcd) {
> >>>  		/* probably a shared HCD ? */
> >>>  		if (usb_otg_hcd_is_primary_hcd(hcd)) {
> >>> +			if (hcd->driver->flags & HCD_USB11) {
> >>> +				dev_info(otg_dev, "this assumes usb 1.1 hc is as shared_hcd\n");
> >>> +				goto check_shared_hcd;
> >>> +			}
> >>>  			dev_err(otg_dev, "otg: primary host already registered\n");
> >>>  			goto err;
> >>>  		}
> >>>
> >>>  		if (hcd->shared_hcd == otg->primary_hcd.hcd) {
> >>> +check_shared_hcd:
> >>>  			if (otg->shared_hcd.hcd) {
> >>>  				dev_err(otg_dev, "otg: shared host already registered\n");
> >>>  				goto err;
> >>>
> >>> What do you think this local hack?
> >>
> >> Is it guaranteed that EHCI hcd registers before OHCI hcd?
> >
> > Thank you for the comment. No, it is not guaranteed.
> >
> >> If not we need to improve the code still.
> >> We will also need to remove the constraint that primary_hcd must be registered
> >> first in usb_otg_register_hcd(). I think that constraint is no longer
> >> needed anyways.
> >
> > I got it.
> > So, I made a patch to avoid the constraint using an additional property "otg-hcds".
> > The patch is in this end of email. What do you think about the patch?
> 
> This might only solve the issue for device tree but what about non-device tree?
> We need to deal with both cases.

Thank you for the comment. I got it.

> >> If EHCI & OHCI HCDs register before OTG driver then things will break unless
> >> we fix usb_otg_hcd_wait_add(). We need to add this HCD_USB11 check there to
> >> populate wait->shared_hcd.
> >
> > I see. In my environment, since EHCI & OHCI HCDs need phy driver and phy driver
> > will calls usb_otg_register(), the order is right. In other words,
> > EHCI & OHCI HCDs never register before OTG driver because even if EHCI driver
> > is probed first, the driver will be deferred (EHCI driver needs the phy driver).
> 
> But still we cannot assume this is true for all platforms. OTG driver can also
> be a separate entity than PHY driver.

I understood it.

> >>> I also wonder if array of hcd may be good for both xHCI and EHCI/OHCI.
> >>> For example of xHCI:
> >>>  - otg->hcds[0] = primary_hcd
> >>>  - otg->hcds[1] = shared_hcd
> >>>
> >>> For example of EHCI/OHCI:
> >>>  - otg->hcds[0] = primary_hcd of EHCI
> >>>  - otg->hcds[1] = primary_hcd of OHCI
> >>
> >> The bigger problem is that how do we know in the OHCI/EHCI case that we need to wait
> >> for both of them before starting the OTG FSM?
> >> Some systems might use just OHCI or just EHCI.
> >>
> >> There is no guarantee that OTG driver registers before the HCDs so this piece
> >> of information must come from the HCD itself. i.e. whether it needs a companion or not.
> >
> > I understood these problems. I wonder if my patch can resolve these problems.
> >
> > Best regards,
> > Yoshihiro Shimoda
> > ---
> > diff --git a/Documentation/devicetree/bindings/usb/generic.txt b/Documentation/devicetree/bindings/usb/generic.txt
> > index f6866c1..518b9eb 100644
> > --- a/Documentation/devicetree/bindings/usb/generic.txt
> > +++ b/Documentation/devicetree/bindings/usb/generic.txt
> > @@ -27,6 +27,12 @@ Optional properties:
> >   - otg-controller: phandle to otg controller. Host or gadget controllers can
> >  			contain this property to link it to a particular OTG
> >  			controller.
> > + - otg-hcds: phandle to host controller(s). An OTG controller can contain this
> > +	     property. The first one is as "primary", and (optional) the second
> > +	     one is as "shared".
> > +	     - For example for xHCI:		otg-hcds = <&xhci>, <&xhci>;
> > +	     - For example for EHCI/OHCI:	otg-hcds = <&ehci>, <&ohci>;
> > +	     - For example for just EHCI:	otg-hcds = <&ehci>;
> >
> 
> This is kind of duplicating the information. We are already specifying in the
> hcd nodes as to which otg controller it is linked to.
> 
> Instead, how about just adding a boolean property in the otg node saying that
> HCD needs companion. e.g.
> 	hcd-needs-compainion: must be present if otg controller is dealing with
> 			EHCI host controller that needs a companion OHCI host controller.
> 
> This can also be added in struct usb_otg_config so that it can deal with non-DT cases.
> 
> So if this property is true, the OTG core will wait for 2 primary HCDs to be registered.

Thank you for your suggestion. I agree with you.
So, I made such a patch which. It is simple than my previous patch.
What do you think?

Best regards,
Yoshihiro Shimoda

---
 Documentation/devicetree/bindings/usb/generic.txt |  3 +++
 drivers/usb/common/common.c                       |  2 ++
 drivers/usb/common/usb-otg.c                      | 11 +++++++----
 include/linux/usb/otg.h                           |  2 ++
 4 files changed, 14 insertions(+), 4 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/common.c b/drivers/usb/common/common.c
index e3d0161..8b74715 100644
--- a/drivers/usb/common/common.c
+++ b/drivers/usb/common/common.c
@@ -233,6 +233,8 @@ int of_usb_update_otg_caps(struct device_node *np,
 	if (of_find_property(np, "adp-disable", NULL) ||
 				(otg_caps->otg_rev < 0x0200))
 		otg_caps->adp_support = false;
+	if (of_find_property(np, "hcd-needs-companion", NULL))
+		otg_caps->needs_companion = true;
 
 	return 0;
 }
diff --git a/drivers/usb/common/usb-otg.c b/drivers/usb/common/usb-otg.c
index 41e762a..e0df839 100644
--- a/drivers/usb/common/usb-otg.c
+++ b/drivers/usb/common/usb-otg.c
@@ -823,13 +823,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->caps->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->caps->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 +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 */
 
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
index b094352..64a7db8 100644
--- a/include/linux/usb/otg.h
+++ b/include/linux/usb/otg.h
@@ -112,12 +112,14 @@ struct usb_otg {
  * @hnp_support: Indicates if the device supports HNP.
  * @srp_support: Indicates if the device supports SRP.
  * @adp_support: Indicates if the device supports ADP.
+ * @needs_companion: Indicates if the device needs a companion controller.
  */
 struct usb_otg_caps {
 	u16 otg_rev;
 	bool hnp_support;
 	bool srp_support;
 	bool adp_support;
+	bool needs_companion;
 };
 
 /**
-- 
1.9.1

  reply	other threads:[~2016-04-14  8:37 UTC|newest]

Thread overview: 155+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-05 14:05 [PATCH v6 00/12] USB OTG/dual-role framework Roger Quadros
2016-04-05 14:05 ` Roger Quadros
2016-04-05 14:05 ` [PATCH v6 01/12] usb: hcd: Initialize hcd->flags to 0 Roger Quadros
2016-04-05 14:05   ` Roger Quadros
2016-04-06  6:09   ` Felipe Balbi
2016-04-06  6:09     ` Felipe Balbi
2016-04-06  6:32     ` Roger Quadros
2016-04-06  6:32       ` Roger Quadros
2016-04-07  9:42       ` Peter Chen
2016-04-07 10:40         ` Roger Quadros
2016-04-07 10:40           ` Roger Quadros
2016-04-08  1:01           ` Peter Chen
2016-04-08  1:01             ` Peter Chen
2016-04-08  7:16             ` Roger Quadros
2016-04-08  7:16               ` Roger Quadros
2016-04-08  7:45               ` Peter Chen
2016-04-08  7:45                 ` Peter Chen
2016-04-18  2:29       ` Peter Chen
2016-04-18 14:11         ` Alan Stern
2016-04-18 14:11           ` Alan Stern
2016-04-19  1:56           ` Peter Chen
2016-04-19  1:56             ` Peter Chen
2016-04-20  8:15             ` Roger Quadros
2016-04-20  8:15               ` Roger Quadros
2016-04-20  9:40               ` Peter Chen
2016-04-05 14:05 ` [PATCH v6 02/12] usb: hcd.h: Add OTG to HCD interface Roger Quadros
2016-04-05 14:05   ` Roger Quadros
2016-04-18  7:41   ` Peter Chen
2016-04-05 14:05 ` [PATCH v6 03/12] usb: otg-fsm: use usb_otg wherever possible Roger Quadros
2016-04-05 14:05   ` Roger Quadros
2016-04-18  7:42   ` Peter Chen
2016-04-05 14:05 ` [PATCH v6 04/12] usb: otg-fsm: move host controller operations into usb_otg->hcd_ops Roger Quadros
2016-04-05 14:05   ` Roger Quadros
2016-04-18  8:00   ` Peter Chen
2016-04-18  8:00     ` Peter Chen
2016-04-05 14:05 ` [PATCH v6 05/12] usb: gadget.h: Add OTG to gadget interface Roger Quadros
2016-04-05 14:05   ` Roger Quadros
2016-04-05 14:05 ` [PATCH v6 06/12] usb: otg: get rid of CONFIG_USB_OTG_FSM in favour of CONFIG_USB_OTG Roger Quadros
2016-04-05 14:05   ` Roger Quadros
2016-04-18  8:05   ` Peter Chen
2016-04-20  8:12     ` Roger Quadros
2016-04-20  8:12       ` Roger Quadros
2016-04-05 14:05 ` [PATCH v6 07/12] usb: otg: add OTG/dual-role core Roger Quadros
2016-04-05 14:05   ` Roger Quadros
2016-04-07  8:52   ` Yoshihiro Shimoda
2016-04-07 11:45     ` Roger Quadros
2016-04-08 11:22       ` Yoshihiro Shimoda
2016-04-11 10:54         ` Roger Quadros
2016-04-14  8:36           ` Yoshihiro Shimoda [this message]
2016-04-14 10:59             ` Roger Quadros
2016-04-14 11:15               ` Yoshihiro Shimoda
2016-04-14 11:15                 ` Yoshihiro Shimoda
2016-04-14 11:32                 ` Roger Quadros
2016-04-14 11:32                   ` Roger Quadros
2016-04-15  9:59                   ` Yoshihiro Shimoda
2016-04-15  9:59                     ` Yoshihiro Shimoda
2016-04-15 10:57                     ` Roger Quadros
2016-04-15 10:57                       ` Roger Quadros
2016-04-15 10:03                   ` Yoshihiro Shimoda
2016-04-19  9:18                     ` Peter Chen
2016-04-20  5:08                       ` Yoshihiro Shimoda
2016-04-20  7:03                         ` Roger Quadros
2016-04-22  6:05                           ` Peter Chen
2016-04-22  6:05                             ` Peter Chen
2016-04-22  1:26                     ` Peter Chen
2016-04-22  3:34                       ` Peter Chen
2016-04-22  3:34                         ` Peter Chen
2016-04-22  5:57                         ` Yoshihiro Shimoda
2016-04-22  5:57                           ` Yoshihiro Shimoda
2016-04-15  9:25   ` Peter Chen
2016-04-15  9:25     ` Peter Chen
2016-04-15 11:00     ` Roger Quadros
2016-04-15 11:00       ` Roger Quadros
2016-04-18  2:09       ` Peter Chen
2016-04-20  6:54         ` Roger Quadros
2016-04-20  6:54           ` Roger Quadros
2016-04-20  9:26           ` Peter Chen
2016-04-19  8:06   ` Peter Chen
2016-04-20  7:02     ` Roger Quadros
2016-04-20  7:02       ` Roger Quadros
2016-04-20  9:39       ` Peter Chen
2016-04-21  6:52   ` Peter Chen
2016-04-21  6:52     ` Peter Chen
2016-04-25 14:05     ` Roger Quadros
2016-04-25 14:05       ` Roger Quadros
2016-04-26  2:07   ` Jun Li
2016-04-26  3:47     ` Peter Chen
2016-04-26  3:47       ` Peter Chen
2016-04-26  5:11       ` Jun Li
2016-04-26  5:11         ` Jun Li
2016-04-26  6:28         ` Peter Chen
2016-04-26  6:28           ` Peter Chen
2016-04-26  7:00           ` Jun Li
2016-04-26  7:00             ` Jun Li
2016-04-26  8:21             ` Peter Chen
2016-04-27  3:15               ` Peter Chen
2016-04-27 10:59                 ` Roger Quadros
2016-04-27 10:59                   ` Roger Quadros
2016-04-28  1:54                   ` Peter Chen
2016-04-28  1:54                     ` Peter Chen
2016-04-28  8:01                     ` Roger Quadros
2016-04-28  8:01                       ` Roger Quadros
2016-04-27 11:15     ` Roger Quadros
2016-04-05 14:05 ` [PATCH v6 08/12] usb: hcd: Adapt to OTG core Roger Quadros
2016-04-05 14:05   ` Roger Quadros
2016-04-18  6:29   ` Peter Chen
2016-04-19  8:14     ` Peter Chen
2016-04-20  6:47       ` Roger Quadros
2016-04-20  6:47         ` Roger Quadros
2016-04-20  6:46     ` Roger Quadros
2016-04-20  6:46       ` Roger Quadros
2016-04-27 10:16   ` Jun Li
2016-04-27 11:00     ` Roger Quadros
2016-04-27 11:11       ` Roger Quadros
2016-04-27 12:49         ` Jun Li
2016-04-27 13:18           ` Jun Li
2016-04-05 14:05 ` [PATCH v6 09/12] usb: gadget: udc: adapt " Roger Quadros
2016-04-05 14:05   ` Roger Quadros
2016-04-18  6:59   ` Peter Chen
2016-04-18  6:59     ` Peter Chen
2016-04-20  6:51     ` Roger Quadros
2016-04-20  6:51       ` Roger Quadros
2016-04-21  6:38   ` Jun Li
2016-04-25 14:04     ` Roger Quadros
2016-04-26  0:07       ` Jun Li
2016-04-27 11:22         ` Roger Quadros
2016-04-27 11:22           ` Roger Quadros
2016-04-28  9:54           ` Roger Quadros
2016-04-28  9:54             ` Roger Quadros
2016-04-28 10:23             ` Jun Li
2016-04-28 12:22               ` Roger Quadros
2016-05-03  7:06                 ` Jun Li
2016-05-03 15:44                   ` Roger Quadros
2016-05-04  1:47                     ` Peter Chen
2016-05-04  1:47                       ` Peter Chen
2016-05-04  3:35                     ` Peter Chen
2016-05-04  6:37                       ` Roger Quadros
2016-05-04  7:53                         ` Peter Chen
2016-05-04  8:03                         ` Jun Li
2016-05-04  8:40                           ` Roger Quadros
2016-05-04  8:40                             ` Roger Quadros
2016-05-04  8:39                             ` Peter Chen
2016-04-05 14:05 ` [PATCH v6 10/12] usb: doc: dt-binding: Add otg-controller property Roger Quadros
2016-04-05 14:05   ` Roger Quadros
2016-04-05 14:05 ` [PATCH v6 11/12] usb: core: hub: Notify OTG fsm when A device sets b_hnp_enable Roger Quadros
2016-04-05 14:05   ` Roger Quadros
2016-04-18  7:08   ` Peter Chen
2016-04-27 14:35     ` Roger Quadros
2016-04-27 14:35       ` Roger Quadros
2016-04-05 14:05 ` [PATCH v6 12/12] usb: host: xhci-plat: Add otg device to platform data Roger Quadros
2016-04-05 14:05   ` Roger Quadros
2016-04-06  3:23   ` Yoshihiro Shimoda
2016-04-06  3:23     ` Yoshihiro Shimoda
2016-04-06  6:30     ` Roger Quadros
2016-04-06  6:30       ` Roger Quadros

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=SG2PR06MB0919398D3CF4944A6EA2754DD8970@SG2PR06MB0919.apcprd06.prod.outlook.com \
    --to=yoshihiro.shimoda.uh@renesas.com \
    --cc=Joao.Pinto@synopsys.com \
    --cc=abrestic@chromium.org \
    --cc=balbi@kernel.org \
    --cc=dan.j.williams@intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jun.li@freescale.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=mathias.nyman@linux.intel.com \
    --cc=peter.chen@freescale.com \
    --cc=r.baldyga@samsung.com \
    --cc=rogerq@ti.com \
    --cc=stern@rowland.harvard.edu \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.