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:
parent
b3cb8a6f81
commit
cf54e8664f
|
@ -29,3 +29,5 @@ GPIO(BASE_CHG_VDD_EN, PIN(0, 12), 0)
|
|||
|
||||
/* Fingerprint */
|
||||
GPIO(SPI1_NSS, PIN(0, 13), GPIO_OUT_HIGH)
|
||||
|
||||
GPIO(USB_C0_DISCHARGE, PIN(0, 15), 0)
|
||||
|
|
|
@ -4405,7 +4405,6 @@ int pd_charge_from_device(uint16_t vid, uint16_t pid)
|
|||
(pid == USB_PID1_APPLE || pid == USB_PID2_APPLE));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USB_PD_DISCHARGE
|
||||
void pd_set_vbus_discharge(int port, int enable)
|
||||
{
|
||||
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]);
|
||||
enable &= !board_vbus_source_enabled(port);
|
||||
|
||||
#ifdef CONFIG_USB_PD_DISCHARGE_GPIO
|
||||
#if CONFIG_USB_PD_PORT_MAX_COUNT == 0
|
||||
gpio_set_level(GPIO_USB_C0_DISCHARGE, enable);
|
||||
#elif CONFIG_USB_PD_PORT_MAX_COUNT == 1
|
||||
gpio_set_level(GPIO_USB_C1_DISCHARGE, enable);
|
||||
#elif CONFIG_USB_PD_PORT_MAX_COUNT == 2
|
||||
gpio_set_level(GPIO_USB_C2_DISCHARGE, enable);
|
||||
#elif CONFIG_USB_PD_PORT_MAX_COUNT == 3
|
||||
gpio_set_level(GPIO_USB_C3_DISCHARGE, enable);
|
||||
if (IS_ENABLED(CONFIG_USB_PD_DISCHARGE_GPIO)) {
|
||||
switch (port) {
|
||||
#if defined(CONFIG_USB_PD_DISCHARGE_GPIO) && CONFIG_USB_PD_PORT_MAX_COUNT >= 3
|
||||
case 2:
|
||||
gpio_set_level(GPIO_USB_C2_DISCHARGE, enable);
|
||||
break;
|
||||
#endif
|
||||
#else
|
||||
if (IS_ENABLED(CONFIG_USB_PD_DISCHARGE_TCPC))
|
||||
#if defined(CONFIG_USB_PD_DISCHARGE_GPIO) && CONFIG_USB_PD_PORT_MAX_COUNT >= 2
|
||||
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);
|
||||
else if (IS_ENABLED(CONFIG_USB_PD_DISCHARGE_PPC))
|
||||
} else if (IS_ENABLED(CONFIG_USB_PD_DISCHARGE_PPC)) {
|
||||
ppc_discharge_vbus(port, enable);
|
||||
#endif
|
||||
}
|
||||
|
||||
mutex_unlock(&discharge_lock[port]);
|
||||
}
|
||||
#endif /* CONFIG_USB_PD_DISCHARGE */
|
||||
|
||||
/* VDM utility functions */
|
||||
#ifdef CONFIG_USB_PD_ALT_MODE_DFP
|
||||
|
|
|
@ -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 i;
|
||||
|
|
|
@ -295,6 +295,7 @@ int ncp15wb_calculate_temp(uint16_t adc);
|
|||
#undef CONFIG_USB_TYPEC_SM
|
||||
#define CONFIG_USBC_VCONN
|
||||
#define PD_VCONN_SWAP_DELAY 5000 /* us */
|
||||
#define CONFIG_USB_PD_DISCHARGE_GPIO
|
||||
#endif
|
||||
|
||||
/* Common TypeC tests defines */
|
||||
|
|
|
@ -25,6 +25,11 @@ const struct svdm_response svdm_rsp = {
|
|||
.modes = NULL,
|
||||
};
|
||||
|
||||
int board_vbus_source_enabled(int port)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test section
|
||||
*/
|
||||
|
@ -120,11 +125,23 @@ static int test_pe_frs(void)
|
|||
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)
|
||||
{
|
||||
test_reset();
|
||||
|
||||
RUN_TEST(test_pe_frs);
|
||||
RUN_TEST(test_vbus_gpio_discharge);
|
||||
|
||||
/* Do basic state machine sanity checks last. */
|
||||
RUN_TEST(test_pe_no_parent_cycles);
|
||||
|
|
Loading…
Reference in New Issue