diff options
author | Aseda Aboagye <aaboagye@chromium.org> | 2020-03-25 23:43:12 +0000 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-26 02:49:58 +0000 |
commit | 383b6c51874e61d9a3dd637f477a67af33e51340 (patch) | |
tree | a67b49316c10d31d6bfe3588b1db73f8a756332b | |
parent | eb6401aa2ccf38afadc1fc2978cbd2a6d9a7c4ce (diff) | |
download | chrome-ec-383b6c51874e61d9a3dd637f477a67af33e51340.tar.gz |
Revert "tcpmv2: cleanup auto discharge disconnect"
This reverts commit 03f5a8686a6a2274c176ead7fb928571a3e7c1f5.
Reason for revert: This is causing chargers to not work in one
orientation with the RAA489000 used on waddledoo.
BUG=b:152444591
Original change's description:
> tcpmv2: cleanup auto discharge disconnect
>
> This CL is based on the inability to boot trembyle when a
> battery is not connected. The failure looks like it is always
> right after AutoDischargeDisconnect has been set. I asked
> Nuvoton if we could go back to using ForcedDischarge and
> veer away from AutoDischargeDisconnect and I was told no
> that it is now required.
>
> My first step was to determine how close the existing
> AutoDischargeDisconnect was to the spec and found enough
> difference that I wanted to get that in line before
> trying to pinpoint the issues causing this problem.
>
> BUG=none
> BRANCH=none
> TEST=get tcpmv2 to work without a battery attached
>
> Signed-off-by: Denis Brockus <dbrockus@google.com>
> Change-Id: I44b86ae5dfcf6b547c742c1af0228a0ed8e3520d
> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2105935
> Tested-by: Denis Brockus <dbrockus@chromium.org>
> Reviewed-by: Edward Hill <ecgh@chromium.org>
> Reviewed-by: Keith Short <keithshort@chromium.org>
> Commit-Queue: Denis Brockus <dbrockus@chromium.org>
> Auto-Submit: Denis Brockus <dbrockus@chromium.org>
Bug: none
Change-Id: Id2afdeb8d48d044a0a94277dfa0c388f864e838f
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2121178
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Commit-Queue: Aseda Aboagye <aaboagye@chromium.org>
Tested-by: Aseda Aboagye <aaboagye@chromium.org>
-rw-r--r-- | common/usbc/usb_tc_drp_acc_trysrc_sm.c | 73 | ||||
-rw-r--r-- | driver/tcpm/nct38xx.c | 111 | ||||
-rw-r--r-- | driver/tcpm/tcpci.c | 149 | ||||
-rw-r--r-- | driver/tcpm/tcpci.h | 2 | ||||
-rw-r--r-- | driver/tcpm/tcpm.h | 12 | ||||
-rw-r--r-- | include/usb_pd_tcpm.h | 11 |
6 files changed, 123 insertions, 235 deletions
diff --git a/common/usbc/usb_tc_drp_acc_trysrc_sm.c b/common/usbc/usb_tc_drp_acc_trysrc_sm.c index e055c10cf1..e0dcb2e940 100644 --- a/common/usbc/usb_tc_drp_acc_trysrc_sm.c +++ b/common/usbc/usb_tc_drp_acc_trysrc_sm.c @@ -1642,6 +1642,9 @@ static void tc_unattached_snk_entry(const int port) if (IS_ENABLED(CONFIG_BC12_DETECT_DATA_ROLE_TRIGGER)) bc12_role_change_handler(port); + /* VBus should be SafeV0, turn off auto discharge disconnect */ + tcpm_enable_auto_discharge_disconnect(port, 0); + if (IS_ENABLED(CONFIG_CHARGE_MANAGER)) charge_manager_update_dualrole(port, CAP_UNKNOWN); @@ -1691,17 +1694,6 @@ static void tc_unattached_snk_run(const int port) if (drp_state[port] == PD_DRP_TOGGLE_ON && TC_CHK_FLAG(port, TC_FLAGS_AUTO_TOGGLE_SUPPORTED) && cc_is_open(cc1, cc2)) { - - /* - * We are disconnected and going to DRP - * PC.AutoDischargeDisconnect=0b - * Set RC.DRP=1b (DRP) - * Set RC.CC1=10b (Rd) - * Set RC.CC2=10b (Rd) - */ - tcpm_enable_auto_discharge_disconnect(port, 0); - tcpm_set_connection(port, TYPEC_CC_RD, 0); - set_state_tc(port, TC_DRP_AUTO_TOGGLE); return; } @@ -1728,13 +1720,6 @@ static void tc_unattached_snk_run(const int port) #ifdef CONFIG_USB_PD_TCPC_LOW_POWER else if (drp_state[port] == PD_DRP_FORCE_SINK || drp_state[port] == PD_DRP_TOGGLE_OFF) { - - /* - * We are disconnecting without DRP. - * PC.AutoDischargeDisconnect=0b - */ - tcpm_enable_auto_discharge_disconnect(port, 0); - set_state_tc(port, TC_LOW_POWER_MODE); } #endif @@ -1897,6 +1882,9 @@ static void tc_attached_snk_entry(const int port) /* Enable PD */ if (IS_ENABLED(CONFIG_USB_PE_SM)) tc_enable_pd(port, 1); + + /* VBus should be powered, turn on auto discharge disconnect */ + tcpm_enable_auto_discharge_disconnect(port, 1); } static void tc_attached_snk_run(const int port) @@ -2336,6 +2324,9 @@ static void tc_unattached_src_entry(const int port) if (IS_ENABLED(CONFIG_BC12_DETECT_DATA_ROLE_TRIGGER)) bc12_role_change_handler(port); + /* VBus should be SafeV0, turn off auto discharge disconnect */ + tcpm_enable_auto_discharge_disconnect(port, 0); + if (IS_ENABLED(CONFIG_USBC_PPC)) { /* There is no sink connected. */ ppc_sink_is_connected(port, 0); @@ -2404,18 +2395,6 @@ static void tc_unattached_src_run(const int port) else if (drp_state[port] == PD_DRP_TOGGLE_ON && TC_CHK_FLAG(port, TC_FLAGS_AUTO_TOGGLE_SUPPORTED) && cc_is_open(cc1, cc2)) { - - /* - * We are disconnected and going to DRP - * PC.AutoDischargeDisconnect=0b - * Set RC.DRP=1b (DRP) - * Set RC.RpValue=00b (smallest Rp to save power) - * Set RC.CC1=01b (Rp) - * Set RC.CC2=01b (Rp) - */ - tcpm_enable_auto_discharge_disconnect(port, 0); - tcpm_set_connection(port, TYPEC_CC_RP, 0); - set_state_tc(port, TC_DRP_AUTO_TOGGLE); } #endif @@ -2423,13 +2402,6 @@ static void tc_unattached_src_run(const int port) #ifdef CONFIG_USB_PD_TCPC_LOW_POWER else if (drp_state[port] == PD_DRP_FORCE_SOURCE || drp_state[port] == PD_DRP_TOGGLE_OFF) { - - /* - * We are disconnecting without DRP. - * PC.AutoDischargeDisconnect=0b - */ - tcpm_enable_auto_discharge_disconnect(port, 0); - set_state_tc(port, TC_LOW_POWER_MODE); } #endif @@ -2609,6 +2581,9 @@ static void tc_attached_src_entry(const int port) if (IS_ENABLED(CONFIG_USBC_PPC)) ppc_sink_is_connected(port, 1); + /* VBus should be powered, turn on auto discharge disconnect */ + tcpm_enable_auto_discharge_disconnect(port, 1); + /* * Only notify if we're not performing a power role swap. During a * power role swap, the port partner is not disconnecting/connecting. @@ -2846,29 +2821,9 @@ static void tc_drp_auto_toggle_run(const int port) set_state_tc(port, PD_DEFAULT_STATE(port)); break; case DRP_TC_UNATTACHED_SNK: - /* - * New SNK connection. - * Set RC.CC1 & RC.CC2 per decision - * Set RC.DRP=0 - * Set TCPC_CONTROl.PlugOrientation - * PC.AutoDischargeDisconnect=1b - */ - tcpm_set_connection(port, TYPEC_CC_RD, 1); - tcpm_enable_auto_discharge_disconnect(port, 1); - set_state_tc(port, TC_UNATTACHED_SNK); break; case DRP_TC_UNATTACHED_SRC: - /* - * New SRC connection. - * Set RC.CC1 & RC.CC2 per decision - * Set RC.DRP=0 - * Set TCPC_CONTROl.PlugOrientation - * PC.AutoDischargeDisconnect=1b - */ - tcpm_set_connection(port, TYPEC_CC_RP, 1); - tcpm_enable_auto_discharge_disconnect(port, 1); - set_state_tc(port, TC_UNATTACHED_SRC); break; case DRP_TC_DRP_AUTO_TOGGLE: @@ -3195,7 +3150,7 @@ static void tc_cc_rd_entry(const int port) * Both CC1 and CC2 pins shall be independently terminated to * ground through Rd. */ - tcpm_set_cc(port, TYPEC_CC_RD); + tcpm_set_new_connection(port, TYPEC_CC_RD); } @@ -3217,7 +3172,7 @@ static void tc_cc_rp_entry(const int port) * up through Rp. */ tcpm_select_rp_value(port, CONFIG_USB_PD_PULLUP); - tcpm_set_cc(port, TYPEC_CC_RP); + tcpm_set_new_connection(port, TYPEC_CC_RP); } /** diff --git a/driver/tcpm/nct38xx.c b/driver/tcpm/nct38xx.c index c9e78935d0..2069557e2c 100644 --- a/driver/tcpm/nct38xx.c +++ b/driver/tcpm/nct38xx.c @@ -28,8 +28,8 @@ static int nct38xx_tcpm_init(int port) int reg; rv = tcpci_tcpm_init(port); - if (rv) - return rv; + if (rv) + return rv; /* * Write to the CONTROL_OUT_EN register to enable: @@ -78,15 +78,13 @@ static int nct38xx_tcpm_init(int port) /* Start VBus monitor */ rv = tcpc_write(port, TCPC_REG_COMMAND, TCPC_REG_COMMAND_ENABLE_VBUS_DETECT); - if (rv) - return rv; /* * Enable the Vendor Define alert event only when the IO expander * feature is defined */ if (IS_ENABLED(CONFIG_IO_EXPANDER_NCT38XX)) - rv = tcpc_update16(port, + rv |= tcpc_update16(port, TCPC_REG_ALERT_MASK, TCPC_REG_ALERT_VENDOR_DEF, MASK_SET); @@ -119,26 +117,101 @@ static void nct38xx_tcpc_alert(int port) } -static __maybe_unused int nct3807_tcpc_drp_toggle(int port) +#ifdef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE +static int nct38xx_set_new_connection(int port, + enum tcpc_cc_pull pull) { int rv; + int role; - /* DRP will already be set with the correct pull on both CC lines */ - - /* Set up to catch LOOK4CONNECTION alerts */ - rv = tcpc_update8(port, - TCPC_REG_TCPC_CTRL, - TCPC_REG_TCPC_CTRL_EN_LOOK4CONNECTION_ALERT, - MASK_SET); + /* Get the ROLE CONTROL value */ + rv = tcpc_read(port, TCPC_REG_ROLE_CTRL, &role); if (rv) return rv; - /* Set Look4Connection command */ - rv = tcpc_write(port, TCPC_REG_COMMAND, - TCPC_REG_COMMAND_LOOK4CONNECTION); + if (role & TCPC_REG_ROLE_CTRL_DRP_MASK) { + /* + * If DRP is set, the CC pins shall stay in + * Potential_Connect_as_Src or Potential_Connect_as_Sink + * until directed otherwise. + * + * Set RC.CC1 & RC.CC2 per potential decision + * Set RC.DRP=0 + */ + enum tcpc_cc_pull cc1_pull, cc2_pull; + enum tcpc_cc_voltage_status cc1, cc2; + + rv = nct38xx_tcpm_drv.get_cc(port, &cc1, &cc2); + if (rv) + return rv; - return rv; + switch (cc1) { + case TYPEC_CC_VOLT_OPEN: + cc1_pull = TYPEC_CC_OPEN; + break; + case TYPEC_CC_VOLT_RA: + cc1_pull = TYPEC_CC_RA; + break; + case TYPEC_CC_VOLT_RD: + cc1_pull = TYPEC_CC_RP; + break; + case TYPEC_CC_VOLT_RP_DEF: + case TYPEC_CC_VOLT_RP_1_5: + case TYPEC_CC_VOLT_RP_3_0: + cc1_pull = TYPEC_CC_RD; + break; + default: + return EC_ERROR_UNKNOWN; + } + + switch (cc2) { + case TYPEC_CC_VOLT_OPEN: + cc2_pull = TYPEC_CC_OPEN; + break; + case TYPEC_CC_VOLT_RA: + cc2_pull = TYPEC_CC_RA; + break; + case TYPEC_CC_VOLT_RD: + cc2_pull = TYPEC_CC_RP; + break; + case TYPEC_CC_VOLT_RP_DEF: + case TYPEC_CC_VOLT_RP_1_5: + case TYPEC_CC_VOLT_RP_3_0: + cc2_pull = TYPEC_CC_RD; + break; + default: + return EC_ERROR_UNKNOWN; + } + + /* Set the CC lines */ + rv = tcpc_write(port, TCPC_REG_ROLE_CTRL, + TCPC_REG_ROLE_CTRL_SET(0, + CONFIG_USB_PD_PULLUP, + cc1_pull, cc2_pull)); + if (rv) + return rv; + } else { + /* + * DRP is not set. This would happen if DRP is not enabled or + * was turned off and we did not have a connection. We have + * to manually turn off that we are looking for a connection + * and set both CC lines to the pull value. + */ + rv = tcpc_update8(port, + TCPC_REG_TCPC_CTRL, + TCPC_REG_TCPC_CTRL_EN_LOOK4CONNECTION_ALERT, + MASK_CLR); + if (rv) + return rv; + + /* Set the CC lines */ + rv = nct38xx_tcpm_drv.set_cc(port, pull); + if (rv) + return rv; + } + return EC_SUCCESS; } +#endif const struct tcpm_drv nct38xx_tcpm_drv = { .init = &nct38xx_tcpm_init, @@ -162,8 +235,8 @@ const struct tcpm_drv nct38xx_tcpm_drv = { .tcpc_enable_auto_discharge_disconnect = &tcpci_tcpc_enable_auto_discharge_disconnect, #ifdef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE - .drp_toggle = &nct3807_tcpc_drp_toggle, - .set_connection = &tcpci_tcpc_set_connection, + .drp_toggle = &tcpci_tcpc_drp_toggle, + .set_new_connection = &nct38xx_set_new_connection, #endif #ifdef CONFIG_USBC_PPC .set_snk_ctrl = &tcpci_tcpm_set_snk_ctrl, diff --git a/driver/tcpm/tcpci.c b/driver/tcpm/tcpci.c index 3a7f5f2de8..e23bd5ca46 100644 --- a/driver/tcpm/tcpci.c +++ b/driver/tcpm/tcpci.c @@ -16,7 +16,6 @@ #include "tcpm.h" #include "timer.h" #include "usb_charge.h" -#include "usb_common.h" #include "usb_mux.h" #include "usb_pd.h" #include "usb_pd_tcpc.h" @@ -366,147 +365,13 @@ int tcpci_tcpc_drp_toggle(int port) { int rv; - /* - * Set auto drp toggle - * NOTE: This should be done according to the last connection - * that we are disconnecting from. TCPCI Rev 2 spec figures - * 4-21 and 4-22 show: - * SNK => DRP should set CC lines to Rd/Rd - * SRC => DRP should set CC lines to Rp/Rp - * The function tcpci_tcpc_set_connection performs this action - * and it may be wise as chips can use this to make this the - * standard and remove this set_role_ctrl call. - */ + /* Set auto drp toggle */ rv = tcpci_set_role_ctrl(port, 1, TYPEC_RP_USB, TYPEC_CC_RD); - if (rv) - return rv; - - /* Set up to catch LOOK4CONNECTION alerts */ - rv = tcpc_update8(port, - TCPC_REG_TCPC_CTRL, - TCPC_REG_TCPC_CTRL_EN_LOOK4CONNECTION_ALERT, - MASK_SET); - if (rv) - return rv; /* Set Look4Connection command */ - rv = tcpc_write(port, TCPC_REG_COMMAND, - TCPC_REG_COMMAND_LOOK4CONNECTION); - - return rv; -} - -int tcpci_tcpc_set_connection(int port, - enum tcpc_cc_pull pull, - int connect) -{ - int rv; - int role; - - /* - * Disconnecting will set the following and then return - * Set RC.DRP=1b (DRP) - * Set RC.RpValue=00b (smallest Rp to save power) - * Set RC.CC1=pull (Rd or Rp) - * Set RC.CC2=pull (Rd or Rp) - */ - if (!connect) { - tcpci_set_role_ctrl(port, 1, TYPEC_RP_USB, pull); - return EC_SUCCESS; - } - - /* Get the ROLE CONTROL value */ - rv = tcpc_read(port, TCPC_REG_ROLE_CTRL, &role); - if (rv) - return rv; - - if (role & TCPC_REG_ROLE_CTRL_DRP_MASK) { - enum tcpc_cc_pull cc1_pull, cc2_pull; - enum tcpc_cc_voltage_status cc1, cc2; - - enum tcpc_cc_polarity polarity; + rv |= tcpc_write(port, TCPC_REG_COMMAND, + TCPC_REG_COMMAND_LOOK4CONNECTION); - /* - * If DRP is set, the CC pins shall stay in - * Potential_Connect_as_Src or Potential_Connect_as_Sink - * until directed otherwise. - * - * Set RC.CC1 & RC.CC2 per potential decision - * Set RC.DRP=0 - */ - rv = tcpm_get_cc(port, &cc1, &cc2); - if (rv) - return rv; - - switch (cc1) { - case TYPEC_CC_VOLT_OPEN: - cc1_pull = TYPEC_CC_OPEN; - break; - case TYPEC_CC_VOLT_RA: - cc1_pull = TYPEC_CC_RA; - break; - case TYPEC_CC_VOLT_RD: - cc1_pull = TYPEC_CC_RP; - break; - case TYPEC_CC_VOLT_RP_DEF: - case TYPEC_CC_VOLT_RP_1_5: - case TYPEC_CC_VOLT_RP_3_0: - cc1_pull = TYPEC_CC_RD; - break; - default: - return EC_ERROR_UNKNOWN; - } - - switch (cc2) { - case TYPEC_CC_VOLT_OPEN: - cc2_pull = TYPEC_CC_OPEN; - break; - case TYPEC_CC_VOLT_RA: - cc2_pull = TYPEC_CC_RA; - break; - case TYPEC_CC_VOLT_RD: - cc2_pull = TYPEC_CC_RP; - break; - case TYPEC_CC_VOLT_RP_DEF: - case TYPEC_CC_VOLT_RP_1_5: - case TYPEC_CC_VOLT_RP_3_0: - cc2_pull = TYPEC_CC_RD; - break; - default: - return EC_ERROR_UNKNOWN; - } - - /* Set the CC lines */ - rv = tcpc_write(port, TCPC_REG_ROLE_CTRL, - TCPC_REG_ROLE_CTRL_SET(0, - CONFIG_USB_PD_PULLUP, - cc1_pull, cc2_pull)); - if (rv) - return rv; - - /* Set TCPC_CONTROl.PlugOrientation */ - if (pull == TYPEC_CC_RD) - polarity = polarity_rm_dts( - get_snk_polarity(cc1, cc2)); - else - polarity = get_src_polarity(cc1, cc2); - - rv = tcpc_update8(port, TCPC_REG_TCPC_CTRL, - TCPC_REG_TCPC_CTRL_SET(1), - (polarity == POLARITY_CC1) ? MASK_CLR - : MASK_SET); - } else { - /* - * DRP is not set. This would happen if DRP is not enabled or - * was turned off and we did not have a connection. We have - * to manually turn off that we are looking for a connection - * and set both CC lines to the pull value. - */ - rv = tcpc_update8(port, - TCPC_REG_TCPC_CTRL, - TCPC_REG_TCPC_CTRL_EN_LOOK4CONNECTION_ALERT, - MASK_CLR); - } return rv; } #endif @@ -973,7 +838,6 @@ void tcpci_tcpc_alert(int port) int fault; if (tcpci_get_fault(port, &fault) == EC_SUCCESS && - fault != 0 && tcpci_handle_fault(port, fault) == EC_SUCCESS && tcpci_clear_fault(port, fault) == EC_SUCCESS) CPRINTS("C%d FAULT 0x%02X handled", port, fault); @@ -1152,6 +1016,7 @@ int tcpci_tcpm_init(int port) int error; int power_status; int tries = TCPM_INIT_TRIES; + int regval; if (port >= board_get_usb_pd_port_count()) return EC_ERROR_INVAL; @@ -1176,9 +1041,9 @@ int tcpci_tcpm_init(int port) * Alert assertion when CC_STATUS.Looking4Connection changes state. */ if (tcpc_config[port].flags & TCPC_FLAGS_TCPCI_REV2_0) { - error = tcpc_update8(port, TCPC_REG_TCPC_CTRL, - TCPC_REG_TCPC_CTRL_EN_LOOK4CONNECTION_ALERT, - MASK_SET); + error = tcpc_read(port, TCPC_REG_TCPC_CTRL, ®val); + regval |= TCPC_REG_TCPC_CTRL_EN_LOOK4CONNECTION_ALERT; + error |= tcpc_write(port, TCPC_REG_TCPC_CTRL, regval); if (error) CPRINTS("C%d: Failed to init TCPC_CTRL!", port); } diff --git a/driver/tcpm/tcpci.h b/driver/tcpm/tcpci.h index 813c3026d4..60bca01107 100644 --- a/driver/tcpm/tcpci.h +++ b/driver/tcpm/tcpci.h @@ -222,8 +222,6 @@ int tcpci_tcpm_release(int port); #ifdef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE int tcpci_set_role_ctrl(int port, int toggle, int rp, int pull); int tcpci_tcpc_drp_toggle(int port); -int tcpci_tcpc_set_connection(int port, enum tcpc_cc_pull pull, - int connect); #endif #ifdef CONFIG_USB_PD_TCPC_LOW_POWER int tcpci_enter_low_power_mode(int port); diff --git a/driver/tcpm/tcpm.h b/driver/tcpm/tcpm.h index f9453d418c..373fbf545f 100644 --- a/driver/tcpm/tcpm.h +++ b/driver/tcpm/tcpm.h @@ -178,16 +178,16 @@ static inline int tcpm_set_cc(int port, int pull) return tcpc_config[port].drv->set_cc(port, pull); } -static inline int tcpm_set_connection(int port, - enum tcpc_cc_pull pull, - int connect) +static inline int tcpm_set_new_connection(int port, + enum tcpc_cc_pull pull) { const struct tcpm_drv *tcpc = tcpc_config[port].drv; if (IS_ENABLED(CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE) && - tcpc->set_connection) - return tcpc->set_connection(port, pull, connect); - return EC_SUCCESS; + tcpc->set_new_connection) + return tcpc->set_new_connection(port, pull); + else + return tcpc->set_cc(port, pull); } static inline int tcpm_set_polarity(int port, enum tcpc_cc_polarity polarity) diff --git a/include/usb_pd_tcpm.h b/include/usb_pd_tcpm.h index 35f9cccb47..4589fc4839 100644 --- a/include/usb_pd_tcpm.h +++ b/include/usb_pd_tcpm.h @@ -320,9 +320,8 @@ struct tcpm_drv { int enable); /** - * Set connection - * If this is a disconnect, set the ROLE_CONTROL, otherwise - * this is a new connection. May have to handle differently + * Set new connection + * There is a new connection. May have to handle differently * if we were performing auto-toggle. Allow a driver to do * any work required to leave the unattached auto-toggle mode * as well as setting the CC lines. If auto-toggle is not @@ -331,13 +330,11 @@ struct tcpm_drv { * * @param port Type-C port number * @param pull enum tcpc_cc_pull of CC lines - * @param connect Connect(1) or Disconnect(0) * * @return EC_SUCCESS or error */ - int (*set_connection)(int port, - enum tcpc_cc_pull pull, - int connect); + int (*set_new_connection)(int port, + enum tcpc_cc_pull pull); #ifdef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE /** |