diff options
author | Todd Broch <tbroch@chromium.org> | 2015-02-12 11:22:34 -0800 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-02-25 03:33:12 +0000 |
commit | e20d019fc4494d2340b227ed0c42c29ca39c85d3 (patch) | |
tree | 0116ec759d2c1365bfcdb2b26856b883a9c25981 | |
parent | c3cd10937e321f04c4b2dfc4786ec146e785e5cb (diff) | |
download | chrome-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.h | 6 | ||||
-rw-r--r-- | board/firefly/usb_pd_config.h | 6 | ||||
-rw-r--r-- | board/fruitpie/usb_pd_config.h | 19 | ||||
-rw-r--r-- | board/hoho/usb_pd_config.h | 6 | ||||
-rw-r--r-- | board/host/usb_pd_config.c | 5 | ||||
-rw-r--r-- | board/host/usb_pd_config.h | 2 | ||||
-rw-r--r-- | board/plankton/usb_pd_config.h | 16 | ||||
-rw-r--r-- | board/ryu/usb_pd_config.h | 19 | ||||
-rw-r--r-- | board/samus_pd/usb_pd_config.h | 21 | ||||
-rw-r--r-- | board/twinkie/injector.c | 2 | ||||
-rw-r--r-- | board/twinkie/usb_pd_config.h | 12 | ||||
-rw-r--r-- | board/zinger/usb_pd_config.h | 2 | ||||
-rw-r--r-- | chip/host/usb_pd_phy.c | 3 | ||||
-rw-r--r-- | chip/stm32/usb_pd_phy.c | 5 | ||||
-rw-r--r-- | common/charge_ramp.c | 1 | ||||
-rw-r--r-- | common/usb_pd_protocol.c | 25 | ||||
-rw-r--r-- | include/usb_pd.h | 3 |
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 --- */ /** |