summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Broch <tbroch@chromium.org>2015-02-12 11:22:34 -0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-02-25 03:33:12 +0000
commite20d019fc4494d2340b227ed0c42c29ca39c85d3 (patch)
tree0116ec759d2c1365bfcdb2b26856b883a9c25981
parentc3cd10937e321f04c4b2dfc4786ec146e785e5cb (diff)
downloadchrome-ec-e20d019fc4494d2340b227ed0c42c29ca39c85d3.tar.gz
pd: Massage initialization at task start.
Refactoring effort to unify the set of PD intialization tasks that need to occur. Those areas include: 1. host mode as it relates to power & pull-ups/downs 2. PD tx init 3. PD mux settings Signed-off-by: Todd Broch <tbroch@chromium.org> BRANCH=samus BUG=chrome-os-partner:36481 TEST=manual, 1. compiles and functions on samus_pd 2. If sysjump w/ dongle connected than alternate mode re-entered properly including muxing and HPD Change-Id: I47f32acaeccbd7745e1e01a8b085b1804c4c5000 Reviewed-on: https://chromium-review.googlesource.com/249273 Reviewed-by: Alec Berg <alecaberg@chromium.org> Tested-by: Alec Berg <alecaberg@chromium.org> Commit-Queue: Alec Berg <alecaberg@chromium.org>
-rw-r--r--board/dingdong/usb_pd_config.h6
-rw-r--r--board/firefly/usb_pd_config.h6
-rw-r--r--board/fruitpie/usb_pd_config.h19
-rw-r--r--board/hoho/usb_pd_config.h6
-rw-r--r--board/host/usb_pd_config.c5
-rw-r--r--board/host/usb_pd_config.h2
-rw-r--r--board/plankton/usb_pd_config.h16
-rw-r--r--board/ryu/usb_pd_config.h19
-rw-r--r--board/samus_pd/usb_pd_config.h21
-rw-r--r--board/twinkie/injector.c2
-rw-r--r--board/twinkie/usb_pd_config.h12
-rw-r--r--board/zinger/usb_pd_config.h2
-rw-r--r--chip/host/usb_pd_phy.c3
-rw-r--r--chip/stm32/usb_pd_phy.c5
-rw-r--r--common/charge_ramp.c1
-rw-r--r--common/usb_pd_protocol.c25
-rw-r--r--include/usb_pd.h3
17 files changed, 121 insertions, 32 deletions
diff --git a/board/dingdong/usb_pd_config.h b/board/dingdong/usb_pd_config.h
index 185adf151d..0d9cf41b7c 100644
--- a/board/dingdong/usb_pd_config.h
+++ b/board/dingdong/usb_pd_config.h
@@ -118,6 +118,12 @@ static inline void pd_tx_init(void)
static inline void pd_set_host_mode(int port, int enable) {}
+static inline void pd_config_init(int port, uint8_t power_role)
+{
+ /* Initialize TX pins and put them in Hi-Z */
+ pd_tx_init();
+}
+
static inline int pd_adc_read(int port, int cc)
{
/* only one CC line, assume other one is always low */
diff --git a/board/firefly/usb_pd_config.h b/board/firefly/usb_pd_config.h
index 9afaf00670..f006e30709 100644
--- a/board/firefly/usb_pd_config.h
+++ b/board/firefly/usb_pd_config.h
@@ -125,6 +125,12 @@ static inline void pd_set_host_mode(int port, int enable)
{
}
+static inline void pd_config_init(int port, uint8_t power_role)
+{
+ /* Initialize TX pins and put them in Hi-Z */
+ pd_tx_init();
+}
+
static inline int pd_adc_read(int port, int cc)
{
if (cc == 0)
diff --git a/board/fruitpie/usb_pd_config.h b/board/fruitpie/usb_pd_config.h
index acf0f6f6ca..e2f184f9d9 100644
--- a/board/fruitpie/usb_pd_config.h
+++ b/board/fruitpie/usb_pd_config.h
@@ -136,12 +136,27 @@ static inline void pd_set_host_mode(int port, int enable)
* Initialize various GPIOs and interfaces to safe state at start of pd_task.
*
* These include:
+ * VBUS, charge path based on power role.
+ * Physical layer CC transmit.
* VCONNs disabled.
*
- * @param port USB-C port number
+ * @param port USB-C port number
+ * @param power_role Power role of device
*/
-static inline void pd_config_init(int port)
+static inline void pd_config_init(int port, uint8_t power_role)
{
+ /*
+ * Set CC pull resistors, and charge_en and vbus_en GPIOs to match
+ * the initial role.
+ */
+ pd_set_host_mode(port, power_role);
+
+ /* Initialize TX pins and put them in Hi-Z */
+ pd_tx_init();
+
+ /* Reset mux ... for NONE polarity doesn't matter */
+ board_set_usb_mux(port, TYPEC_MUX_NONE, 0);
+
gpio_set_level(GPIO_VCONN1_EN, 0);
gpio_set_level(GPIO_VCONN2_EN, 0);
}
diff --git a/board/hoho/usb_pd_config.h b/board/hoho/usb_pd_config.h
index 185adf151d..0d9cf41b7c 100644
--- a/board/hoho/usb_pd_config.h
+++ b/board/hoho/usb_pd_config.h
@@ -118,6 +118,12 @@ static inline void pd_tx_init(void)
static inline void pd_set_host_mode(int port, int enable) {}
+static inline void pd_config_init(int port, uint8_t power_role)
+{
+ /* Initialize TX pins and put them in Hi-Z */
+ pd_tx_init();
+}
+
static inline int pd_adc_read(int port, int cc)
{
/* only one CC line, assume other one is always low */
diff --git a/board/host/usb_pd_config.c b/board/host/usb_pd_config.c
index aec495a0c9..15ea815d47 100644
--- a/board/host/usb_pd_config.c
+++ b/board/host/usb_pd_config.c
@@ -22,6 +22,11 @@ test_mockable void pd_set_host_mode(int port, int enable)
/* Not implemented */
}
+test_mockable void pd_config_init(int port, uint8_t power_role)
+{
+ /* Not implemented */
+}
+
test_mockable int pd_adc_read(int port, int cc)
{
/* Not implemented */
diff --git a/board/host/usb_pd_config.h b/board/host/usb_pd_config.h
index 8ce979062e..ed4f8e5960 100644
--- a/board/host/usb_pd_config.h
+++ b/board/host/usb_pd_config.h
@@ -22,6 +22,8 @@ void pd_tx_init(void);
void pd_set_host_mode(int port, int enable);
+void pd_config_init(int port, uint8_t power_role);
+
int pd_adc_read(int port, int cc);
int pd_snk_is_vbus_provided(int port);
diff --git a/board/plankton/usb_pd_config.h b/board/plankton/usb_pd_config.h
index c1fefbcf7e..23bdd82d0e 100644
--- a/board/plankton/usb_pd_config.h
+++ b/board/plankton/usb_pd_config.h
@@ -133,12 +133,24 @@ static inline void pd_set_host_mode(int port, int enable)
* Initialize various GPIOs and interfaces to safe state at start of pd_task.
*
* These include:
+ * VBUS, charge path based on power role.
+ * Physical layer CC transmit.
* VCONNs disabled.
*
- * @param port USB-C port number
+ * @param port USB-C port number
+ * @param power_role Power role of device
*/
-static inline void pd_config_init(int port)
+static inline void pd_config_init(int port, uint8_t power_role)
{
+ /*
+ * Set CC pull resistors, and charge_en and vbus_en GPIOs to match
+ * the initial role.
+ */
+ pd_set_host_mode(port, power_role);
+
+ /* Initialize TX pins and put them in Hi-Z */
+ pd_tx_init();
+
gpio_set_level(GPIO_USB_CC1_VCONN_EN_L, 1);
gpio_set_level(GPIO_USB_CC2_VCONN_EN_L, 1);
}
diff --git a/board/ryu/usb_pd_config.h b/board/ryu/usb_pd_config.h
index b786244617..ee0ef268c6 100644
--- a/board/ryu/usb_pd_config.h
+++ b/board/ryu/usb_pd_config.h
@@ -153,12 +153,27 @@ static inline void pd_set_host_mode(int port, int enable)
* Initialize various GPIOs and interfaces to safe state at start of pd_task.
*
* These include:
+ * VBUS, charge path based on power role.
+ * Physical layer CC transmit.
* VCONNs disabled.
*
- * @param port USB-C port number
+ * @param port USB-C port number
+ * @param power_role Power role of device
*/
-static inline void pd_config_init(int port)
+static inline void pd_config_init(int port, uint8_t power_role)
{
+ /*
+ * Set CC pull resistors, and charge_en and vbus_en GPIOs to match
+ * the initial role.
+ */
+ pd_set_host_mode(port, power_role);
+
+ /* Initialize TX pins and put them in Hi-Z */
+ pd_tx_init();
+
+ /* Reset mux ... for NONE polarity doesn't matter */
+ board_set_usb_mux(port, TYPEC_MUX_NONE, 0);
+
gpio_set_level(GPIO_USBC_VCONN1_EN_L, 1);
gpio_set_level(GPIO_USBC_VCONN2_EN_L, 1);
}
diff --git a/board/samus_pd/usb_pd_config.h b/board/samus_pd/usb_pd_config.h
index 3fede784e2..9702714a56 100644
--- a/board/samus_pd/usb_pd_config.h
+++ b/board/samus_pd/usb_pd_config.h
@@ -228,18 +228,35 @@ static inline void pd_set_host_mode(int port, int enable)
* Initialize various GPIOs and interfaces to safe state at start of pd_task.
*
* These include:
+ * VBUS, charge path based on power role.
+ * Physical layer CC transmit.
* VCONNs disabled.
*
- * @param port USB-C port number
+ * @param port USB-C port number
+ * @param power_role Power role of device
*/
-static inline void pd_config_init(int port)
+static inline void pd_config_init(int port, uint8_t power_role)
{
+ /*
+ * Set CC pull resistors, and charge_en and vbus_en GPIOs to match
+ * the initial role.
+ */
+ pd_set_host_mode(port, power_role);
+
+ /* Initialize TX pins and put them in Hi-Z */
+ pd_tx_init();
+
+ /* Reset mux ... for NONE polarity doesn't matter */
+ board_set_usb_mux(port, TYPEC_MUX_NONE, 0);
+
if (port == 0) {
gpio_set_level(GPIO_USB_C0_CC1_VCONN1_EN_L, 1);
gpio_set_level(GPIO_USB_C0_CC2_VCONN1_EN_L, 1);
+ gpio_set_level(GPIO_USB_C0_DP_HPD, 0);
} else {
gpio_set_level(GPIO_USB_C1_CC1_VCONN1_EN_L, 1);
gpio_set_level(GPIO_USB_C1_CC2_VCONN1_EN_L, 1);
+ gpio_set_level(GPIO_USB_C1_DP_HPD, 0);
}
}
diff --git a/board/twinkie/injector.c b/board/twinkie/injector.c
index 81e5217dfb..916bc1c65e 100644
--- a/board/twinkie/injector.c
+++ b/board/twinkie/injector.c
@@ -82,7 +82,7 @@ static void twinkie_init(void)
/* configure TX clock pins */
gpio_config_module(MODULE_USB_PD, 1);
/* Initialize physical layer */
- pd_hw_init(0);
+ pd_hw_init(0, PD_ROLE_SINK);
}
DECLARE_HOOK(HOOK_INIT, twinkie_init, HOOK_PRIO_DEFAULT);
diff --git a/board/twinkie/usb_pd_config.h b/board/twinkie/usb_pd_config.h
index 67a472fff4..466cc40905 100644
--- a/board/twinkie/usb_pd_config.h
+++ b/board/twinkie/usb_pd_config.h
@@ -165,6 +165,18 @@ static inline void pd_set_host_mode(int port, int enable)
}
}
+static inline void pd_config_init(int port, uint8_t power_role)
+{
+ /*
+ * Set CC pull resistors, and charge_en and vbus_en GPIOs to match
+ * the initial role.
+ */
+ pd_set_host_mode(port, power_role);
+
+ /* Initialize TX pins and put them in Hi-Z */
+ pd_tx_init();
+}
+
static inline int pd_adc_read(int port, int cc)
{
if (cc == 0)
diff --git a/board/zinger/usb_pd_config.h b/board/zinger/usb_pd_config.h
index e87580a89e..f31087fab2 100644
--- a/board/zinger/usb_pd_config.h
+++ b/board/zinger/usb_pd_config.h
@@ -105,6 +105,8 @@ static inline void pd_tx_init(void)
/* Already done in hardware_init() */
}
+static inline void pd_config_init(int port, uint8_t power_role) {}
+
static inline int pd_adc_read(int port, int cc)
{
/* only one CC line, assume other one is always high */
diff --git a/chip/host/usb_pd_phy.c b/chip/host/usb_pd_phy.c
index bd75bd2d6b..44cba80c06 100644
--- a/chip/host/usb_pd_phy.c
+++ b/chip/host/usb_pd_phy.c
@@ -286,8 +286,9 @@ void pd_hw_release(int port)
pd_phy[port].hw_init_done = 0;
}
-void pd_hw_init(int port)
+void pd_hw_init(int port, int role)
{
+ pd_config_init(port, role);
pd_phy[port].hw_init_done = 1;
}
diff --git a/chip/stm32/usb_pd_phy.c b/chip/stm32/usb_pd_phy.c
index e0f3204b1b..6e7e85991a 100644
--- a/chip/stm32/usb_pd_phy.c
+++ b/chip/stm32/usb_pd_phy.c
@@ -489,11 +489,14 @@ void pd_hw_release(int port)
}
/* --- Startup initialization --- */
-void pd_hw_init(int port)
+void pd_hw_init(int port, int role)
{
struct pd_physical *phy = &pd_phy[port];
uint32_t val;
+ /* Initialize all PD pins to default state based on desired role */
+ pd_config_init(port, role);
+
/* set 40 MHz pin speed on communication pins */
pd_set_pins_speed(port);
diff --git a/common/charge_ramp.c b/common/charge_ramp.c
index 37bc45942d..9b38b1f0fe 100644
--- a/common/charge_ramp.c
+++ b/common/charge_ramp.c
@@ -11,6 +11,7 @@
#include "console.h"
#include "task.h"
#include "timer.h"
+#include "usb_pd.h"
#include "usb_pd_config.h"
#include "util.h"
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c
index d1f92efd08..5a27e3cfb4 100644
--- a/common/usb_pd_protocol.c
+++ b/common/usb_pd_protocol.c
@@ -1757,20 +1757,11 @@ void pd_task(void)
timestamp_t now;
int caps_count = 0, hard_reset_sent = 0;
-#ifdef CONFIG_USB_PD_DUAL_ROLE
- /*
- * Set CC pull resistors, and charge_en and vbus_en GPIOs to match
- * the initial role.
- */
- pd_set_host_mode(port, PD_ROLE_DEFAULT == PD_ROLE_SOURCE);
-#endif
-
- /* Initialize TX pins and put them in Hi-Z */
- pd_tx_init();
+ /* Ensure the power supply is in the default state */
+ pd_power_supply_reset(port);
-#if defined(CONFIG_USB_PD_DUAL_ROLE) && defined(CONFIG_USB_PD_ALT_MODE_DFP)
- pd_config_init(port);
-#endif
+ /* Initialize physical layer */
+ pd_hw_init(port, PD_ROLE_DEFAULT);
/* Initialize PD protocol state variables for each port. */
pd[port].power_role = PD_ROLE_DEFAULT;
@@ -1779,12 +1770,6 @@ void pd_task(void)
pd[port].flags = 0;
set_state(port, PD_DEFAULT_STATE);
- /* Ensure the power supply is in the default state */
- pd_power_supply_reset(port);
-
- /* Initialize physical layer */
- pd_hw_init(port);
-
#ifdef CONFIG_USB_PD_ALT_MODE_DFP
/* Initialize PD Policy engine */
pd_dfp_pe_init(port);
@@ -2282,7 +2267,7 @@ void pd_task(void)
while (pd[port].task_state == PD_STATE_SUSPENDED)
task_wait_event(-1);
- pd_hw_init(port);
+ pd_hw_init(port, PD_ROLE_DEFAULT);
break;
case PD_STATE_SNK_DISCONNECTED:
timeout = 10*MSEC;
diff --git a/include/usb_pd.h b/include/usb_pd.h
index 2e4e62f70e..14200efa2c 100644
--- a/include/usb_pd.h
+++ b/include/usb_pd.h
@@ -1264,8 +1264,9 @@ void pd_hw_release(int port);
* Initialize the hardware used for PD RX/TX.
*
* @param port USB-C port number
+ * @param role Role to initialize pins in
*/
-void pd_hw_init(int port);
+void pd_hw_init(int port, int role);
/* --- Protocol layer functions --- */
/**