diff options
author | Alec Berg <alecaberg@chromium.org> | 2014-10-10 08:45:07 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-10-15 00:09:32 +0000 |
commit | 8b0fe914079793de4aa9dfa49ca83619b80e81b8 (patch) | |
tree | 0afc613a8911bf46d7f45c0fb5cd9f2e03b9e6a3 | |
parent | c222d7b700efa20cbe7bcf4d86e9f5a6e32e8550 (diff) | |
download | chrome-ec-8b0fe914079793de4aa9dfa49ca83619b80e81b8.tar.gz |
pd: samus: ryu: add back in Vconn support correctly
Add support for enabling Vconn on Raiden ports by defining
CONFIG_USBC_VCONN. This is enabled by default for ryu, samus,
and fruitpie.
BUG=chrome-os-partner:30445
BRANCH=samus
TEST=Load onto samus. Make sure we can still charge from zinger.
Plug in type-A to type-C adapter with pulldown and see that samus
becomes power source. Do a gpioget and verify that only one VCONN
GPIO is enabled (low), and the VCONN that is enabled is opposite of
the polarity queried by pd 1 state. Try both ports, both polarities
and make sure the correct VCONN gpio is enabled.
Change-Id: Icea4c18b9c813cf7e8e21fd4f455bbd5fb4dbc91
Signed-off-by: Alec Berg <alecaberg@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/222850
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r-- | board/fruitpie/board.h | 1 | ||||
-rw-r--r-- | board/fruitpie/usb_pd_config.h | 7 | ||||
-rw-r--r-- | board/ryu/board.h | 1 | ||||
-rw-r--r-- | board/ryu/gpio.inc | 4 | ||||
-rw-r--r-- | board/ryu/usb_pd_config.h | 7 | ||||
-rw-r--r-- | board/samus_pd/board.h | 1 | ||||
-rw-r--r-- | board/samus_pd/gpio.inc | 8 | ||||
-rw-r--r-- | board/samus_pd/usb_pd_config.h | 11 | ||||
-rw-r--r-- | common/usb_pd_protocol.c | 11 |
9 files changed, 43 insertions, 8 deletions
diff --git a/board/fruitpie/board.h b/board/fruitpie/board.h index 72549bc557..a79c9f580c 100644 --- a/board/fruitpie/board.h +++ b/board/fruitpie/board.h @@ -27,6 +27,7 @@ #define CONFIG_USB_PD_DUAL_ROLE #define CONFIG_USB_PD_INTERNAL_COMP #define CONFIG_USBC_SS_MUX +#define CONFIG_USBC_VCONN #define CONFIG_ADC #define CONFIG_HW_CRC #define CONFIG_I2C diff --git a/board/fruitpie/usb_pd_config.h b/board/fruitpie/usb_pd_config.h index d53da1c7b6..4f7639c2f5 100644 --- a/board/fruitpie/usb_pd_config.h +++ b/board/fruitpie/usb_pd_config.h @@ -138,6 +138,13 @@ static inline int pd_adc_read(int port, int cc) return adc_read_channel(ADC_CH_CC2_PD); } +static inline void pd_set_vconn(int port, int polarity, int enable) +{ + /* Set VCONN on the opposite CC line from the polarity */ + gpio_set_level(polarity ? GPIO_VCONN1_EN : + GPIO_VCONN2_EN, enable); +} + static inline int pd_snk_is_vbus_provided(int port) { return gpio_get_level(GPIO_VBUS_WAKE); diff --git a/board/ryu/board.h b/board/ryu/board.h index cfae1613bd..47104dc837 100644 --- a/board/ryu/board.h +++ b/board/ryu/board.h @@ -25,6 +25,7 @@ #define CONFIG_USB_PD_FLASH_ERASE_CHECK #define CONFIG_USB_PD_INTERNAL_COMP #define CONFIG_USBC_SS_MUX +#define CONFIG_USBC_VCONN #define CONFIG_ADC #define CONFIG_HW_CRC #define CONFIG_I2C diff --git a/board/ryu/gpio.inc b/board/ryu/gpio.inc index 52a3acb974..12f683b7a1 100644 --- a/board/ryu/gpio.inc +++ b/board/ryu/gpio.inc @@ -53,8 +53,8 @@ GPIO(BASE_CHG_VDD_EN, E, 5, GPIO_OUT_LOW, NULL) /* USB-C Power and muxes control */ GPIO(USBC_CHARGE_EN_L, A, 7, GPIO_OUT_LOW, NULL) GPIO(USBC_5V_EN, A, 10, GPIO_OUT_LOW, NULL) -GPIO(USBC_VCONN1_EN, F, 10, GPIO_OUT_HIGH, NULL) -GPIO(USBC_VCONN2_EN, D, 10, GPIO_OUT_HIGH, NULL) +GPIO(USBC_VCONN1_EN_L, F, 10, GPIO_OUT_HIGH, NULL) +GPIO(USBC_VCONN2_EN_L, D, 10, GPIO_OUT_HIGH, NULL) GPIO(USBC_CC1_DEVICE_ODL, A, 5, GPIO_ODR_LOW, NULL) GPIO(USBC_CC2_DEVICE_ODL, F, 9, GPIO_ODR_LOW, NULL) diff --git a/board/ryu/usb_pd_config.h b/board/ryu/usb_pd_config.h index cc1aa40f3c..3d7506d882 100644 --- a/board/ryu/usb_pd_config.h +++ b/board/ryu/usb_pd_config.h @@ -147,6 +147,13 @@ static inline int pd_adc_read(int port, int cc) return adc_read_channel(ADC_CC2_PD); } +static inline void pd_set_vconn(int port, int polarity, int enable) +{ + /* Set VCONN on the opposite CC line from the polarity */ + gpio_set_level(polarity ? GPIO_USBC_VCONN1_EN_L : + GPIO_USBC_VCONN2_EN_L, !enable); +} + static inline int pd_snk_is_vbus_provided(int port) { return gpio_get_level(GPIO_CHGR_ACOK); diff --git a/board/samus_pd/board.h b/board/samus_pd/board.h index e986375635..be1dad7f8d 100644 --- a/board/samus_pd/board.h +++ b/board/samus_pd/board.h @@ -36,6 +36,7 @@ #define CONFIG_USB_PD_FLASH_ERASE_CHECK #define CONFIG_USB_PD_INTERNAL_COMP #define CONFIG_USBC_SS_MUX +#define CONFIG_USBC_VCONN #define CONFIG_USB_SWITCH_TSU6721 #define CONFIG_VBOOT_HASH #undef CONFIG_WATCHDOG_HELP diff --git a/board/samus_pd/gpio.inc b/board/samus_pd/gpio.inc index 859ed11baa..293e50f5f4 100644 --- a/board/samus_pd/gpio.inc +++ b/board/samus_pd/gpio.inc @@ -46,10 +46,10 @@ GPIO(USB_C0_CHARGE_EN_L, D, 12, GPIO_OUT_LOW, NULL) GPIO(USB_C1_CHARGE_EN_L, D, 13, GPIO_OUT_LOW, NULL) GPIO(USB_C0_5V_EN, D, 14, GPIO_OUT_LOW, NULL) GPIO(USB_C1_5V_EN, D, 15, GPIO_OUT_LOW, NULL) -GPIO(USB_C0_CC1_VCONN1_EN, D, 8, GPIO_OUT_HIGH, NULL) -GPIO(USB_C0_CC2_VCONN1_EN, D, 9, GPIO_OUT_HIGH, NULL) -GPIO(USB_C1_CC1_VCONN1_EN, D, 10, GPIO_OUT_HIGH, NULL) -GPIO(USB_C1_CC2_VCONN1_EN, D, 11, GPIO_OUT_HIGH, NULL) +GPIO(USB_C0_CC1_VCONN1_EN_L, D, 8, GPIO_OUT_HIGH, NULL) +GPIO(USB_C0_CC2_VCONN1_EN_L, D, 9, GPIO_OUT_HIGH, NULL) +GPIO(USB_C1_CC1_VCONN1_EN_L, D, 10, GPIO_OUT_HIGH, NULL) +GPIO(USB_C1_CC2_VCONN1_EN_L, D, 11, GPIO_OUT_HIGH, NULL) GPIO(USB_C0_CC_1A5_EN, B, 12, GPIO_OUT_LOW, NULL) GPIO(USB_C1_CC_1A5_EN, E, 12, GPIO_OUT_LOW, NULL) GPIO(ILIM_ADJ_PWM, B, 15, GPIO_OUT_LOW, NULL) diff --git a/board/samus_pd/usb_pd_config.h b/board/samus_pd/usb_pd_config.h index 0d0372d51a..347af9c42d 100644 --- a/board/samus_pd/usb_pd_config.h +++ b/board/samus_pd/usb_pd_config.h @@ -227,6 +227,17 @@ static inline int pd_adc_read(int port, int cc) return adc_read_channel(cc ? ADC_C1_CC2_PD : ADC_C1_CC1_PD); } +static inline void pd_set_vconn(int port, int polarity, int enable) +{ + /* Set VCONN on the opposite CC line from the polarity */ + if (port == 0) + gpio_set_level(polarity ? GPIO_USB_C0_CC1_VCONN1_EN_L : + GPIO_USB_C0_CC2_VCONN1_EN_L, !enable); + else + gpio_set_level(polarity ? GPIO_USB_C1_CC1_VCONN1_EN_L : + GPIO_USB_C1_CC2_VCONN1_EN_L, !enable); +} + static inline int pd_snk_is_vbus_provided(int port) { return gpio_get_level(port ? GPIO_USB_C1_VBUS_WAKE : diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index 860ba924c4..4ed08a64d8 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -283,13 +283,16 @@ static inline void set_state(int port, enum pd_states next_state) set_state_timeout(port, 0, 0); pd[port].task_state = next_state; -#ifdef CONFIG_USBC_SS_MUX if (next_state == PD_STATE_SRC_DISCONNECTED) { pd[port].dev_id = 0; +#ifdef CONFIG_USBC_SS_MUX board_set_usb_mux(port, TYPEC_MUX_NONE, pd[port].polarity); - } #endif +#ifdef CONFIG_USBC_VCONN + pd_set_vconn(port, pd[port].polarity, 0); +#endif + } #ifdef CONFIG_LOW_POWER_IDLE /* If any PD port is connected, then disable deep sleep */ @@ -1246,6 +1249,10 @@ void pd_task(void) break; } +#ifdef CONFIG_USBC_VCONN + pd_set_vconn(port, pd[port].polarity, 1); +#endif + set_state(port, PD_STATE_SRC_DISCOVERY); caps_count = 0; #ifdef CONFIG_USB_PD_DUAL_ROLE |