diff options
-rw-r--r-- | board/reef/board.c | 3 | ||||
-rw-r--r-- | board/reef/board.h | 5 | ||||
-rw-r--r-- | board/reef/gpio.inc | 10 | ||||
-rw-r--r-- | board/reef/usb_pd_policy.c | 30 |
4 files changed, 38 insertions, 10 deletions
diff --git a/board/reef/board.c b/board/reef/board.c index 324ff47941..51a836b1e4 100644 --- a/board/reef/board.c +++ b/board/reef/board.c @@ -20,6 +20,7 @@ #include "driver/accelgyro_bmi160.h" #include "driver/charger/bd99955.h" #include "driver/tcpm/anx74xx.h" +#include "driver/tcpm/ps8751.h" #include "driver/tcpm/tcpci.h" #include "extpower.h" #include "gpio.h" @@ -151,10 +152,12 @@ struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_COUNT] = { { .port_addr = 0, /* don't care / unused */ .driver = &anx74xx_tcpm_usb_mux_driver, + .hpd_update = &anx74xx_tcpc_update_hpd_status, }, { .port_addr = 1, .driver = &tcpci_tcpm_usb_mux_driver, + .hpd_update = &ps8751_tcpc_update_hpd_status, } }; diff --git a/board/reef/board.h b/board/reef/board.h index d231b8d1bf..73bb77c8b9 100644 --- a/board/reef/board.h +++ b/board/reef/board.h @@ -41,9 +41,10 @@ #define CONFIG_USB_PD_LOG_SIZE 512 #define CONFIG_USB_PD_PORT_COUNT 2 #define CONFIG_USB_PD_VBUS_DETECT_CHARGER -#define CONFIG_USB_PD_TCPM_MUX /* for both PS8751 and ANX3429 */ -#define CONFIG_USB_PD_TCPM_TCPCI +#define CONFIG_USB_PD_TCPM_MUX /* for both PS8751 and ANX3429 */ #define CONFIG_USB_PD_TCPM_ANX74XX +#define CONFIG_USB_PD_TCPM_PS8751 +#define CONFIG_USB_PD_TCPM_TCPCI #define CONFIG_USB_PD_TRY_SRC #define CONFIG_USB_POWER_DELIVERY diff --git a/board/reef/gpio.inc b/board/reef/gpio.inc index 853aea32a7..755b3f75d7 100644 --- a/board/reef/gpio.inc +++ b/board/reef/gpio.inc @@ -12,7 +12,7 @@ GPIO_INT(CHARGER_INT_L, PIN(3, 3), GPIO_INT_FALLING, bd99955_vbus_interrupt) / GPIO_INT(USB_C0_PD_INT, PIN(3, 7), GPIO_INT_RISING, tcpc_alert_event) /* from Analogix TCPC */ GPIO_INT(USB_C1_PD_INT_ODL, PIN(D, 2), GPIO_INT_FALLING, tcpc_alert_event) /* from Parade TCPC */ -GPIO_INT(PCH_SLP_S4_L, PIN(8, 6), GPIO_INT_BOTH, power_signal_interrupt) /* SLP_S4_L */ +GPIO_INT(PCH_SLP_S4_L, PIN(8, 6), GPIO_INT_BOTH, power_signal_interrupt) /* SLP_S4_L */ GPIO_INT(PCH_SLP_S3_L, PIN(7, 3), GPIO_INT_BOTH, power_signal_interrupt) /* SLP_S3_L */ GPIO_INT(PCH_SLP_S0_L, PIN(7, 5), GPIO_INT_BOTH, power_signal_interrupt) /* SLP_S0_L */ GPIO_INT(SUSPWRNACK, PIN(7, 2), GPIO_INT_BOTH, power_signal_interrupt) @@ -82,7 +82,7 @@ GPIO(USB_C0_CABLE_DET, PIN(C, 5), GPIO_INPUT) GPIO(PCH_RSMRST_L, PIN(7, 0), GPIO_OUT_LOW) GPIO(EC_BATT_PRES_L, PIN(3, 4), GPIO_INPUT) GPIO(V5A_EN, PIN(8, 5), GPIO_OUT_LOW) /* PMIC_EN */ -GPIO(EN_PP3300, PIN(C, 2), GPIO_OUT_LOW) +GPIO(EN_PP3300, PIN(C, 2), GPIO_OUT_LOW) GPIO(PP3300_PG, PIN(6, 2), GPIO_INPUT) GPIO(EN_PP5000, PIN(C, 6), GPIO_OUT_LOW) GPIO(PP5000_PG, PIN(7, 1), GPIO_INPUT) @@ -92,13 +92,13 @@ GPIO(ENABLE_BACKLIGHT, PIN(9, 7), GPIO_ODR_HIGH | GPIO_SEL_1P8V) /* EC_BL_EN_OD GPIO(WIRELESS_GPIO_WLAN_POWER, PIN(6, 6), GPIO_ODR_HIGH) /* EN_PP3300_WLAN_ODL */ -GPIO(CPU_PROCHOT, PIN(7, 4), GPIO_INPUT | GPIO_SEL_1P8V) /* PCH_PROCHOT_ODL */ +GPIO(CPU_PROCHOT, PIN(7, 4), GPIO_INPUT | GPIO_SEL_1P8V) /* PCH_PROCHOT_ODL */ GPIO(EC_PCH_PROCHOT_OVERRIDE_ODL,PIN(A, 3), GPIO_ODR_HIGH | GPIO_SEL_1P8V) GPIO(PCH_PWRBTN_L, PIN(0, 1), GPIO_ODR_HIGH) /* EC_PCH_PWR_BTN_ODL */ GPIO(PCH_WAKE_L, PIN(8, 1), GPIO_ODR_HIGH) /* EC_PCH_WAKE_ODL */ -GPIO(USB_C0_HPD_1P8_ODL, PIN(9, 4), GPIO_ODR_HIGH) -GPIO(USB_C1_HPD_1P8_ODL, PIN(A, 5), GPIO_ODR_HIGH) +GPIO(USB_C0_HPD_1P8_ODL, PIN(9, 4), GPIO_INPUT | GPIO_SEL_1P8V) +GPIO(USB_C1_HPD_1P8_ODL, PIN(A, 5), GPIO_INPUT | GPIO_SEL_1P8V) GPIO(USB2_OTG_ID, PIN(A, 1), GPIO_OUTPUT) /* FIXME: what should this init to? */ GPIO(USB2_OTG_VBUSSENSE, PIN(9, 5), GPIO_OUTPUT) diff --git a/board/reef/usb_pd_policy.c b/board/reef/usb_pd_policy.c index e399e1686c..f442f725f3 100644 --- a/board/reef/usb_pd_policy.c +++ b/board/reef/usb_pd_policy.c @@ -9,6 +9,8 @@ #include "common.h" #include "console.h" #include "driver/charger/bd99955.h" +#include "driver/tcpm/anx74xx.h" +#include "driver/tcpm/ps8751.h" #include "gpio.h" #include "hooks.h" #include "host_command.h" @@ -246,12 +248,15 @@ int pd_custom_vdm(int port, int cnt, uint32_t *payload, #ifdef CONFIG_USB_PD_ALT_MODE_DFP static int dp_flags[CONFIG_USB_PD_PORT_COUNT]; +static uint32_t dp_status[CONFIG_USB_PD_PORT_COUNT]; static void svdm_safe_dp_mode(int port) { /* make DP interface safe until configure */ dp_flags[port] = 0; - /* board_set_usb_mux(port, TYPEC_MUX_NONE, pd_get_polarity(port)); */ + dp_status[port] = 0; + usb_mux_set(port, TYPEC_MUX_NONE, + USB_SWITCH_CONNECT, pd_get_polarity(port)); } static int svdm_enter_dp_mode(int port, uint32_t mode_caps) @@ -285,7 +290,10 @@ static int svdm_dp_status(int port, uint32_t *payload) static int svdm_dp_config(int port, uint32_t *payload) { int opos = pd_alt_mode(port, USB_SID_DISPLAYPORT); - /* board_set_usb_mux(port, TYPEC_MUX_DP, pd_get_polarity(port)); */ + + usb_mux_set(port, TYPEC_MUX_DP, + USB_SWITCH_CONNECT, pd_get_polarity(port)); + payload[0] = VDO(USB_SID_DISPLAYPORT, 1, CMD_DP_CONFIG | VDO_OPOS(opos)); payload[1] = VDO_DP_CFG(MODE_DP_PIN_E, /* pin mode */ @@ -296,21 +304,37 @@ static int svdm_dp_config(int port, uint32_t *payload) static void svdm_dp_post_config(int port) { + const struct usb_mux *mux = &usb_muxes[port]; + dp_flags[port] |= DP_FLAGS_DP_ON; if (!(dp_flags[port] & DP_FLAGS_HPD_HI_PENDING)) return; + mux->hpd_update(port, 1, 0); } static int svdm_dp_attention(int port, uint32_t *payload) { + int lvl = PD_VDO_DPSTS_HPD_LVL(payload[1]); + int irq = PD_VDO_DPSTS_HPD_IRQ(payload[1]); + const struct usb_mux *mux = &usb_muxes[port]; + + dp_status[port] = payload[1]; + if (!(dp_flags[port] & DP_FLAGS_DP_ON)) { + if (lvl) + dp_flags[port] |= DP_FLAGS_HPD_HI_PENDING; + return 1; + } + mux->hpd_update(port, lvl, irq); + /* ack */ return 1; } static void svdm_exit_dp_mode(int port) { + const struct usb_mux *mux = &usb_muxes[port]; svdm_safe_dp_mode(port); - /* gpio_set_level(PORT_TO_HPD(port), 0); */ + mux->hpd_update(port, 0, 0); } static int svdm_enter_gfu_mode(int port, uint32_t mode_caps) |