From patchwork Wed Dec 28 22:56:57 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Boyd X-Patchwork-Id: 9490751 X-Patchwork-Delegate: agross@codeaurora.org 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 7ECB262AB0 for ; Wed, 28 Dec 2016 23:01:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 69FA626242 for ; Wed, 28 Dec 2016 23:01:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5EF6126490; Wed, 28 Dec 2016 23:01:19 +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=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0C75F26242 for ; Wed, 28 Dec 2016 23:01:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752507AbcL1XBD (ORCPT ); Wed, 28 Dec 2016 18:01:03 -0500 Received: from mail-pg0-f47.google.com ([74.125.83.47]:34386 "EHLO mail-pg0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752191AbcL1W51 (ORCPT ); Wed, 28 Dec 2016 17:57:27 -0500 Received: by mail-pg0-f47.google.com with SMTP id y62so107848181pgy.1 for ; Wed, 28 Dec 2016 14:57:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Lge0vQ1Lfv7+XSNiuVO0keAqpW3VpQpLDSqt3nNiba0=; b=aE7MXwibYaDpNkc1KMihuwJALkshbh4J3T2iQ5Np+1+Oa35jD89b1eRTZSV0Y0I4c5 S9rTuiCl1o0NJC1wG7iB4ejywSUkmkpDdQX9mttzrkTay5zZULPLK2BQVYUa2bznS3ww qBlRJ5pSe0PypzsvFDToaut7AFI7OSjrv/U4Y= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Lge0vQ1Lfv7+XSNiuVO0keAqpW3VpQpLDSqt3nNiba0=; b=YqhwLt2511AxzfBgGjgpaxcgn1nl3FhGX4VYn8t47pbNPqwa+Fjdzaz06xxDyxzhmn BKQBHImqZi/9CcbqvkdT+7MrDpuqhVq3cZuG/RIqdOgsyfGmnN81KMe7ZlwDHLDi8oZI kTV5uy3KPCfO+UT+s8zTUtIElQ4Ri1r/eavm43AAuz8gNEXXKdTHQpW4FgWvdFevVadC dnpeA0Sl66YY3A03f5sGhUKXAlhLzTPGnrZuZaX4vrHPQ9tYlXIwD99SRYWmdjpkKhOY J0BWz3W3WYMhWJN9kC3gKNriiOaDi01EODXLYWg88j30SrjEfgLHy6qABD1/H68JXKqa NFKg== X-Gm-Message-State: AIkVDXIYZqTB07GolR2g5qLHTzpjU2JN5h4oSsHKUHhV0ZtE7Ja9bd3DGZBC5s3bL8GnUFxQ X-Received: by 10.84.217.18 with SMTP id o18mr83325907pli.45.1482965846581; Wed, 28 Dec 2016 14:57:26 -0800 (PST) Received: from localhost.localdomain (i-global254.qualcomm.com. [199.106.103.254]) by smtp.gmail.com with ESMTPSA id x4sm100355741pgc.14.2016.12.28.14.57.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 28 Dec 2016 14:57:25 -0800 (PST) From: Stephen Boyd To: linux-usb@vger.kernel.org Cc: Peter Chen , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Andy Gross , Bjorn Andersson , Neil Armstrong , Arnd Bergmann , Felipe Balbi Subject: [PATCH v6 11/25] usb: chipidea: vbus event may exist before starting gadget Date: Wed, 28 Dec 2016 14:56:57 -0800 Message-Id: <20161228225711.698-12-stephen.boyd@linaro.org> X-Mailer: git-send-email 2.10.0.297.gf6727b0 In-Reply-To: <20161228225711.698-1-stephen.boyd@linaro.org> References: <20161228225711.698-1-stephen.boyd@linaro.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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; }