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 */
|
/* 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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue