usbc: fix vbus discharge path for GPIO

Code on Tot assumes that port count was the port to
discharge instead of port parameter

BRANCH=none
BUG=none
TEST=verified with unit test (in this CL)

Change-Id: I17658a0c555f9cea56fa4ec1652e0faf62e3d6cc
Signed-off-by: Jett Rink <jettrink@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1896125
This commit is contained in:
Jett Rink 2019-11-01 16:14:12 -06:00 committed by Commit Bot
parent b3cb8a6f81
commit cf54e8664f
5 changed files with 49 additions and 15 deletions

View File

@ -29,3 +29,5 @@ GPIO(BASE_CHG_VDD_EN, PIN(0, 12), 0)
/* Fingerprint */ /* Fingerprint */
GPIO(SPI1_NSS, PIN(0, 13), GPIO_OUT_HIGH) GPIO(SPI1_NSS, PIN(0, 13), GPIO_OUT_HIGH)
GPIO(USB_C0_DISCHARGE, PIN(0, 15), 0)

View File

@ -4405,7 +4405,6 @@ int pd_charge_from_device(uint16_t vid, uint16_t pid)
(pid == USB_PID1_APPLE || pid == USB_PID2_APPLE)); (pid == USB_PID1_APPLE || pid == USB_PID2_APPLE));
} }
#ifdef CONFIG_USB_PD_DISCHARGE
void pd_set_vbus_discharge(int port, int enable) void pd_set_vbus_discharge(int port, int enable)
{ {
static struct mutex discharge_lock[CONFIG_USB_PD_PORT_MAX_COUNT]; static struct mutex discharge_lock[CONFIG_USB_PD_PORT_MAX_COUNT];
@ -4413,25 +4412,35 @@ void pd_set_vbus_discharge(int port, int enable)
mutex_lock(&discharge_lock[port]); mutex_lock(&discharge_lock[port]);
enable &= !board_vbus_source_enabled(port); enable &= !board_vbus_source_enabled(port);
#ifdef CONFIG_USB_PD_DISCHARGE_GPIO if (IS_ENABLED(CONFIG_USB_PD_DISCHARGE_GPIO)) {
#if CONFIG_USB_PD_PORT_MAX_COUNT == 0 switch (port) {
gpio_set_level(GPIO_USB_C0_DISCHARGE, enable); #if defined(CONFIG_USB_PD_DISCHARGE_GPIO) && CONFIG_USB_PD_PORT_MAX_COUNT >= 3
#elif CONFIG_USB_PD_PORT_MAX_COUNT == 1 case 2:
gpio_set_level(GPIO_USB_C1_DISCHARGE, enable); gpio_set_level(GPIO_USB_C2_DISCHARGE, enable);
#elif CONFIG_USB_PD_PORT_MAX_COUNT == 2 break;
gpio_set_level(GPIO_USB_C2_DISCHARGE, enable);
#elif CONFIG_USB_PD_PORT_MAX_COUNT == 3
gpio_set_level(GPIO_USB_C3_DISCHARGE, enable);
#endif #endif
#else #if defined(CONFIG_USB_PD_DISCHARGE_GPIO) && CONFIG_USB_PD_PORT_MAX_COUNT >= 2
if (IS_ENABLED(CONFIG_USB_PD_DISCHARGE_TCPC)) case 1:
gpio_set_level(GPIO_USB_C1_DISCHARGE, enable);
break;
#endif
#if defined(CONFIG_USB_PD_DISCHARGE_GPIO) && CONFIG_USB_PD_PORT_MAX_COUNT >= 1
case 0:
gpio_set_level(GPIO_USB_C0_DISCHARGE, enable);
break;
#endif
default:
CPRINTF("Could not discharge port %d via GPIO", port);
break;
}
} else if (IS_ENABLED(CONFIG_USB_PD_DISCHARGE_TCPC)) {
tcpc_discharge_vbus(port, enable); tcpc_discharge_vbus(port, enable);
else if (IS_ENABLED(CONFIG_USB_PD_DISCHARGE_PPC)) } else if (IS_ENABLED(CONFIG_USB_PD_DISCHARGE_PPC)) {
ppc_discharge_vbus(port, enable); ppc_discharge_vbus(port, enable);
#endif }
mutex_unlock(&discharge_lock[port]); mutex_unlock(&discharge_lock[port]);
} }
#endif /* CONFIG_USB_PD_DISCHARGE */
/* VDM utility functions */ /* VDM utility functions */
#ifdef CONFIG_USB_PD_ALT_MODE_DFP #ifdef CONFIG_USB_PD_ALT_MODE_DFP

View File

@ -186,6 +186,11 @@ void run_test(void)
} }
} }
int board_vbus_source_enabled(int port)
{
return 0;
}
int test_fuzz_one_input(const uint8_t *data, unsigned int size) int test_fuzz_one_input(const uint8_t *data, unsigned int size)
{ {
int i; int i;

View File

@ -295,6 +295,7 @@ int ncp15wb_calculate_temp(uint16_t adc);
#undef CONFIG_USB_TYPEC_SM #undef CONFIG_USB_TYPEC_SM
#define CONFIG_USBC_VCONN #define CONFIG_USBC_VCONN
#define PD_VCONN_SWAP_DELAY 5000 /* us */ #define PD_VCONN_SWAP_DELAY 5000 /* us */
#define CONFIG_USB_PD_DISCHARGE_GPIO
#endif #endif
/* Common TypeC tests defines */ /* Common TypeC tests defines */

View File

@ -25,6 +25,11 @@ const struct svdm_response svdm_rsp = {
.modes = NULL, .modes = NULL,
}; };
int board_vbus_source_enabled(int port)
{
return 0;
}
/** /**
* Test section * Test section
*/ */
@ -120,11 +125,23 @@ static int test_pe_frs(void)
return EC_SUCCESS; return EC_SUCCESS;
} }
static int test_vbus_gpio_discharge(void)
{
pd_set_vbus_discharge(PORT0, 1);
TEST_EQ(gpio_get_level(GPIO_USB_C0_DISCHARGE), 1, "%d");
pd_set_vbus_discharge(PORT0, 0);
TEST_EQ(gpio_get_level(GPIO_USB_C0_DISCHARGE), 0, "%d");
return EC_SUCCESS;
}
void run_test(void) void run_test(void)
{ {
test_reset(); test_reset();
RUN_TEST(test_pe_frs); RUN_TEST(test_pe_frs);
RUN_TEST(test_vbus_gpio_discharge);
/* Do basic state machine sanity checks last. */ /* Do basic state machine sanity checks last. */
RUN_TEST(test_pe_no_parent_cycles); RUN_TEST(test_pe_no_parent_cycles);