/* Copyright 2019 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /* * Contains common USB functions shared between the old (i.e. usb_pd_protocol) * and the new (i.e. usb_sm_*) USB-C PD stacks. */ #include "common.h" #include "charge_state.h" #include "usb_pd.h" #include "usb_pd_tcpm.h" int usb_get_battery_soc(void) { #if defined(CONFIG_CHARGER) return charge_get_percent(); #elif defined(CONFIG_BATTERY) return board_get_battery_soc(); #else return 0; #endif } /* * CC values for regular sources and Debug sources (aka DTS) * * Source type Mode of Operation CC1 CC2 * --------------------------------------------- * Regular Default USB Power RpUSB Open * Regular USB-C @ 1.5 A Rp1A5 Open * Regular USB-C @ 3 A Rp3A0 Open * DTS Default USB Power Rp3A0 Rp1A5 * DTS USB-C @ 1.5 A Rp1A5 RpUSB * DTS USB-C @ 3 A Rp3A0 RpUSB */ typec_current_t usb_get_typec_current_limit(enum pd_cc_polarity_type polarity, enum tcpc_cc_voltage_status cc1, enum tcpc_cc_voltage_status cc2) { typec_current_t charge = 0; enum tcpc_cc_voltage_status cc = polarity ? cc2 : cc1; enum tcpc_cc_voltage_status cc_alt = polarity ? cc1 : cc2; switch (cc) { case TYPEC_CC_VOLT_RP_3_0: if (!cc_is_rp(cc_alt) || cc_alt == TYPEC_CC_VOLT_RP_DEF) charge = 3000; else if (cc_alt == TYPEC_CC_VOLT_RP_1_5) charge = 500; break; case TYPEC_CC_VOLT_RP_1_5: charge = 1500; break; case TYPEC_CC_VOLT_RP_DEF: charge = 500; break; default: break; } if (IS_ENABLED(CONFIG_USBC_DISABLE_CHARGE_FROM_RP_DEF) && charge == 500) charge = 0; if (cc_is_rp(cc_alt)) charge |= TYPEC_CURRENT_DTS_MASK; return charge; } enum pd_cc_polarity_type get_snk_polarity(enum tcpc_cc_voltage_status cc1, enum tcpc_cc_voltage_status cc2) { /* The following assumes: * * TYPEC_CC_VOLT_RP_3_0 > TYPEC_CC_VOLT_RP_1_5 * TYPEC_CC_VOLT_RP_1_5 > TYPEC_CC_VOLT_RP_DEF * TYPEC_CC_VOLT_RP_DEF > TYPEC_CC_VOLT_OPEN */ return cc2 > cc1; }