summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlec Berg <alecaberg@chromium.org>2014-10-10 08:45:07 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-10-15 00:09:32 +0000
commit8b0fe914079793de4aa9dfa49ca83619b80e81b8 (patch)
tree0afc613a8911bf46d7f45c0fb5cd9f2e03b9e6a3
parentc222d7b700efa20cbe7bcf4d86e9f5a6e32e8550 (diff)
downloadchrome-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.h1
-rw-r--r--board/fruitpie/usb_pd_config.h7
-rw-r--r--board/ryu/board.h1
-rw-r--r--board/ryu/gpio.inc4
-rw-r--r--board/ryu/usb_pd_config.h7
-rw-r--r--board/samus_pd/board.h1
-rw-r--r--board/samus_pd/gpio.inc8
-rw-r--r--board/samus_pd/usb_pd_config.h11
-rw-r--r--common/usb_pd_protocol.c11
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