Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1548108

[PATCH v6 11/25] usb: chipidea: vbus event may exist before starting gadget

From Stephen Boyd <stephen.boyd@linaro.org>
Newsgroups linux.kernel
Subject [PATCH v6 11/25] usb: chipidea: vbus event may exist before starting gadget
Date 2016-12-29 00:10 +0100
Message-ID <sTvw6-6Mq-27@gated-at.bofh.it> (permalink)
References <sTvmp-6sL-3@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Peter Chen <peter.chen@nxp.com>

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>
Tested-by: Stephen Boyd <stephen.boyd@linaro.org>
Reviewed-by: Stephen Boyd <stephen.boyd@linaro.org>
[sboyd@codeaurora.org: Modify comment text per list discussion]
Signed-off-by: Stephen Boyd <stephen.boyd@linaro.org>
---
 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;
 }
-- 
2.10.0.297.gf6727b0

Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH v6 00/25] Support qcom's HSIC USB and rewrite USB2 HS support Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 01/25] of: device: Support loading a module with OF based modalias Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 03/25] usb: ulpi: Support device discovery via DT Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 07/25] usb: chipidea: Notify events when switching host mode Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 15/25] usb: chipidea: msm: Add proper clk and reset support Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 08/25] usb: chipidea: Remove locking in ci_udc_start() Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 14/25] usb: chipidea: msm: Use hw_write_id_reg() instead of writel Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 04/25] usb: chipidea: Only read/write OTGSC from one place Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 06/25] usb: chipidea: Add platform flag for wrapper phy management Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 13/25] usb: chipidea: msm: Rely on core to override AHBBURST Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 10/25] usb: chipidea: Consolidate extcon notifiers Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 05/25] usb: chipidea: Handle extcon events properly Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 11/25] usb: chipidea: vbus event may exist before starting gadget Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
    Re: [PATCH v6 11/25] usb: chipidea: vbus event may exist before  starting gadget Peter Chen <hzpeterchen@gmail.com> - 2017-01-03 09:10 +0100
  [PATCH v6 02/25] of: device: Export of_device_{get_modalias,uvent_modalias} to modules Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100
  [PATCH v6 16/25] usb: chipidea: msm: Mux over secondary phy at the right time Stephen Boyd <stephen.boyd@linaro.org> - 2016-12-29 00:10 +0100

csiph-web