From patchwork Tue Jan 3 08:00:31 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Chen X-Patchwork-Id: 9494591 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 96717606A9 for ; Tue, 3 Jan 2017 08:01:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8789C2015F for ; Tue, 3 Jan 2017 08:01:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7A41C269DA; Tue, 3 Jan 2017 08:01:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,FREEMAIL_FROM,RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D377F2015F for ; Tue, 3 Jan 2017 08:01:35 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1cOK11-00048y-FD; Tue, 03 Jan 2017 08:00:15 +0000 Received: from mail-pg0-x242.google.com ([2607:f8b0:400e:c05::242]) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1cOK0x-0003d6-Ns for linux-arm-kernel@lists.infradead.org; Tue, 03 Jan 2017 08:00:12 +0000 Received: by mail-pg0-x242.google.com with SMTP id n5so32798782pgh.3 for ; Mon, 02 Jan 2017 23:59:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=KVjmqo3q3qCkPaa4JGSR3a0mbJIopW2ssL/DywvqTf8=; b=I3hs2rn6LikL3rx/T4RnR1C8w9u3t6PV/gZAfDOBhdRC5Y8rJr32AGs+c0rVytw7QP XPNEUNtxLg0FWh1UpLE5wQOjYmRgEaK6PkigGc3ZsRBlWvJR00IOlIb1X8KGkVzuF1+W dJc/ZLF8UwMEV5gAUTF+NjTNCHo8ylnj0vImBcsxajAvolXzhef/tb9OBvSgBs4BRMeL 9Me7K3Wg3F5Rn6jh1HPLMnrN8tk6lnb4JupFWVdogqbPBsXlLRtvPcho4QeXwrEn/zFX DKwZmzg0DphgNmT3aELRdjefkEs0NBAB3doSA1l4AXAl6nleeMzgrYGpx8pTLuBseUwP RzSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=KVjmqo3q3qCkPaa4JGSR3a0mbJIopW2ssL/DywvqTf8=; b=V7SUbpO5ZCw5koTgzaRHEmGYM46xgLMM4DMfhjIb+FH+EZSLlNHhDac53TMVysyqCc ZMBFJKH/8fUAebtbECKiNSr7GC0oL4uLKWapnJberxcTn2RaiktrK/k+yEVTYyXvITpf u8gh8wJDKa7jIY7+ybeyj/q6ww0KCKu9MwIKk/O7WzoQAdh1eQB79vVBsTVO+TpeWVLG tkJiYGWNoN7bICSXv4VPcdy6Rpb1fEwJcV5kTdhXknNRPCtkkrNZeQvkrWVRmV7tC3AU 5uJH9yrEbZrMije+6b6xfSnfKPfWbsX6uCyK/m3+t/Wywlx4cidkx72+8ggNZl/fQs5f Ygfw== X-Gm-Message-State: AIkVDXJK8JHD3IcnlGjOcBQBg5lavGAqrA201+FdfBm8DJwEieonhhY20uJRVYvXtbFrKQ== X-Received: by 10.99.229.17 with SMTP id r17mr113766384pgh.149.1483430390748; Mon, 02 Jan 2017 23:59:50 -0800 (PST) Received: from b29397-desktop (gate-zmy3.freescale.com. [192.88.167.1]) by smtp.gmail.com with ESMTPSA id t3sm94991833pfb.60.2017.01.02.23.59.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 Jan 2017 23:59:50 -0800 (PST) Date: Tue, 3 Jan 2017 16:00:31 +0800 From: Peter Chen To: Stephen Boyd Subject: Re: [PATCH v6 11/25] usb: chipidea: vbus event may exist before starting gadget Message-ID: <20170103080031.GC14542@b29397-desktop> References: <20161228225711.698-1-stephen.boyd@linaro.org> <20161228225711.698-12-stephen.boyd@linaro.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20161228225711.698-12-stephen.boyd@linaro.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170103_000011_850170_FDC4E5DD X-CRM114-Status: GOOD ( 21.58 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Chen , Arnd Bergmann , Neil Armstrong , linux-arm-msm@vger.kernel.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Bjorn Andersson , Andy Gross , linux-arm-kernel@lists.infradead.org, Felipe Balbi Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP On Wed, Dec 28, 2016 at 02:56:57PM -0800, Stephen Boyd wrote: > From: Peter Chen > > 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 > Tested-by: Stephen Boyd > Reviewed-by: Stephen Boyd > [sboyd@codeaurora.org: Modify comment text per list discussion] > Signed-off-by: Stephen Boyd > --- > drivers/usb/chipidea/core.c | 4 ---- > drivers/usb/chipidea/otg.c | 14 +++++++++----- > drivers/usb/chipidea/udc.c | 2 ++ > 3 files changed, 11 insertions(+), 9 deletions(-) > > diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c > index 8a020ebbbe2f..37f888e31f10 100644 > --- a/drivers/usb/chipidea/core.c > +++ b/drivers/usb/chipidea/core.c > @@ -979,10 +979,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 695f3fe3ae21..c972ed23b8ec 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,14 @@ 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 > + * wait vbus lower than OTGSC_BSV before connecting to > + * host. If connecting status is from an external > + * connector instead of register, we don't need to care > + * vbus on the board, since it will not affect external > + * connector status. > */ > hw_wait_vbus_lower_bsv(ci); > > diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c > index 732b281485de..0db56fb7e9e9 100644 > --- a/drivers/usb/chipidea/udc.c > +++ b/drivers/usb/chipidea/udc.c > @@ -1961,6 +1961,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 */ > + ci_handle_vbus_change(ci); > > return 0; After thinking more, the above change will affect OTG FSM which calls this API too, but handle vbus change later, see ci_otg_start_host and ci_otg_start_gadget. How about changing patch like below: drivers/usb/chipidea/otg.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/usb/chipidea/otg.c b/drivers/usb/chipidea/otg.c index 695f3fe..10236fe 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,14 +175,21 @@ 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 + * Wait vbus lower than OTGSC_BSV before connecting + * to host. If connecting status is from an external + * connector instead of register, we don't need to + * care vbus on the board, since it will not affect + * external connector status. */ hw_wait_vbus_lower_bsv(ci); ci_role_start(ci, role); + /* vbus change may have already occurred */ + if (role == CI_ROLE_GADGET) + ci_handle_vbus_change(ci); } } /**