From: Roger Quadros <rogerq@ti.com>
To: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.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: Mon, 11 Apr 2016 13:54:32 +0300 [thread overview]
Message-ID: <570B8268.6090700@ti.com> (raw)
In-Reply-To: <SG2PR06MB09197595F9D810CF8A22D860D8910@SG2PR06MB0919.apcprd06.prod.outlook.com>
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.
>
>> 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 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.
cheers,
-roger
> This is an attribute to a USB controller such as:
>
> diff --git a/arch/arm64/boot/dts/renesas/r8a7795.dtsi b/arch/arm64/boot/dts/renesas/r8a7795.dtsi
> index 741d9d2..9dcf76ac 100644
> --- a/arch/arm64/boot/dts/renesas/r8a7795.dtsi
> +++ b/arch/arm64/boot/dts/renesas/r8a7795.dtsi
> @@ -1253,6 +1253,7 @@
> compatible = "renesas,usb2-phy-r8a7795";
> reg = <0 0xee080200 0 0x700>;
> interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
> + otg-hcds = <&ehci0>, <&ohci0>;
> clocks = <&cpg CPG_MOD 703>;
> power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
> #phy-cells = <0>;
> diff --git a/drivers/usb/common/usb-otg.c b/drivers/usb/common/usb-otg.c
> index 41e762a..9a78482 100644
> --- a/drivers/usb/common/usb-otg.c
> +++ b/drivers/usb/common/usb-otg.c
> @@ -258,7 +258,8 @@ static void usb_otg_flush_wait(struct device *otg_dev)
>
> dev_dbg(otg_dev, "otg: registering pending host/gadget\n");
> gadget = &wait->gcd;
> - if (gadget)
> + /* I'm not sure but gadget->gadget is possible to be NULL */
> + if (gadget && gadget->gadget)
> usb_otg_register_gadget(gadget->gadget, gadget->ops);
>
> host = &wait->primary_hcd;
> @@ -567,6 +568,8 @@ struct usb_otg *usb_otg_register(struct device *dev,
> {
> struct usb_otg *otg;
> struct otg_wait_data *wait;
> + struct device_node *np;
> + struct platform_device *pdev;
> int ret = 0;
>
> if (!dev || !config || !config->fsm_ops)
> @@ -616,6 +619,40 @@ struct usb_otg *usb_otg_register(struct device *dev,
> list_add_tail(&otg->list, &otg_list);
> mutex_unlock(&otg_list_mutex);
>
> + /* Get primary hcd device (mandatory) */
> + np = of_parse_phandle(dev->of_node, "otg-hcds", 0);
> + if (!np) {
> + dev_err(dev, "no otg-hcds\n");
> + ret = -EINVAL;
> + goto err_dt;
> + }
> + pdev = of_find_device_by_node(np);
> + of_node_put(np);
> + if (!pdev) {
> + dev_err(dev, "coulnd't get primary hcd device\n");
> + ret = -ENODEV;
> + goto err_dt;
> + }
> + otg->primary_dev = &pdev->dev;
> +
> + /* Get shared hcd device (optional) */
> + np = of_parse_phandle(dev->of_node, "otg-hcds", 1);
> + if (np) {
> + pdev = of_find_device_by_node(np);
> + of_node_put(np);
> + if (!pdev) {
> + dev_err(dev, "coulnd't get shared hcd device\n");
> + ret = -ENODEV;
> + goto err_dt;
> + }
> + otg->shared_dev = &pdev->dev;
> + } else {
> + dev_dbg(dev, "no shared hcd\n");
> + }
> +
> + if (otg->primary_dev != otg->shared_dev)
> + otg->flags |= OTG_FLAG_SHARED_IS_2ND_PRIMARY;
> +
> /* were we in wait list? */
> mutex_lock(&wait_list_mutex);
> wait = usb_otg_get_wait(dev);
> @@ -627,6 +664,8 @@ struct usb_otg *usb_otg_register(struct device *dev,
>
> return otg;
>
> +err_dt:
> + destroy_workqueue(otg->wq);
> err_wq:
> kfree(otg);
> unlock:
> @@ -822,50 +861,42 @@ 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)) {
> - dev_err(otg_dev, "otg: primary host already registered\n");
> - goto err;
> + if (!otg->primary_hcd.hcd) {
> + dev_info(hcd_dev, "%s: primary %s, now %s\n", __func__,
> + dev_name(otg->primary_dev),
> + dev_name(hcd->self.controller));
> + if (otg->primary_dev == hcd->self.controller) {
> + otg->primary_hcd.hcd = hcd;
> + otg->primary_hcd.irqnum = irqnum;
> + otg->primary_hcd.irqflags = irqflags;
> + otg->primary_hcd.ops = ops;
> + otg->hcd_ops = ops;
> + dev_info(otg_dev, "otg: primary host %s registered\n",
> + dev_name(hcd->self.controller));
> }
> + }
>
> - if (hcd->shared_hcd == otg->primary_hcd.hcd) {
> - if (otg->shared_hcd.hcd) {
> - dev_err(otg_dev, "otg: shared host already registered\n");
> - goto err;
> - }
> -
> + if (!otg->shared_hcd.hcd && (!usb_otg_hcd_is_primary_hcd(hcd) ||
> + otg->flags & OTG_FLAG_SHARED_IS_2ND_PRIMARY)) {
> + dev_info(hcd_dev, "%s: shared %s, now %s\n", __func__,
> + dev_name(otg->shared_dev),
> + dev_name(hcd->self.controller));
> + if (otg->shared_dev == hcd->self.controller) {
> otg->shared_hcd.hcd = hcd;
> otg->shared_hcd.irqnum = irqnum;
> otg->shared_hcd.irqflags = irqflags;
> otg->shared_hcd.ops = ops;
> dev_info(otg_dev, "otg: shared host %s registered\n",
> dev_name(hcd->self.controller));
> - } else {
> - dev_err(otg_dev, "otg: invalid shared host %s\n",
> - dev_name(hcd->self.controller));
> - goto err;
> - }
> - } else {
> - if (!usb_otg_hcd_is_primary_hcd(hcd)) {
> - dev_err(otg_dev, "otg: primary host must be registered first\n");
> - goto err;
> }
> -
> - otg->primary_hcd.hcd = hcd;
> - otg->primary_hcd.irqnum = irqnum;
> - otg->primary_hcd.irqflags = irqflags;
> - otg->primary_hcd.ops = ops;
> - otg->hcd_ops = ops;
> - dev_info(otg_dev, "otg: primary host %s registered\n",
> - dev_name(hcd->self.controller));
> }
>
> /*
> * 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->primary_hcd.hcd && (!otg->shared_dev ||
> + (otg->shared_dev && otg->shared_hcd.hcd))) {
> otg->host = hcd_to_bus(hcd);
> /* FIXME: set bus->otg_port if this is true OTG port with HNP */
>
> @@ -878,10 +909,6 @@ int usb_otg_register_hcd(struct usb_hcd *hcd, unsigned int irqnum,
> mutex_unlock(&otg->fsm.lock);
>
> return 0;
> -
> -err:
> - mutex_unlock(&otg->fsm.lock);
> - return -EINVAL;
> }
> EXPORT_SYMBOL_GPL(usb_otg_register_hcd);
>
> diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
> index b094352..ed08865 100644
> --- a/include/linux/usb/otg.h
> +++ b/include/linux/usb/otg.h
> @@ -51,6 +51,8 @@ struct otg_hcd {
> * @fsm: otg finite state machine
> * @hcd_ops: host controller interface
> * ------- internal use only -------
> + * @primary_dev: primary host device for matching
> + * @shared_dev: (optional) shared or other primary host device for matching
> * @primary_hcd: primary host state and interface
> * @shared_hcd: shared host state and interface
> * @gadget_ops: gadget controller interface
> @@ -75,6 +77,8 @@ struct usb_otg {
> struct otg_hcd_ops *hcd_ops;
>
> /* internal use only */
> + struct device *primary_dev;
> + struct device *shared_dev;
> struct otg_hcd primary_hcd;
> struct otg_hcd shared_hcd;
> struct otg_gadget_ops *gadget_ops;
> @@ -84,6 +88,7 @@ struct usb_otg {
> u32 flags;
> #define OTG_FLAG_GADGET_RUNNING (1 << 0)
> #define OTG_FLAG_HOST_RUNNING (1 << 1)
> +#define OTG_FLAG_SHARED_IS_2ND_PRIMARY (1 << 2)
> /* use otg->fsm.lock for serializing access */
>
> /*------------- deprecated interface -----------------------------*/
>
>
next prev parent reply other threads:[~2016-04-11 10:55 UTC|newest]
Thread overview: 100+ 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 ` [PATCH v6 01/12] usb: hcd: Initialize hcd->flags to 0 Roger Quadros
2016-04-06 6:09 ` Felipe Balbi
2016-04-06 6:32 ` Roger Quadros
2016-04-07 9:42 ` Peter Chen
2016-04-07 10:40 ` Roger Quadros
2016-04-08 1:01 ` Peter Chen
2016-04-08 7:16 ` Roger Quadros
2016-04-08 7:45 ` Peter Chen
2016-04-18 2:29 ` Peter Chen
2016-04-18 14:11 ` Alan Stern
2016-04-19 1:56 ` Peter Chen
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-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-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-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 ` [PATCH v6 06/12] usb: otg: get rid of CONFIG_USB_OTG_FSM in favour of CONFIG_USB_OTG Roger Quadros
2016-04-18 8:05 ` Peter Chen
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-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 [this message]
2016-04-14 8:36 ` Yoshihiro Shimoda
2016-04-14 10:59 ` Roger Quadros
2016-04-14 11:15 ` Yoshihiro Shimoda
2016-04-14 11:32 ` Roger Quadros
2016-04-15 9:59 ` Yoshihiro Shimoda
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 1:26 ` Peter Chen
2016-04-22 3:34 ` Peter Chen
2016-04-22 5:57 ` Yoshihiro Shimoda
2016-04-15 9:25 ` Peter Chen
2016-04-15 11:00 ` Roger Quadros
2016-04-18 2:09 ` Peter Chen
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 9:39 ` Peter Chen
2016-04-21 6:52 ` Peter Chen
2016-04-25 14:05 ` Roger Quadros
2016-04-26 2:07 ` Jun Li
2016-04-26 3:47 ` Peter Chen
2016-04-26 5:11 ` Jun Li
2016-04-26 6:28 ` Peter Chen
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-28 1:54 ` Peter Chen
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-18 6:29 ` Peter Chen
2016-04-19 8:14 ` Peter Chen
2016-04-20 6:47 ` 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-18 6:59 ` Peter Chen
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-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 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: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 ` [PATCH v6 11/12] usb: core: hub: Notify OTG fsm when A device sets b_hnp_enable Roger Quadros
2016-04-18 7:08 ` Peter Chen
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-06 3:23 ` Yoshihiro Shimoda
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=570B8268.6090700@ti.com \
--to=rogerq@ti.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=stern@rowland.harvard.edu \
--cc=tony@atomide.com \
--cc=yoshihiro.shimoda.uh@renesas.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome