static void svdm_safe_dp_mode(int port) { /* make DP interface safe until configure */ usb_mux_set(port, TYPEC_MUX_NONE, USB_SWITCH_CONNECT, 0); dp_flags = 0; dp_status = 0; }
static void svdm_safe_dp_mode(int port) { /* make DP interface safe until configure */ dp_flags[port] = 0; dp_status[port] = 0; usb_mux_set(port, TYPEC_MUX_NONE, USB_SWITCH_CONNECT, pd_get_polarity(port)); }
static int svdm_dp_attention(int port, uint32_t *payload) { const struct usb_mux *mux = &usb_muxes[port]; int lvl = PD_VDO_DPSTS_HPD_LVL(payload[1]); int irq = PD_VDO_DPSTS_HPD_IRQ(payload[1]); int mf_pref = PD_VDO_DPSTS_MF_PREF(payload[1]); dp_status[port] = payload[1]; mux->hpd_update(port, lvl, irq); if (lvl) usb_mux_set(port, mf_pref ? TYPEC_MUX_DOCK : TYPEC_MUX_DP, USB_SWITCH_CONNECT, pd_get_polarity(port)); else usb_mux_set(port, mf_pref ? TYPEC_MUX_USB : TYPEC_MUX_NONE, USB_SWITCH_CONNECT, pd_get_polarity(port)); return 1; }
static int dp_config(int port, uint32_t *payload) { /* is it a 2+2 or 4 DP lanes mode ? */ enum typec_mux mux = PD_DP_CFG_PIN(payload[1]) & MODE_DP_PIN_MF_MASK ? TYPEC_MUX_DOCK : TYPEC_MUX_DP; if (PD_DP_CFG_DPON(payload[1])) gpio_set_level(GPIO_PD_SBU_ENABLE, 1); /* Get the DP lanes (or DP+USB SS depending on the mode) */ usb_mux_set(port, mux, USB_SWITCH_CONNECT, pd_get_polarity(port)); return 1; }
static int command_typec(int argc, char **argv) { const char * const mux_name[] = {"none", "usb", "dp", "dock"}; char *e; int port; enum typec_mux mux = TYPEC_MUX_NONE; int i; if (argc == 2 && !strcasecmp(argv[1], "debug")) { enable_debug_prints = 1; return EC_SUCCESS; } if (argc < 2) return EC_ERROR_PARAM_COUNT; port = strtoi(argv[1], &e, 10); if (*e || port >= CONFIG_USB_PD_PORT_COUNT) return EC_ERROR_PARAM1; if (argc < 3) { const char *dp_str, *usb_str; ccprintf("Port C%d: polarity:CC%d\n", port, pd_get_polarity(port) + 1); if (usb_mux_get(port, &dp_str, &usb_str)) ccprintf("Superspeed %s%s%s\n", dp_str ? dp_str : "", dp_str && usb_str ? "+" : "", usb_str ? usb_str : ""); else ccprintf("No Superspeed connection\n"); return EC_SUCCESS; } for (i = 0; i < ARRAY_SIZE(mux_name); i++) if (!strcasecmp(argv[2], mux_name[i])) mux = i; usb_mux_set(port, mux, mux == TYPEC_MUX_NONE ? USB_SWITCH_DISCONNECT : USB_SWITCH_CONNECT, pd_get_polarity(port)); return EC_SUCCESS; }
static int svdm_dp_config(int port, uint32_t *payload) { int opos = pd_alt_mode(port, USB_SID_DISPLAYPORT); int mf_pref = PD_VDO_DPSTS_MF_PREF(dp_status[port]); int pin_mode = pd_dfp_dp_get_pin_mode(port, dp_status[port]); if (!pin_mode) return 0; usb_mux_set(port, mf_pref ? TYPEC_MUX_DOCK : 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(pin_mode, /* pin mode */ 1, /* DPv1.3 signaling */ 2); /* UFP connected */ return 2; };