Hi Badhri, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on usb/usb-testing] [also build test WARNING on robh/for-next v5.9-rc2 next-20200826] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Badhri-Jagan-Sridharan/TCPM-support-for-FRS-and-AutoDischarge-Disconnect/20200825-122527 base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing config: arm-randconfig-r005-20200826 (attached as .config) compiler: arm-linux-gnueabi-gcc (GCC) 9.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arm If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All warnings (new ones prefixed by >>): drivers/usb/typec/tcpm/tcpm.c: In function 'run_state_machine': >> drivers/usb/typec/tcpm/tcpm.c:3684:3: warning: this statement may fall through [-Wimplicit-fallthrough=] 3684 | tcpm_swap_complete(port, port->swap_status); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/usb/typec/tcpm/tcpm.c:3685:2: note: here 3685 | case FR_SWAP_CANCEL: | ^~~~ At top level: drivers/usb/typec/tcpm/tcpm.c:1618:39: warning: 'tcpm_altmode_ops' defined but not used [-Wunused-const-variable=] 1618 | static const struct typec_altmode_ops tcpm_altmode_ops = { | ^~~~~~~~~~~~~~~~ # https://github.com/0day-ci/linux/commit/a8727cbd1e6baa15662e368128ac96b196fe540f git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Badhri-Jagan-Sridharan/TCPM-support-for-FRS-and-AutoDischarge-Disconnect/20200825-122527 git checkout a8727cbd1e6baa15662e368128ac96b196fe540f vim +3684 drivers/usb/typec/tcpm/tcpm.c fce042f02ef03c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-15 2982 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 2983 static void run_state_machine(struct tcpm_port *port) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 2984 { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 2985 int ret; fce042f02ef03c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-15 2986 enum typec_pwr_opmode opmode; 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 2987 unsigned int msecs; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 2988 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 2989 port->enter_state = port->state; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 2990 switch (port->state) { 7893f9e1c26d1f drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-04-16 2991 case TOGGLING: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 2992 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 2993 /* SRC states */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 2994 case SRC_UNATTACHED: b17dd57118fee7 drivers/staging/typec/tcpm.c Guenter Roeck 2017-08-10 2995 if (!port->non_pd_role_swap) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 2996 tcpm_swap_complete(port, -ENOTCONN); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 2997 tcpm_src_detach(port); 7893f9e1c26d1f drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-04-16 2998 if (tcpm_start_toggling(port, tcpm_rp_cc(port))) { 7893f9e1c26d1f drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-04-16 2999 tcpm_set_state(port, TOGGLING, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3000 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3001 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3002 tcpm_set_cc(port, tcpm_rp_cc(port)); 9b0ae69909c281 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3003 if (port->port_type == TYPEC_PORT_DRP) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3004 tcpm_set_state(port, SNK_UNATTACHED, PD_T_DRP_SNK); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3005 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3006 case SRC_ATTACH_WAIT: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3007 if (tcpm_port_is_debug(port)) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3008 tcpm_set_state(port, DEBUG_ACC_ATTACHED, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3009 PD_T_CC_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3010 else if (tcpm_port_is_audio(port)) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3011 tcpm_set_state(port, AUDIO_ACC_ATTACHED, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3012 PD_T_CC_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3013 else if (tcpm_port_is_source(port)) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3014 tcpm_set_state(port, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3015 tcpm_try_snk(port) ? SNK_TRY f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3016 : SRC_ATTACHED, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3017 PD_T_CC_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3018 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3019 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3020 case SNK_TRY: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3021 port->try_snk_count++; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3022 /* f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3023 * Requirements: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3024 * - Do not drive vconn or vbus f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3025 * - Terminate CC pins (both) to Rd f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3026 * Action: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3027 * - Wait for tDRPTry (PD_T_DRP_TRY). f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3028 * Until then, ignore any state changes. f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3029 */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3030 tcpm_set_cc(port, TYPEC_CC_RD); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3031 tcpm_set_state(port, SNK_TRY_WAIT, PD_T_DRP_TRY); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3032 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3033 case SNK_TRY_WAIT: a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3034 if (tcpm_port_is_sink(port)) { a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3035 tcpm_set_state(port, SNK_TRY_WAIT_DEBOUNCE, 0); a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3036 } else { a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3037 tcpm_set_state(port, SRC_TRYWAIT, 0); a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3038 port->max_wait = 0; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3039 } a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3040 break; a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3041 case SNK_TRY_WAIT_DEBOUNCE: a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3042 tcpm_set_state(port, SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3043 PD_T_PD_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3044 break; a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3045 case SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS: a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3046 if (port->vbus_present && tcpm_port_is_sink(port)) { a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3047 tcpm_set_state(port, SNK_ATTACHED, 0); a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3048 } else { a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3049 tcpm_set_state(port, SRC_TRYWAIT, 0); a0a3e04e6b2c7c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3050 port->max_wait = 0; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3051 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3052 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3053 case SRC_TRYWAIT: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3054 tcpm_set_cc(port, tcpm_rp_cc(port)); 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3055 if (port->max_wait == 0) { 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3056 port->max_wait = jiffies + 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3057 msecs_to_jiffies(PD_T_DRP_TRY); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3058 tcpm_set_state(port, SRC_TRYWAIT_UNATTACHED, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3059 PD_T_DRP_TRY); 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3060 } else { 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3061 if (time_is_after_jiffies(port->max_wait)) 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3062 tcpm_set_state(port, SRC_TRYWAIT_UNATTACHED, 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3063 jiffies_to_msecs(port->max_wait - 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3064 jiffies)); 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3065 else 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3066 tcpm_set_state(port, SNK_UNATTACHED, 0); 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3067 } 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3068 break; 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3069 case SRC_TRYWAIT_DEBOUNCE: 02d5be466b68f6 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3070 tcpm_set_state(port, SRC_ATTACHED, PD_T_CC_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3071 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3072 case SRC_TRYWAIT_UNATTACHED: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3073 tcpm_set_state(port, SNK_UNATTACHED, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3074 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3075 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3076 case SRC_ATTACHED: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3077 ret = tcpm_src_attach(port); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3078 tcpm_set_state(port, SRC_UNATTACHED, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3079 ret < 0 ? 0 : PD_T_PS_SOURCE_ON); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3080 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3081 case SRC_STARTUP: fce042f02ef03c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-15 3082 opmode = tcpm_get_pwr_opmode(tcpm_rp_cc(port)); fce042f02ef03c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-15 3083 typec_set_pwr_opmode(port->typec_port, opmode); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3084 port->pwr_opmode = TYPEC_PWR_MODE_USB; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3085 port->caps_count = 0; 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3086 port->negotiated_rev = PD_MAX_REV; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3087 port->message_id = 0; 5fec4b54d0bf6c drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3088 port->rx_msgid = -1; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3089 port->explicit_contract = false; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3090 tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3091 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3092 case SRC_SEND_CAPABILITIES: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3093 port->caps_count++; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3094 if (port->caps_count > PD_N_CAPS_COUNT) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3095 tcpm_set_state(port, SRC_READY, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3096 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3097 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3098 ret = tcpm_pd_send_source_caps(port); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3099 if (ret < 0) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3100 tcpm_set_state(port, SRC_SEND_CAPABILITIES, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3101 PD_T_SEND_SOURCE_CAP); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3102 } else { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3103 /* f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3104 * Per standard, we should clear the reset counter here. f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3105 * However, that can result in state machine hang-ups. f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3106 * Reset it only in READY state to improve stability. f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3107 */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3108 /* port->hard_reset_count = 0; */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3109 port->caps_count = 0; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3110 port->pd_capable = true; 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3111 tcpm_set_state_cond(port, SRC_SEND_CAPABILITIES_TIMEOUT, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3112 PD_T_SEND_SOURCE_CAP); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3113 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3114 break; 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3115 case SRC_SEND_CAPABILITIES_TIMEOUT: 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3116 /* 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3117 * Error recovery for a PD_DATA_SOURCE_CAP reply timeout. 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3118 * 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3119 * PD 2.0 sinks are supposed to accept src-capabilities with a 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3120 * 3.0 header and simply ignore any src PDOs which the sink does 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3121 * not understand such as PPS but some 2.0 sinks instead ignore 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3122 * the entire PD_DATA_SOURCE_CAP message, causing contract 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3123 * negotiation to fail. 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3124 * 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3125 * After PD_N_HARD_RESET_COUNT hard-reset attempts, we try 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3126 * sending src-capabilities with a lower PD revision to 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3127 * make these broken sinks work. 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3128 */ 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3129 if (port->hard_reset_count < PD_N_HARD_RESET_COUNT) { 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3130 tcpm_set_state(port, HARD_RESET_SEND, 0); 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3131 } else if (port->negotiated_rev > PD_REV20) { 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3132 port->negotiated_rev--; 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3133 port->hard_reset_count = 0; 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3134 tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0); 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3135 } else { 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3136 tcpm_set_state(port, hard_reset_state(port), 0); 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3137 } 976daf9d119993 drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-03-16 3138 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3139 case SRC_NEGOTIATE_CAPABILITIES: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3140 ret = tcpm_pd_check_request(port); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3141 if (ret < 0) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3142 tcpm_pd_send_control(port, PD_CTRL_REJECT); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3143 if (!port->explicit_contract) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3144 tcpm_set_state(port, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3145 SRC_WAIT_NEW_CAPABILITIES, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3146 } else { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3147 tcpm_set_state(port, SRC_READY, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3148 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3149 } else { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3150 tcpm_pd_send_control(port, PD_CTRL_ACCEPT); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3151 tcpm_set_state(port, SRC_TRANSITION_SUPPLY, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3152 PD_T_SRC_TRANSITION); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3153 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3154 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3155 case SRC_TRANSITION_SUPPLY: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3156 /* XXX: regulator_set_voltage(vbus, ...) */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3157 tcpm_pd_send_control(port, PD_CTRL_PS_RDY); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3158 port->explicit_contract = true; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3159 typec_set_pwr_opmode(port->typec_port, TYPEC_PWR_MODE_PD); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3160 port->pwr_opmode = TYPEC_PWR_MODE_PD; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3161 tcpm_set_state_cond(port, SRC_READY, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3162 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3163 case SRC_READY: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3164 #if 1 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3165 port->hard_reset_count = 0; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3166 #endif f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3167 port->try_src_count = 0; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3168 3113bf1a5da35f drivers/staging/typec/tcpm.c Guenter Roeck 2017-08-10 3169 tcpm_swap_complete(port, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3170 tcpm_typec_connect(port); 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3171 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3172 tcpm_check_send_discover(port); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3173 /* f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3174 * 6.3.5 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3175 * Sending ping messages is not necessary if f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3176 * - the source operates at vSafe5V f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3177 * or f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3178 * - The system is not operating in PD mode f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3179 * or f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3180 * - Both partners are connected using a Type-C connector f451ac9e4c6dd2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3181 * f451ac9e4c6dd2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3182 * There is no actual need to send PD messages since the local f451ac9e4c6dd2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3183 * port type-c and the spec does not clearly say whether PD is f451ac9e4c6dd2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3184 * possible when type-c is connected to Type-A/B f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3185 */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3186 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3187 case SRC_WAIT_NEW_CAPABILITIES: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3188 /* Nothing to do... */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3189 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3190 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3191 /* SNK states */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3192 case SNK_UNATTACHED: b17dd57118fee7 drivers/staging/typec/tcpm.c Guenter Roeck 2017-08-10 3193 if (!port->non_pd_role_swap) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3194 tcpm_swap_complete(port, -ENOTCONN); 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3195 tcpm_pps_complete(port, -ENOTCONN); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3196 tcpm_snk_detach(port); 7893f9e1c26d1f drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-04-16 3197 if (tcpm_start_toggling(port, TYPEC_CC_RD)) { 7893f9e1c26d1f drivers/usb/typec/tcpm/tcpm.c Hans de Goede 2019-04-16 3198 tcpm_set_state(port, TOGGLING, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3199 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3200 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3201 tcpm_set_cc(port, TYPEC_CC_RD); 9b0ae69909c281 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3202 if (port->port_type == TYPEC_PORT_DRP) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3203 tcpm_set_state(port, SRC_UNATTACHED, PD_T_DRP_SRC); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3204 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3205 case SNK_ATTACH_WAIT: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3206 if ((port->cc1 == TYPEC_CC_OPEN && f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3207 port->cc2 != TYPEC_CC_OPEN) || f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3208 (port->cc1 != TYPEC_CC_OPEN && f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3209 port->cc2 == TYPEC_CC_OPEN)) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3210 tcpm_set_state(port, SNK_DEBOUNCED, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3211 PD_T_CC_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3212 else if (tcpm_port_is_disconnected(port)) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3213 tcpm_set_state(port, SNK_UNATTACHED, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3214 PD_T_PD_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3215 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3216 case SNK_DEBOUNCED: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3217 if (tcpm_port_is_disconnected(port)) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3218 tcpm_set_state(port, SNK_UNATTACHED, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3219 PD_T_PD_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3220 else if (port->vbus_present) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3221 tcpm_set_state(port, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3222 tcpm_try_src(port) ? SRC_TRY f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3223 : SNK_ATTACHED, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3224 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3225 else f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3226 /* Wait for VBUS, but not forever */ 56277035c294ec drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3227 tcpm_set_state(port, PORT_RESET, PD_T_PS_SOURCE_ON); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3228 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3229 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3230 case SRC_TRY: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3231 port->try_src_count++; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3232 tcpm_set_cc(port, tcpm_rp_cc(port)); 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3233 port->max_wait = 0; 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3234 tcpm_set_state(port, SRC_TRY_WAIT, 0); 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3235 break; 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3236 case SRC_TRY_WAIT: 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3237 if (port->max_wait == 0) { 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3238 port->max_wait = jiffies + 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3239 msecs_to_jiffies(PD_T_DRP_TRY); 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3240 msecs = PD_T_DRP_TRY; 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3241 } else { 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3242 if (time_is_after_jiffies(port->max_wait)) 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3243 msecs = jiffies_to_msecs(port->max_wait - 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3244 jiffies); 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3245 else 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3246 msecs = 0; 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3247 } 131c7d12ef21e1 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3248 tcpm_set_state(port, SNK_TRYWAIT, msecs); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3249 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3250 case SRC_TRY_DEBOUNCE: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3251 tcpm_set_state(port, SRC_ATTACHED, PD_T_PD_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3252 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3253 case SNK_TRYWAIT: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3254 tcpm_set_cc(port, TYPEC_CC_RD); af450ebb500ad2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3255 tcpm_set_state(port, SNK_TRYWAIT_VBUS, PD_T_CC_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3256 break; af450ebb500ad2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3257 case SNK_TRYWAIT_VBUS: af450ebb500ad2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3258 /* af450ebb500ad2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3259 * TCPM stays in this state indefinitely until VBUS af450ebb500ad2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3260 * is detected as long as Rp is not detected for af450ebb500ad2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3261 * more than a time period of tPDDebounce. af450ebb500ad2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3262 */ af450ebb500ad2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3263 if (port->vbus_present && tcpm_port_is_sink(port)) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3264 tcpm_set_state(port, SNK_ATTACHED, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3265 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3266 } af450ebb500ad2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3267 if (!tcpm_port_is_sink(port)) af450ebb500ad2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3268 tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3269 break; af450ebb500ad2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3270 case SNK_TRYWAIT_DEBOUNCE: af450ebb500ad2 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3271 tcpm_set_state(port, SNK_UNATTACHED, PD_T_PD_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3272 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3273 case SNK_ATTACHED: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3274 ret = tcpm_snk_attach(port); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3275 if (ret < 0) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3276 tcpm_set_state(port, SNK_UNATTACHED, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3277 else f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3278 tcpm_set_state(port, SNK_STARTUP, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3279 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3280 case SNK_STARTUP: fce042f02ef03c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-15 3281 opmode = tcpm_get_pwr_opmode(port->polarity ? fce042f02ef03c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-15 3282 port->cc2 : port->cc1); fce042f02ef03c drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-15 3283 typec_set_pwr_opmode(port->typec_port, opmode); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3284 port->pwr_opmode = TYPEC_PWR_MODE_USB; 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3285 port->negotiated_rev = PD_MAX_REV; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3286 port->message_id = 0; 5fec4b54d0bf6c drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3287 port->rx_msgid = -1; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3288 port->explicit_contract = false; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3289 tcpm_set_state(port, SNK_DISCOVERY, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3290 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3291 case SNK_DISCOVERY: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3292 if (port->vbus_present) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3293 tcpm_set_current_limit(port, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3294 tcpm_get_current_limit(port), f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3295 5000); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3296 tcpm_set_charge(port, true); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3297 tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3298 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3299 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3300 /* f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3301 * For DRP, timeouts differ. Also, handling is supposed to be f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3302 * different and much more complex (dead battery detection; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3303 * see USB power delivery specification, section 8.3.3.6.1.5.1). f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3304 */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3305 tcpm_set_state(port, hard_reset_state(port), 9b0ae69909c281 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3306 port->port_type == TYPEC_PORT_DRP ? f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3307 PD_T_DB_DETECT : PD_T_NO_RESPONSE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3308 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3309 case SNK_DISCOVERY_DEBOUNCE: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3310 tcpm_set_state(port, SNK_DISCOVERY_DEBOUNCE_DONE, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3311 PD_T_CC_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3312 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3313 case SNK_DISCOVERY_DEBOUNCE_DONE: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3314 if (!tcpm_port_is_disconnected(port) && f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3315 tcpm_port_is_sink(port) && f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3316 time_is_after_jiffies(port->delayed_runtime)) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3317 tcpm_set_state(port, SNK_DISCOVERY, 9578bcd0bb487b drivers/usb/typec/tcpm.c Dan Carpenter 2018-06-07 3318 jiffies_to_msecs(port->delayed_runtime - 9578bcd0bb487b drivers/usb/typec/tcpm.c Dan Carpenter 2018-06-07 3319 jiffies)); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3320 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3321 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3322 tcpm_set_state(port, unattached_state(port), 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3323 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3324 case SNK_WAIT_CAPABILITIES: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3325 ret = port->tcpc->set_pd_rx(port->tcpc, true); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3326 if (ret < 0) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3327 tcpm_set_state(port, SNK_READY, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3328 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3329 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3330 /* f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3331 * If VBUS has never been low, and we time out waiting f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3332 * for source cap, try a soft reset first, in case we f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3333 * were already in a stable contract before this boot. f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3334 * Do this only once. f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3335 */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3336 if (port->vbus_never_low) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3337 port->vbus_never_low = false; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3338 tcpm_set_state(port, SOFT_RESET_SEND, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3339 PD_T_SINK_WAIT_CAP); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3340 } else { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3341 tcpm_set_state(port, hard_reset_state(port), f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3342 PD_T_SINK_WAIT_CAP); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3343 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3344 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3345 case SNK_NEGOTIATE_CAPABILITIES: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3346 port->pd_capable = true; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3347 port->hard_reset_count = 0; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3348 ret = tcpm_pd_send_request(port); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3349 if (ret < 0) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3350 /* Let the Source send capabilities again. */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3351 tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3352 } else { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3353 tcpm_set_state_cond(port, hard_reset_state(port), f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3354 PD_T_SENDER_RESPONSE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3355 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3356 break; 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3357 case SNK_NEGOTIATE_PPS_CAPABILITIES: 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3358 ret = tcpm_pd_send_pps_request(port); 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3359 if (ret < 0) { 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3360 port->pps_status = ret; 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3361 /* 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3362 * If this was called due to updates to sink 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3363 * capabilities, and pps is no longer valid, we should 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3364 * safely fall back to a standard PDO. 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3365 */ 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3366 if (port->update_sink_caps) 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3367 tcpm_set_state(port, SNK_NEGOTIATE_CAPABILITIES, 0); 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3368 else 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3369 tcpm_set_state(port, SNK_READY, 0); 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3370 } else { 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3371 tcpm_set_state_cond(port, hard_reset_state(port), 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3372 PD_T_SENDER_RESPONSE); 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3373 } 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3374 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3375 case SNK_TRANSITION_SINK: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3376 case SNK_TRANSITION_SINK_VBUS: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3377 tcpm_set_state(port, hard_reset_state(port), f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3378 PD_T_PS_TRANSITION); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3379 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3380 case SNK_READY: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3381 port->try_snk_count = 0; 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3382 port->update_sink_caps = false; 8bf05746cffa34 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-17 3383 if (port->explicit_contract) { 8bf05746cffa34 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-17 3384 typec_set_pwr_opmode(port->typec_port, 8bf05746cffa34 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-17 3385 TYPEC_PWR_MODE_PD); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3386 port->pwr_opmode = TYPEC_PWR_MODE_PD; 8bf05746cffa34 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-17 3387 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3388 3113bf1a5da35f drivers/staging/typec/tcpm.c Guenter Roeck 2017-08-10 3389 tcpm_swap_complete(port, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3390 tcpm_typec_connect(port); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3391 tcpm_check_send_discover(port); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3392 mod_delayed_work(port->wq, &port->enable_frs, msecs_to_jiffies(0)); 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3393 tcpm_pps_complete(port, port->pps_status); f2a8aa053c1761 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3394 power_supply_changed(port->psy); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3395 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3396 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3397 /* Accessory states */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3398 case ACC_UNATTACHED: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3399 tcpm_acc_detach(port); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3400 tcpm_set_state(port, SRC_UNATTACHED, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3401 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3402 case DEBUG_ACC_ATTACHED: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3403 case AUDIO_ACC_ATTACHED: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3404 ret = tcpm_acc_attach(port); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3405 if (ret < 0) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3406 tcpm_set_state(port, ACC_UNATTACHED, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3407 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3408 case AUDIO_ACC_DEBOUNCE: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3409 tcpm_set_state(port, ACC_UNATTACHED, PD_T_CC_DEBOUNCE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3410 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3411 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3412 /* Hard_Reset states */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3413 case HARD_RESET_SEND: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3414 tcpm_pd_transmit(port, TCPC_TX_HARD_RESET, NULL); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3415 tcpm_set_state(port, HARD_RESET_START, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3416 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3417 case HARD_RESET_START: a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3418 port->sink_cap_done = false; a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3419 if (port->tcpc->enable_frs) a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3420 port->tcpc->enable_frs(port->tcpc, false); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3421 port->hard_reset_count++; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3422 port->tcpc->set_pd_rx(port->tcpc, false); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3423 tcpm_unregister_altmodes(port); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3424 port->nr_sink_caps = 0; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3425 port->send_discover = true; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3426 if (port->pwr_role == TYPEC_SOURCE) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3427 tcpm_set_state(port, SRC_HARD_RESET_VBUS_OFF, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3428 PD_T_PS_HARD_RESET); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3429 else f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3430 tcpm_set_state(port, SNK_HARD_RESET_SINK_OFF, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3431 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3432 case SRC_HARD_RESET_VBUS_OFF: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3433 tcpm_set_vconn(port, true); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3434 tcpm_set_vbus(port, false); 23b5f73266e59a drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2018-10-01 3435 tcpm_set_roles(port, port->self_powered, TYPEC_SOURCE, 6ecc632d4b35d2 drivers/usb/typec/tcpm/tcpm.c Li Jun 2020-02-14 3436 tcpm_data_role_for_source(port)); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3437 tcpm_set_state(port, SRC_HARD_RESET_VBUS_ON, PD_T_SRC_RECOVER); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3438 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3439 case SRC_HARD_RESET_VBUS_ON: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3440 tcpm_set_vbus(port, true); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3441 port->tcpc->set_pd_rx(port->tcpc, true); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3442 tcpm_set_attached_state(port, true); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3443 tcpm_set_state(port, SRC_UNATTACHED, PD_T_PS_SOURCE_ON); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3444 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3445 case SNK_HARD_RESET_SINK_OFF: 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3446 memset(&port->pps_data, 0, sizeof(port->pps_data)); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3447 tcpm_set_vconn(port, false); 157c0f2f641a99 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2018-10-01 3448 if (port->pd_capable) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3449 tcpm_set_charge(port, false); 23b5f73266e59a drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2018-10-01 3450 tcpm_set_roles(port, port->self_powered, TYPEC_SINK, 6ecc632d4b35d2 drivers/usb/typec/tcpm/tcpm.c Li Jun 2020-02-14 3451 tcpm_data_role_for_sink(port)); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3452 /* f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3453 * VBUS may or may not toggle, depending on the adapter. f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3454 * If it doesn't toggle, transition to SNK_HARD_RESET_SINK_ON f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3455 * directly after timeout. f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3456 */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3457 tcpm_set_state(port, SNK_HARD_RESET_SINK_ON, PD_T_SAFE_0V); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3458 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3459 case SNK_HARD_RESET_WAIT_VBUS: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3460 /* Assume we're disconnected if VBUS doesn't come back. */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3461 tcpm_set_state(port, SNK_UNATTACHED, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3462 PD_T_SRC_RECOVER_MAX + PD_T_SRC_TURN_ON); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3463 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3464 case SNK_HARD_RESET_SINK_ON: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3465 /* Note: There is no guarantee that VBUS is on in this state */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3466 /* f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3467 * XXX: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3468 * The specification suggests that dual mode ports in sink f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3469 * mode should transition to state PE_SRC_Transition_to_default. f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3470 * See USB power delivery specification chapter 8.3.3.6.1.3. f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3471 * This would mean to to f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3472 * - turn off VCONN, reset power supply f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3473 * - request hardware reset f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3474 * - turn on VCONN f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3475 * - Transition to state PE_Src_Startup f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3476 * SNK only ports shall transition to state Snk_Startup f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3477 * (see chapter 8.3.3.3.8). f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3478 * Similar, dual-mode ports in source mode should transition f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3479 * to PE_SNK_Transition_to_default. f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3480 */ 157c0f2f641a99 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2018-10-01 3481 if (port->pd_capable) { 157c0f2f641a99 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2018-10-01 3482 tcpm_set_current_limit(port, 157c0f2f641a99 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2018-10-01 3483 tcpm_get_current_limit(port), 157c0f2f641a99 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2018-10-01 3484 5000); 157c0f2f641a99 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2018-10-01 3485 tcpm_set_charge(port, true); 157c0f2f641a99 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2018-10-01 3486 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3487 tcpm_set_attached_state(port, true); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3488 tcpm_set_state(port, SNK_STARTUP, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3489 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3490 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3491 /* Soft_Reset states */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3492 case SOFT_RESET: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3493 port->message_id = 0; 5fec4b54d0bf6c drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3494 port->rx_msgid = -1; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3495 tcpm_pd_send_control(port, PD_CTRL_ACCEPT); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3496 if (port->pwr_role == TYPEC_SOURCE) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3497 tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3498 else f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3499 tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3500 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3501 case SOFT_RESET_SEND: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3502 port->message_id = 0; 5fec4b54d0bf6c drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3503 port->rx_msgid = -1; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3504 if (tcpm_pd_send_control(port, PD_CTRL_SOFT_RESET)) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3505 tcpm_set_state_cond(port, hard_reset_state(port), 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3506 else f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3507 tcpm_set_state_cond(port, hard_reset_state(port), f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3508 PD_T_SENDER_RESPONSE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3509 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3510 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3511 /* DR_Swap states */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3512 case DR_SWAP_SEND: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3513 tcpm_pd_send_control(port, PD_CTRL_DR_SWAP); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3514 tcpm_set_state_cond(port, DR_SWAP_SEND_TIMEOUT, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3515 PD_T_SENDER_RESPONSE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3516 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3517 case DR_SWAP_ACCEPT: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3518 tcpm_pd_send_control(port, PD_CTRL_ACCEPT); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3519 tcpm_set_state_cond(port, DR_SWAP_CHANGE_DR, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3520 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3521 case DR_SWAP_SEND_TIMEOUT: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3522 tcpm_swap_complete(port, -ETIMEDOUT); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3523 tcpm_set_state(port, ready_state(port), 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3524 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3525 case DR_SWAP_CHANGE_DR: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3526 if (port->data_role == TYPEC_HOST) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3527 tcpm_unregister_altmodes(port); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3528 tcpm_set_roles(port, true, port->pwr_role, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3529 TYPEC_DEVICE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3530 } else { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3531 tcpm_set_roles(port, true, port->pwr_role, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3532 TYPEC_HOST); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3533 port->send_discover = true; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3534 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3535 tcpm_set_state(port, ready_state(port), 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3536 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3537 a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3538 case FR_SWAP_SEND: a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3539 if (tcpm_pd_send_control(port, PD_CTRL_FR_SWAP)) { a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3540 tcpm_set_state(port, ERROR_RECOVERY, 0); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3541 break; a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3542 } a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3543 tcpm_set_state_cond(port, FR_SWAP_SEND_TIMEOUT, PD_T_SENDER_RESPONSE); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3544 break; a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3545 case FR_SWAP_SEND_TIMEOUT: a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3546 tcpm_set_state(port, ERROR_RECOVERY, 0); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3547 break; a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3548 case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF: a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3549 tcpm_set_state(port, ERROR_RECOVERY, PD_T_PS_SOURCE_OFF); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3550 break; a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3551 case FR_SWAP_SNK_SRC_NEW_SINK_READY: a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3552 if (port->vbus_source) a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3553 tcpm_set_state(port, FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED, 0); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3554 else a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3555 tcpm_set_state(port, ERROR_RECOVERY, PD_T_RECEIVER_RESPONSE); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3556 break; a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3557 case FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED: a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3558 tcpm_set_pwr_role(port, TYPEC_SOURCE); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3559 if (tcpm_pd_send_control(port, PD_CTRL_PS_RDY)) { a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3560 tcpm_set_state(port, ERROR_RECOVERY, 0); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3561 break; a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3562 } a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3563 tcpm_set_cc(port, tcpm_rp_cc(port)); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3564 tcpm_set_state(port, SRC_STARTUP, PD_T_SWAP_SRC_START); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3565 break; a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3566 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3567 /* PR_Swap states */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3568 case PR_SWAP_ACCEPT: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3569 tcpm_pd_send_control(port, PD_CTRL_ACCEPT); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3570 tcpm_set_state(port, PR_SWAP_START, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3571 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3572 case PR_SWAP_SEND: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3573 tcpm_pd_send_control(port, PD_CTRL_PR_SWAP); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3574 tcpm_set_state_cond(port, PR_SWAP_SEND_TIMEOUT, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3575 PD_T_SENDER_RESPONSE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3576 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3577 case PR_SWAP_SEND_TIMEOUT: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3578 tcpm_swap_complete(port, -ETIMEDOUT); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3579 tcpm_set_state(port, ready_state(port), 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3580 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3581 case PR_SWAP_START: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3582 if (port->pwr_role == TYPEC_SOURCE) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3583 tcpm_set_state(port, PR_SWAP_SRC_SNK_TRANSITION_OFF, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3584 PD_T_SRC_TRANSITION); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3585 else f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3586 tcpm_set_state(port, PR_SWAP_SNK_SRC_SINK_OFF, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3587 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3588 case PR_SWAP_SRC_SNK_TRANSITION_OFF: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3589 tcpm_set_vbus(port, false); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3590 port->explicit_contract = false; b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3591 /* allow time for Vbus discharge, must be < tSrcSwapStdby */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3592 tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF, b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3593 PD_T_SRCSWAPSTDBY); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3594 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3595 case PR_SWAP_SRC_SNK_SOURCE_OFF: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3596 tcpm_set_cc(port, TYPEC_CC_RD); b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3597 /* allow CC debounce */ b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3598 tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED, b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3599 PD_T_CC_DEBOUNCE); b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3600 break; b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3601 case PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED: 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3602 /* 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3603 * USB-PD standard, 6.2.1.4, Port Power Role: 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3604 * "During the Power Role Swap Sequence, for the initial Source 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3605 * Port, the Port Power Role field shall be set to Sink in the 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3606 * PS_RDY Message indicating that the initial Source’s power 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3607 * supply is turned off" 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3608 */ 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3609 tcpm_set_pwr_role(port, TYPEC_SINK); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3610 if (tcpm_pd_send_control(port, PD_CTRL_PS_RDY)) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3611 tcpm_set_state(port, ERROR_RECOVERY, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3612 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3613 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3614 tcpm_set_state_cond(port, SNK_UNATTACHED, PD_T_PS_SOURCE_ON); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3615 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3616 case PR_SWAP_SRC_SNK_SINK_ON: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3617 tcpm_set_state(port, SNK_STARTUP, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3618 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3619 case PR_SWAP_SNK_SRC_SINK_OFF: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3620 tcpm_set_charge(port, false); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3621 tcpm_set_state(port, hard_reset_state(port), f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3622 PD_T_PS_SOURCE_OFF); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3623 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3624 case PR_SWAP_SNK_SRC_SOURCE_ON: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3625 tcpm_set_cc(port, tcpm_rp_cc(port)); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3626 tcpm_set_vbus(port, true); b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3627 /* b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3628 * allow time VBUS ramp-up, must be < tNewSrc b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3629 * Also, this window overlaps with CC debounce as well. b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3630 * So, Wait for the max of two which is PD_T_NEWSRC b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3631 */ b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3632 tcpm_set_state(port, PR_SWAP_SNK_SRC_SOURCE_ON_VBUS_RAMPED_UP, b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3633 PD_T_NEWSRC); b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3634 break; b965b6317ff147 drivers/staging/typec/tcpm.c Badhri Jagan Sridharan 2017-08-28 3635 case PR_SWAP_SNK_SRC_SOURCE_ON_VBUS_RAMPED_UP: 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3636 /* 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3637 * USB PD standard, 6.2.1.4: 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3638 * "Subsequent Messages initiated by the Policy Engine, 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3639 * such as the PS_RDY Message sent to indicate that Vbus 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3640 * is ready, will have the Port Power Role field set to 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3641 * Source." 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3642 */ f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3643 tcpm_set_pwr_role(port, TYPEC_SOURCE); 050161ea3268ad drivers/staging/typec/tcpm.c Guenter Roeck 2017-05-09 3644 tcpm_pd_send_control(port, PD_CTRL_PS_RDY); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3645 tcpm_set_state(port, SRC_STARTUP, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3646 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3647 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3648 case VCONN_SWAP_ACCEPT: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3649 tcpm_pd_send_control(port, PD_CTRL_ACCEPT); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3650 tcpm_set_state(port, VCONN_SWAP_START, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3651 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3652 case VCONN_SWAP_SEND: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3653 tcpm_pd_send_control(port, PD_CTRL_VCONN_SWAP); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3654 tcpm_set_state(port, VCONN_SWAP_SEND_TIMEOUT, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3655 PD_T_SENDER_RESPONSE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3656 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3657 case VCONN_SWAP_SEND_TIMEOUT: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3658 tcpm_swap_complete(port, -ETIMEDOUT); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3659 tcpm_set_state(port, ready_state(port), 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3660 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3661 case VCONN_SWAP_START: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3662 if (port->vconn_role == TYPEC_SOURCE) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3663 tcpm_set_state(port, VCONN_SWAP_WAIT_FOR_VCONN, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3664 else f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3665 tcpm_set_state(port, VCONN_SWAP_TURN_ON_VCONN, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3666 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3667 case VCONN_SWAP_WAIT_FOR_VCONN: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3668 tcpm_set_state(port, hard_reset_state(port), f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3669 PD_T_VCONN_SOURCE_ON); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3670 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3671 case VCONN_SWAP_TURN_ON_VCONN: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3672 tcpm_set_vconn(port, true); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3673 tcpm_pd_send_control(port, PD_CTRL_PS_RDY); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3674 tcpm_set_state(port, ready_state(port), 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3675 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3676 case VCONN_SWAP_TURN_OFF_VCONN: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3677 tcpm_set_vconn(port, false); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3678 tcpm_set_state(port, ready_state(port), 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3679 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3680 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3681 case DR_SWAP_CANCEL: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3682 case PR_SWAP_CANCEL: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3683 case VCONN_SWAP_CANCEL: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 @3684 tcpm_swap_complete(port, port->swap_status); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3685 case FR_SWAP_CANCEL: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3686 if (port->pwr_role == TYPEC_SOURCE) f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3687 tcpm_set_state(port, SRC_READY, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3688 else f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3689 tcpm_set_state(port, SNK_READY, 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3690 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3691 f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3692 case BIST_RX: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3693 switch (BDO_MODE_MASK(port->bist_request)) { f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3694 case BDO_MODE_CARRIER2: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3695 tcpm_pd_transmit(port, TCPC_TX_BIST_MODE_2, NULL); 6e1c2241f4cecf drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-07-15 3696 tcpm_set_state(port, unattached_state(port), 6e1c2241f4cecf drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-07-15 3697 PD_T_BIST_CONT_MODE); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3698 break; b2dcfefc43f783 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-07-15 3699 case BDO_MODE_TESTDATA: b2dcfefc43f783 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-07-15 3700 if (port->tcpc->set_bist_data) { b2dcfefc43f783 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-07-15 3701 tcpm_log(port, "Enable BIST MODE TESTDATA"); b2dcfefc43f783 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-07-15 3702 port->tcpc->set_bist_data(port->tcpc, true); b2dcfefc43f783 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-07-15 3703 } b2dcfefc43f783 drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-07-15 3704 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3705 default: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3706 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3707 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3708 break; 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3709 case GET_STATUS_SEND: 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3710 tcpm_pd_send_control(port, PD_CTRL_GET_STATUS); 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3711 tcpm_set_state(port, GET_STATUS_SEND_TIMEOUT, 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3712 PD_T_SENDER_RESPONSE); 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3713 break; 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3714 case GET_STATUS_SEND_TIMEOUT: 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3715 tcpm_set_state(port, ready_state(port), 0); 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3716 break; 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3717 case GET_PPS_STATUS_SEND: 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3718 tcpm_pd_send_control(port, PD_CTRL_GET_PPS_STATUS); 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3719 tcpm_set_state(port, GET_PPS_STATUS_SEND_TIMEOUT, 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3720 PD_T_SENDER_RESPONSE); 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3721 break; 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3722 case GET_PPS_STATUS_SEND_TIMEOUT: 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3723 tcpm_set_state(port, ready_state(port), 0); 64f7c494a3c02b drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3724 break; a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3725 case GET_SINK_CAP: a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3726 tcpm_pd_send_control(port, PD_CTRL_GET_SINK_CAP); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3727 tcpm_set_state(port, GET_SINK_CAP_TIMEOUT, PD_T_SENDER_RESPONSE); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3728 break; a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3729 case GET_SINK_CAP_TIMEOUT: a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3730 port->sink_cap_done = true; a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3731 tcpm_set_state(port, ready_state(port), 0); a8727cbd1e6baa drivers/usb/typec/tcpm/tcpm.c Badhri Jagan Sridharan 2020-08-24 3732 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3733 case ERROR_RECOVERY: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3734 tcpm_swap_complete(port, -EPROTO); 2eadc33f40d4c5 drivers/usb/typec/tcpm.c Adam Thomson 2018-04-23 3735 tcpm_pps_complete(port, -EPROTO); b17dd57118fee7 drivers/staging/typec/tcpm.c Guenter Roeck 2017-08-10 3736 tcpm_set_state(port, PORT_RESET, 0); b17dd57118fee7 drivers/staging/typec/tcpm.c Guenter Roeck 2017-08-10 3737 break; b17dd57118fee7 drivers/staging/typec/tcpm.c Guenter Roeck 2017-08-10 3738 case PORT_RESET: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3739 tcpm_reset_port(port); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3740 tcpm_set_cc(port, TYPEC_CC_OPEN); b17dd57118fee7 drivers/staging/typec/tcpm.c Guenter Roeck 2017-08-10 3741 tcpm_set_state(port, PORT_RESET_WAIT_OFF, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3742 PD_T_ERROR_RECOVERY); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3743 break; b17dd57118fee7 drivers/staging/typec/tcpm.c Guenter Roeck 2017-08-10 3744 case PORT_RESET_WAIT_OFF: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3745 tcpm_set_state(port, f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3746 tcpm_default_state(port), f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3747 port->vbus_present ? PD_T_PS_SOURCE_OFF : 0); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3748 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3749 default: f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3750 WARN(1, "Unexpected port state %d\n", port->state); f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3751 break; f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3752 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3753 } f0690a25a140b8 drivers/staging/typec/tcpm.c Guenter Roeck 2017-04-27 3754 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org