All of lore.kernel.org
 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: Tue, 18 Oct 2016 18:53:07 -0700	[thread overview]
Message-ID: <147684198705.24897.12451889548508263144@sboyd-linaro> (raw)
In-Reply-To: <20161019011535.GC6294@b29397-desktop>

Quoting Peter Chen (2016-10-18 18:15:35)
> On Mon, Oct 17, 2016 at 06:56:24PM -0700, Stephen Boyd wrote:
> > In the case of an extcon-usb-gpio device being used with the
> > chipidea driver we'll sometimes miss the BSVIS event in the OTGSC
> > register. Consider the case where we don't have a cable attached
> > and the id pin is indicating "host" mode. When we plug in the usb
> > cable for "device" mode a gpio goes high and indicates that we
> > should do the role switch and that vbus is high. When we're in
> > "host" mode the OTGSC register doesn't have BSVIE set.
> 
> I have some questions for your description:
> 
> - Do you have any pending or related patches what this patch set
>   is based on? Afaik, the extcon-usb-gpio has no vbus event supported.

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.

> - 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.

> 
> Peter
> > 
> > The following scenario can happen:
> > 
> > CPU0
> > ----
> > <extcon notifier chain>
> >  ci_cable_notifier()
> >   update id cable state
> >   ci_irq()
> >    if (ci->is_otg && (otgsc & OTGSC_IDIE) && (otgsc & OTGSC_IDIS)) { // true
> >     ci->id_event = true;
> >     ci_otg_queue_work()
> >      schedule()
> > 
> > <extcon notifier event> // same task as before
> >  ci_cable_notifier()
> >   update vbus cable state
> >    ci_irq()
> >     if (ci->is_otg && (otgsc & OTGSC_BSVIE) && (otgsc & OTGSC_BSVIS)) // false
> >    return IRQ_NONE
> > 
> > ci_otg_work() // switch task to the workqueue now
> >  if (ci->id_event)
> >   ci_handle_id_switch()
> >    ci_role_stop()
> >     host_stop()
> >    hw_wait_vbus_lower_bsv(ci); // this times out because vbus is already set
> >    ci_role_start()
> >     udc_id_switch_for_device()
> >      hw_write_otgsc(ci, OTGSC_BSVIS | OTGSC_BSVIE, OTGSC_BSVIS | OTGSC_BSVIE);
> > 
> > At this point, we don't replay the vbus connect event because the
> > vbus event has already happened. This causes things like gadget
> > instances to never see vbus appear, and thus the gadget is never
> > started. Furthermore, we see timeout messages like:
> > 
> >       timeout waiting for 0000800 in OTGSC
> > 
> > Let's workaround this by skiping the wait for BSV when we're
> > using an extcon for the vbus notification and let's properly
> > emulate the BSVIS event that would happen when we enable the
> > vbus interrupt while enabling "device" mode.

WARNING: multiple messages have this Message-ID (diff)
From: stephen.boyd@linaro.org (Stephen Boyd)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v5 11/23] usb: chipidea: Emulate OTGSC interrupt enable path
Date: Tue, 18 Oct 2016 18:53:07 -0700	[thread overview]
Message-ID: <147684198705.24897.12451889548508263144@sboyd-linaro> (raw)
In-Reply-To: <20161019011535.GC6294@b29397-desktop>

Quoting Peter Chen (2016-10-18 18:15:35)
> On Mon, Oct 17, 2016 at 06:56:24PM -0700, Stephen Boyd wrote:
> > In the case of an extcon-usb-gpio device being used with the
> > chipidea driver we'll sometimes miss the BSVIS event in the OTGSC
> > register. Consider the case where we don't have a cable attached
> > and the id pin is indicating "host" mode. When we plug in the usb
> > cable for "device" mode a gpio goes high and indicates that we
> > should do the role switch and that vbus is high. When we're in
> > "host" mode the OTGSC register doesn't have BSVIE set.
> 
> I have some questions for your description:
> 
> - Do you have any pending or related patches what this patch set
>   is based on? Afaik, the extcon-usb-gpio has no vbus event supported.

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.

> - 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.

> 
> Peter
> > 
> > The following scenario can happen:
> > 
> > CPU0
> > ----
> > <extcon notifier chain>
> >  ci_cable_notifier()
> >   update id cable state
> >   ci_irq()
> >    if (ci->is_otg && (otgsc & OTGSC_IDIE) && (otgsc & OTGSC_IDIS)) { // true
> >     ci->id_event = true;
> >     ci_otg_queue_work()
> >      schedule()
> > 
> > <extcon notifier event> // same task as before
> >  ci_cable_notifier()
> >   update vbus cable state
> >    ci_irq()
> >     if (ci->is_otg && (otgsc & OTGSC_BSVIE) && (otgsc & OTGSC_BSVIS)) // false
> >    return IRQ_NONE
> > 
> > ci_otg_work() // switch task to the workqueue now
> >  if (ci->id_event)
> >   ci_handle_id_switch()
> >    ci_role_stop()
> >     host_stop()
> >    hw_wait_vbus_lower_bsv(ci); // this times out because vbus is already set
> >    ci_role_start()
> >     udc_id_switch_for_device()
> >      hw_write_otgsc(ci, OTGSC_BSVIS | OTGSC_BSVIE, OTGSC_BSVIS | OTGSC_BSVIE);
> > 
> > At this point, we don't replay the vbus connect event because the
> > vbus event has already happened. This causes things like gadget
> > instances to never see vbus appear, and thus the gadget is never
> > started. Furthermore, we see timeout messages like:
> > 
> >       timeout waiting for 0000800 in OTGSC
> > 
> > Let's workaround this by skiping the wait for BSV when we're
> > using an extcon for the vbus notification and let's properly
> > emulate the BSVIS event that would happen when we enable the
> > vbus interrupt while enabling "device" mode.

  reply	other threads:[~2016-10-19  1:53 UTC|newest]

Thread overview: 125+ 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 ` Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 03/23] usb: ulpi: Support device discovery via DT Stephen Boyd
2016-10-18  1:56   ` Stephen Boyd
2016-10-18  1:56   ` Stephen Boyd
2016-10-18 16:44   ` Rob Herring
2016-10-18 16:44     ` Rob Herring
2016-11-11 11:02   ` Heikki Krogerus
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   ` Stephen Boyd
2016-10-18  1:56   ` Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 05/23] usb: chipidea: Handle extcon events properly Stephen Boyd
2016-10-18  1:56   ` Stephen Boyd
2016-10-18  1:56   ` 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   ` 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   ` 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   ` 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   ` Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 10/23] usb: chipidea: Consolidate extcon notifiers Stephen Boyd
2016-10-18  1:56   ` Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 11/23] usb: chipidea: Emulate OTGSC interrupt enable path Stephen Boyd
2016-10-18  1:56   ` Stephen Boyd
2016-10-19  1:15   ` Peter Chen
2016-10-19  1:15     ` Peter Chen
2016-10-19  1:53     ` Stephen Boyd [this message]
2016-10-19  1:53       ` Stephen Boyd
2016-10-19  8:02       ` Peter Chen
2016-10-19  8:02         ` Peter Chen
2016-10-19  8:02         ` Peter Chen
2016-10-20  6:55         ` Stephen Boyd
2016-10-20  6:55           ` Stephen Boyd
2016-10-20 10:10           ` Peter Chen
2016-10-20 10:10             ` Peter Chen
2016-10-20 10:10             ` Peter Chen
2016-10-20 20:36             ` Stephen Boyd
2016-10-20 20:36               ` Stephen Boyd
2016-10-21  2:14               ` Peter Chen
2016-10-21  2:14                 ` Peter Chen
2016-10-21 17:57                 ` Stephen Boyd
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   ` 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   ` 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   ` 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   ` 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   ` 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   ` Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 18/23] usb: chipidea: msm: Make platform data driver local instead of global Stephen Boyd
2016-10-18  1:56   ` 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     ` Stephen Boyd
2016-10-18  1:56     ` Stephen Boyd
2016-10-18  1:56   ` [PATCH v5 02/23] of: device: Export of_device_{get_modalias,uvent_modalias} to modules Stephen Boyd
2016-10-18  1:56     ` [PATCH v5 02/23] of: device: Export of_device_{get_modalias, uvent_modalias} " Stephen Boyd
2016-10-18  1:56     ` [PATCH v5 02/23] of: device: Export of_device_{get_modalias,uvent_modalias} " 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-18  5:20         ` Chen-Yu Tsai
2016-10-18  5:20         ` Chen-Yu Tsai
2016-10-24 12:19     ` Chen-Yu Tsai
2016-10-24 12:19       ` Chen-Yu Tsai
2016-10-24 19:48       ` Stephen Boyd
2016-10-24 19:48         ` Stephen Boyd
2016-10-25  1:16         ` Peter Chen
2016-10-25  1:16           ` Peter Chen
2016-11-04 20:51           ` Stephen Boyd
2016-11-04 20:51             ` Stephen Boyd
2016-11-07  1:29             ` Peter Chen
2016-11-07  1:29               ` Peter Chen
2016-11-07  1:29               ` Peter Chen
2016-11-07  1:56               ` Chen-Yu Tsai
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-10 21:42                     ` Rob Herring
2016-11-10 21:42                     ` Rob Herring
2016-11-11  3:01                     ` Chen-Yu Tsai
2016-11-11  3:01                       ` Chen-Yu Tsai
2016-11-11  4:25                       ` Javier Martinez Canillas
2016-11-11  4:25                         ` Javier Martinez Canillas
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     ` Stephen Boyd
2016-10-18  1:56     ` 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     ` Stephen Boyd
2016-10-18  1:56     ` 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  1:56     ` Stephen Boyd
2016-10-18  1:56     ` Stephen Boyd
2016-10-18 16:46     ` Rob Herring
2016-10-18 16:46       ` Rob Herring
2016-10-18 16:47     ` 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-20 23:20         ` Stephen Boyd
2016-10-20 23:20         ` Stephen Boyd
2016-10-21  2:20         ` Peter Chen
2016-10-21  2:20           ` Peter Chen
2016-10-21 19:33           ` Stephen Boyd
2016-10-21 19:33             ` Stephen Boyd
2016-10-24  2:14             ` Peter Chen
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  9:31     ` Peter Chen
2016-10-18  9:31     ` Peter Chen
2016-10-18 20:51     ` Stephen Boyd
2016-10-18 20:51       ` Stephen Boyd
2016-11-11  7:40       ` Peter Chen
2016-11-11  7:40         ` Peter Chen
2016-11-11  7:40         ` Peter Chen
2016-11-14 19:35         ` Stephen Boyd
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   ` Stephen Boyd
2016-10-18  1:56 ` [PATCH v5 22/23] phy: Add support for Qualcomm's USB HSIC phy Stephen Boyd
2016-10-18  1:56   ` 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=147684198705.24897.12451889548508263144@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 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.