linux-arm-msm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Stephen Boyd <stephen.boyd@linaro.org>
To: Peter Chen <hzpeterchen@gmail.com>
Cc: Felipe Balbi <balbi@kernel.org>, Arnd Bergmann <arnd@arndb.de>,
	Neil Armstrong <narmstrong@baylibre.com>,
	linux-arm-msm@vger.kernel.org, linux-usb@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Peter Chen <peter.chen@nxp.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Andy Gross <andy.gross@linaro.org>,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v5 11/23] usb: chipidea: Emulate OTGSC interrupt enable path
Date: Wed, 19 Oct 2016 23:55:29 -0700	[thread overview]
Message-ID: <147694652997.28344.1048935134595924905@sboyd-linaro> (raw)
In-Reply-To: <20161019080211.GA1968@b29397-desktop>

Quoting Peter Chen (2016-10-19 01:02:11)
> On Tue, Oct 18, 2016 at 06:53:07PM -0700, Stephen Boyd wrote:
> > If you're asking if I've made modifications to extcon-usb-gpio, then the
> > answer is no. The branch on linaro.org git server from the cover-letter
> > is the branch I've used to test this with. This patch is specifically to
> > fix issues with that design on the db410c board that has only one pin
> > for ID and vbus detection. It's the schematic that we've discussed in
> > another thread.
> > 
> > extcon-usb-gpio sends two extcon events, EXTCON_USB_HOST (for the id
> > pin) and EXTCON_USB (for the vbus). So afaik it does support vbus
> > events.
> > 
> 
> Hmm, in fact, your ID event is the same with vbus event, you take
> external vbus event as ID event for extcon-usb-gpio handling. Yes,
> it can work due to it sends EXTCON_USB_HOST event first.
> 
> Where you change the USB_SW_SEL_PM pin?

Currently that is done with the mux driver I sent based on the extcon
event. We don't know if that's before or after the controller handles
the extcon event though, so the pin should probably be changed from the
chipidea driver instead to be more explicit. Why do you ask though?

> 
> > > - When the ID from 0->1, the chipidea driver will do role switch, and
> > >   set BSVIE, why it does not occur for your case?
> > 
> > Right, that happens with this line in the sequence I describe below:
> > 
> >   hw_write_otgsc(ci, OTGSC_BSVIS | OTGSC_BSVIE, OTGSC_BSVIS | OTGSC_BSVIE);
> > 
> > but that happens much later than when the extcon event happens so we
> > miss the interrupt. Technically, the driver isn't expecting the BSVIS
> > interrupt to happen until BSVIE is set, but the extcon can come whenever
> > it wants regardless of how the registers are configured in the
> > controller.  So we have to do some sort of 'caching' here to remember
> > that the vbus event happened and replay it when BSVIE is set. At least I
> > imagine this is how the hardware would work? Or if vbus goes high before
> > we enable the interrupt would it just be missed? It seems like polling
> > the BSV bit and then enabling BSVIE is sort of racy there.
> > 
> > Plus, we poll the BSV bit when we role switch, but in my case id bit
> > toggles and vbus goes high at exactly the same time because that is all
> > happening from a single cable being connected, so it's not possible for
> > BSV to go low and see it after the id pin from 0 to 1.
> 
> Now, I understand your case, but your changes are a little complicated.
> Would you try if below patch can fix your issue?
> 
> From 8b8baf31dcaca53612d0fd91068c84fe09d66f6c Mon Sep 17 00:00:00 2001
> From: Peter Chen <peter.chen@nxp.com>
> Date: Wed, 19 Oct 2016 15:32:58 +0800
> Subject: [PATCH 1/1] usb: chipidea: vbus event may exist before starting
>  gadget
> 
> At some situations, the vbus may already be there before starting
> gadget. So we need to check vbus event after switch to gadget in
> order to handle missing vbus event. The typical use cases are plugging
> vbus cable before driver load or the vbus has already been there
> after stopping host but before starting gadget.
> 
> Signed-off-by: Peter Chen <peter.chen@nxp.com>

Yes this should work. Light testing doesn't show any problems so far.
 
> ---
>  drivers/usb/chipidea/core.c |  4 ----
>  drivers/usb/chipidea/otg.c  | 10 ++++++----
>  drivers/usb/chipidea/udc.c  |  2 ++
>  3 files changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
> index b814d91..a7d2c68 100644
> --- a/drivers/usb/chipidea/core.c
> +++ b/drivers/usb/chipidea/core.c
> @@ -992,10 +992,6 @@ static int ci_hdrc_probe(struct platform_device *pdev)
>         }
>  
>         if (!ci_otg_is_fsm_mode(ci)) {
> -               /* only update vbus status for peripheral */
> -               if (ci->role == CI_ROLE_GADGET)
> -                       ci_handle_vbus_change(ci);
> -
>                 ret = ci_role_start(ci, ci->role);
>                 if (ret) {
>                         dev_err(dev, "can't start %s role\n",
> diff --git a/drivers/usb/chipidea/otg.c b/drivers/usb/chipidea/otg.c
> index 695f3fe..99c0709 100644
> --- a/drivers/usb/chipidea/otg.c
> +++ b/drivers/usb/chipidea/otg.c
> @@ -134,9 +134,9 @@ void ci_handle_vbus_change(struct ci_hdrc *ci)
>         if (!ci->is_otg)
>                 return;
>  
> -       if (hw_read_otgsc(ci, OTGSC_BSV))
> +       if (hw_read_otgsc(ci, OTGSC_BSV) && !ci->vbus_active)
>                 usb_gadget_vbus_connect(&ci->gadget);
> -       else
> +       else if (!hw_read_otgsc(ci, OTGSC_BSV) && ci->vbus_active)
>                 usb_gadget_vbus_disconnect(&ci->gadget);
>  }
>  
> @@ -175,10 +175,12 @@ static void ci_handle_id_switch(struct ci_hdrc *ci)
>  
>                 ci_role_stop(ci);
>  
> -               if (role == CI_ROLE_GADGET)
> +               if (role == CI_ROLE_GADGET &&
> +                               IS_ERR(ci->platdata->vbus_extcon.edev))
>                         /*
>                          * wait vbus lower than OTGSC_BSV before connecting
> -                        * to host
> +                        * to host. And if vbus's status is an external
> +                        * connector, it doesn't need to wait here.

because OTGSC_BSV will toggle based on the extcon state and not when the
phy connects to the host? It would be good to explain why it's not
needed instead of just repeating what the code is doing.

>                          */
>                         hw_wait_vbus_lower_bsv(ci);
>  
> diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
> index 001c2fa..184ffba 100644
> --- a/drivers/usb/chipidea/udc.c
> +++ b/drivers/usb/chipidea/udc.c
> @@ -1963,6 +1963,8 @@ static int udc_id_switch_for_device(struct ci_hdrc *ci)
>                 /* Clear and enable BSV irq */
>                 hw_write_otgsc(ci, OTGSC_BSVIS | OTGSC_BSVIE,
>                                         OTGSC_BSVIS | OTGSC_BSVIE);
> +       /* vbus change may has already been occurred */

"vbus change may have already occurred"?

> +       ci_handle_vbus_change(ci);
>  
>         return 0;
>  }

  reply	other threads:[~2016-10-20  6:55 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-18  1:56 [PATCH v5 00/23] Support qcom's HSIC USB and rewrite USB2 HS support Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 03/23] usb: ulpi: Support device discovery via DT Stephen Boyd
2016-10-18 16:44   ` Rob Herring
2016-11-11 11:02   ` Heikki Krogerus
2016-10-18  1:56 ` [PATCH v5 04/23] usb: chipidea: Only read/write OTGSC from one place Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 05/23] usb: chipidea: Handle extcon events properly Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 06/23] usb: chipidea: Add platform flag for wrapper phy management Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 07/23] usb: chipidea: Notify events when switching host mode Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 08/23] usb: chipidea: Remove locking in ci_udc_start() Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 09/23] usb: chipidea: Add support for ULPI PHY bus Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 10/23] usb: chipidea: Consolidate extcon notifiers Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 11/23] usb: chipidea: Emulate OTGSC interrupt enable path Stephen Boyd
2016-10-19  1:15   ` Peter Chen
2016-10-19  1:53     ` Stephen Boyd
2016-10-19  8:02       ` Peter Chen
2016-10-20  6:55         ` Stephen Boyd [this message]
2016-10-20 10:10           ` Peter Chen
2016-10-20 20:36             ` Stephen Boyd
2016-10-21  2:14               ` Peter Chen
2016-10-21 17:57                 ` Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 12/23] usb: chipidea: msm: Mark device as runtime pm active Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 13/23] usb: chipidea: msm: Rely on core to override AHBBURST Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 14/23] usb: chipidea: msm: Use hw_write_id_reg() instead of writel Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 15/23] usb: chipidea: msm: Add proper clk and reset support Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 16/23] usb: chipidea: msm: Mux over secondary phy at the right time Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 17/23] usb: chipidea: msm: Restore wrapper settings after reset Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 18/23] usb: chipidea: msm: Make platform data driver local instead of global Stephen Boyd
     [not found] ` <20161018015636.11701-1-stephen.boyd-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2016-10-18  1:56   ` [PATCH v5 01/23] of: device: Support loading a module with OF based modalias Stephen Boyd
2016-10-18  1:56   ` [PATCH v5 02/23] of: device: Export of_device_{get_modalias,uvent_modalias} to modules Stephen Boyd
     [not found]     ` <20161018015636.11701-3-stephen.boyd-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2016-10-18  5:20       ` [PATCH v5 02/23] of: device: Export of_device_{get_modalias, uvent_modalias} " Chen-Yu Tsai
2016-10-24 12:19     ` Chen-Yu Tsai
2016-10-24 19:48       ` Stephen Boyd
2016-10-25  1:16         ` Peter Chen
2016-11-04 20:51           ` Stephen Boyd
2016-11-07  1:29             ` Peter Chen
2016-11-07  1:56               ` Chen-Yu Tsai
     [not found]                 ` <CAGb2v66C15fU1b2+xNDV8Fv2kmmKXyUknA8=9wXztUcs8CNKLg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-11-10 21:42                   ` Rob Herring
2016-11-11  3:01                     ` Chen-Yu Tsai
2016-11-11  4:25                       ` Javier Martinez Canillas
2016-10-18  1:56   ` [PATCH v5 19/23] usb: chipidea: msm: Add reset controller for PHY POR bit Stephen Boyd
2016-10-18  1:56   ` [PATCH v5 20/23] usb: chipidea: msm: Handle phy power states Stephen Boyd
2016-10-18  1:56   ` [PATCH v5 23/23] phy: Add support for Qualcomm's USB HS phy Stephen Boyd
2016-10-18 16:46     ` Rob Herring
2016-10-18 16:47     ` Rob Herring
     [not found]     ` <20161018015636.11701-24-stephen.boyd-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2016-10-20 23:20       ` Stephen Boyd
2016-10-21  2:20         ` Peter Chen
2016-10-21 19:33           ` Stephen Boyd
2016-10-24  2:14             ` Peter Chen
2016-10-18  9:31   ` [PATCH v5 00/23] Support qcom's HSIC USB and rewrite USB2 HS support Peter Chen
2016-10-18 20:51     ` Stephen Boyd
2016-11-11  7:40       ` Peter Chen
2016-11-14 19:35         ` Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 21/23] usb: chipidea: msm: Be silent on probe defer errors Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 22/23] phy: Add support for Qualcomm's USB HSIC phy Stephen Boyd

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=147694652997.28344.1048935134595924905@sboyd-linaro \
    --to=stephen.boyd@linaro.org \
    --cc=andy.gross@linaro.org \
    --cc=arnd@arndb.de \
    --cc=balbi@kernel.org \
    --cc=bjorn.andersson@linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=hzpeterchen@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=narmstrong@baylibre.com \
    --cc=peter.chen@nxp.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;
as well as URLs for NNTP newsgroup(s).