mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
tcpm: Implement sink support for PD SPR AVS negotiation
Add support to enable TCPM to negotiate with USB PD Standard Power Range Adjustable Voltage Supply (SPR AVS) when acting as a power sink. * Added support to the tcpm power supply properties, allowing userspace to enable and control the dynamic limits (voltage and current) specific to the SPR AVS contract. * Implemented tcpm_pd_select_spr_avs_apdo() to select the appropriate APDO and validate the requested voltage/current against both the Source and Sink capabilities. * Implemented tcpm_pd_build_spr_avs_request() to construct the Request Data Object (RDO) for SPR AVS. * Added SNK_NEGOTIATE_SPR_AVS_CAPABILITIES state to the state machine to handle negotiation for SPR AVS. * Updated the SNK_TRANSITION_SINK state to implement the SPR AVS-specific VBUS transition rules, including reducing current draw to PD_I_SNK_STBY_MA for large voltage changes, as required by USB PD spec. Log stub captured when enabling AVS: $ echo 3 > /sys/class/power_supply/tcpm-source-psy-1-0025/online $ cat /d/usb/tcpm-1-0025/log [ 358.895775] request to set AVS online [ 358.895792] AMS POWER_NEGOTIATION start [ 358.895806] state change SNK_READY -> AMS_START [rev3 POWER_NEGOTIATION] [ 358.895850] state change AMS_START -> SNK_NEGOTIATE_SPR_AVS_CAPABILITIES [rev3 POWER_NEGOTIATION] [ 358.895866] SPR AVS src_pdo_index:4 snk_pdo_index:2 req_op_curr_ma roundup:2200 req_out_volt_mv roundup:9000 [ 358.895880] Requesting APDO SPR AVS 4: 9000 mV, 2200 mA [ 358.896405] set_auto_vbus_discharge_threshold mode:0 pps_active:n vbus:0 pps_apdo_min_volt:0 ret:0 [ 358.896422] PD TX, header: 0x1a82 [ 358.900158] PD TX complete, status: 0 [ 358.900205] pending state change SNK_NEGOTIATE_SPR_AVS_CAPABILITIES -> HARD_RESET_SEND @ 60 ms [rev3 POWER_NEGOTIATION] [ 358.904832] PD RX, header: 0x1a3 [1] [ 358.904854] state change SNK_NEGOTIATE_SPR_AVS_CAPABILITIES -> SNK_TRANSITION_SINK [rev3 POWER_NEGOTIATION] [ 358.904888] pending state change SNK_TRANSITION_SINK -> HARD_RESET_SEND @ 700 ms [rev3 POWER_NEGOTIATION] [ 359.021530] PD RX, header: 0x3a6 [1] [ 359.021546] Setting voltage/current limit 9000 mV 2200 mA [ 359.023035] set_auto_vbus_discharge_threshold mode:3 pps_active:n vbus:9000 pps_apdo_min_volt:0 ret:0 [ 359.023053] state change SNK_TRANSITION_SINK -> SNK_READY [rev3 POWER_NEGOTIATION] [ 359.023090] AMS POWER_NEGOTIATION finished $ cat /sys/class/power_supply/tcpm-source-psy-1-0025/online 3 Log stub captured when increasing voltage: $ echo 9100000 > /sys/class/power_supply/tcpm-source-psy-1-0025/voltage_now $ cat /d/usb/tcpm-1-0025/log [ 632.116714] AMS POWER_NEGOTIATION start [ 632.116728] state change SNK_READY -> AMS_START [rev3 POWER_NEGOTIATION] [ 632.116779] state change AMS_START -> SNK_NEGOTIATE_SPR_AVS_CAPABILITIES [rev3 POWER_NEGOTIATION] [ 632.116798] SPR AVS src_pdo_index:4 snk_pdo_index:2 req_op_curr_ma roundup:2200 req_out_volt_mv roundup:9100 [ 632.116811] Requesting APDO SPR AVS 4: 9100 mV, 2200 mA [ 632.117315] set_auto_vbus_discharge_threshold mode:0 pps_active:n vbus:0 pps_apdo_min_volt:0 ret:0 [ 632.117328] PD TX, header: 0x1c82 [ 632.121007] PD TX complete, status: 0 [ 632.121052] pending state change SNK_NEGOTIATE_SPR_AVS_CAPABILITIES -> HARD_RESET_SEND @ 60 ms [rev3 POWER_NEGOTIATION] [ 632.124572] PD RX, header: 0x5a3 [1] [ 632.124594] state change SNK_NEGOTIATE_SPR_AVS_CAPABILITIES -> SNK_TRANSITION_SINK [rev3 POWER_NEGOTIATION] [ 632.124623] pending state change SNK_TRANSITION_SINK -> HARD_RESET_SEND @ 700 ms [rev3 POWER_NEGOTIATION] [ 632.149256] PD RX, header: 0x7a6 [1] [ 632.149271] Setting voltage/current limit 9100 mV 2200 mA [ 632.150770] set_auto_vbus_discharge_threshold mode:3 pps_active:n vbus:9100 pps_apdo_min_volt:0 ret:0 [ 632.150787] state change SNK_TRANSITION_SINK -> SNK_READY [rev3 POWER_NEGOTIATION] [ 632.150823] AMS POWER_NEGOTIATION finished $ cat /sys/class/power_supply/tcpm-source-psy-1-0025/voltage_now 9100000 Signed-off-by: Badhri Jagan Sridharan <badhri@google.com> Reviewed-by: Amit Sunil Dhamne <amitsd@google.com> Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Link: https://patch.msgid.link/20260316150301.3892223-4-badhri@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
a43dd4f6f9
commit
d3d959404e
+507
-104
File diff suppressed because it is too large
Load Diff
+29
-3
@@ -398,9 +398,30 @@ enum pd_apdo_type {
|
||||
#define PDO_SPR_AVS_APDO_15V_TO_20V_MAX_CURR GENMASK(9, 0) /* 10mA unit */
|
||||
|
||||
/* SPR AVS has two different current ranges 9V - 15V, 15V - 20V */
|
||||
#define SPR_AVS_TIER1_MIN_VOLT_MV 9000
|
||||
#define SPR_AVS_TIER1_MAX_VOLT_MV 15000
|
||||
#define SPR_AVS_TIER2_MAX_VOLT_MV 20000
|
||||
#define SPR_AVS_TIER1_MIN_VOLT_MV 9000
|
||||
#define SPR_AVS_TIER1_MAX_VOLT_MV 15000
|
||||
#define SPR_AVS_TIER2_MAX_VOLT_MV 20000
|
||||
|
||||
#define SPR_AVS_AVS_SMALL_STEP_V 1
|
||||
/* vAvsStep - 100mv */
|
||||
#define SPR_AVS_VOLT_MV_STEP 100
|
||||
/* SPR AVS RDO Operating Current is in 50mA step */
|
||||
#define RDO_SPR_AVS_CURR_MA_STEP 50
|
||||
/* SPR AVS RDO Output voltage is in 25mV step */
|
||||
#define RDO_SPR_AVS_OUT_VOLT_MV_STEP 25
|
||||
|
||||
#define RDO_SPR_AVS_VOLT GENMASK(20, 9)
|
||||
#define RDO_SPR_AVS_CURR GENMASK(6, 0)
|
||||
|
||||
#define RDO_SPR_AVS_OUT_VOLT(mv) \
|
||||
FIELD_PREP(RDO_SPR_AVS_VOLT, ((mv) / RDO_SPR_AVS_OUT_VOLT_MV_STEP))
|
||||
|
||||
#define RDO_SPR_AVS_OP_CURR(ma) \
|
||||
FIELD_PREP(RDO_SPR_AVS_CURR, ((ma) / RDO_SPR_AVS_CURR_MA_STEP))
|
||||
|
||||
#define RDO_AVS(idx, out_mv, op_ma, flags) \
|
||||
(RDO_OBJ(idx) | (flags) | \
|
||||
RDO_SPR_AVS_OUT_VOLT(out_mv) | RDO_SPR_AVS_OP_CURR(op_ma))
|
||||
|
||||
static inline enum pd_pdo_type pdo_type(u32 pdo)
|
||||
{
|
||||
@@ -660,6 +681,11 @@ static inline unsigned int rdo_max_power(u32 rdo)
|
||||
|
||||
#define PD_P_SNK_STDBY_MW 2500 /* 2500 mW */
|
||||
|
||||
#define PD_I_SNK_STBY_MA 500 /* 500 mA */
|
||||
|
||||
#define PD_T_AVS_SRC_TRANS_SMALL 50 /* 50 ms */
|
||||
#define PD_T_AVS_SRC_TRANS_LARGE 700 /* 700 ms */
|
||||
|
||||
#if IS_ENABLED(CONFIG_TYPEC)
|
||||
|
||||
struct usb_power_delivery;
|
||||
|
||||
@@ -31,7 +31,7 @@ enum typec_cc_polarity {
|
||||
/* Time to wait for TCPC to complete transmit */
|
||||
#define PD_T_TCPC_TX_TIMEOUT 100 /* in ms */
|
||||
#define PD_ROLE_SWAP_TIMEOUT (MSEC_PER_SEC * 10)
|
||||
#define PD_PPS_CTRL_TIMEOUT (MSEC_PER_SEC * 10)
|
||||
#define PD_AUG_PSY_CTRL_TIMEOUT (MSEC_PER_SEC * 10)
|
||||
|
||||
enum tcpm_transmit_status {
|
||||
TCPC_TX_SUCCESS = 0,
|
||||
|
||||
Reference in New Issue
Block a user