Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0+ */
0002 /*
0003  * Driver for TI TPS6598x USB Power Delivery controller family
0004  *
0005  * Copyright (C) 2020 Purism SPC
0006  * Author: Guido Günther <agx@sigxcpu.org>
0007  */
0008 
0009 #undef TRACE_SYSTEM
0010 #define TRACE_SYSTEM tps6598x
0011 
0012 #if !defined(_TPS6598X_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
0013 #define _TPS6598X_TRACE_H_
0014 
0015 #include "tps6598x.h"
0016 
0017 #include <linux/stringify.h>
0018 #include <linux/types.h>
0019 #include <linux/tracepoint.h>
0020 
0021 #define show_irq_flags(flags) \
0022     __print_flags_u64(flags, "|", \
0023         { TPS_REG_INT_PD_SOFT_RESET,            "PD_SOFT_RESET" }, \
0024         { TPS_REG_INT_HARD_RESET,           "HARD_RESET" }, \
0025         { TPS_REG_INT_PLUG_EVENT,           "PLUG_EVENT" }, \
0026         { TPS_REG_INT_PR_SWAP_COMPLETE,         "PR_SWAP_COMPLETE" }, \
0027         { TPS_REG_INT_DR_SWAP_COMPLETE,         "DR_SWAP_COMPLETE" }, \
0028         { TPS_REG_INT_RDO_RECEIVED_FROM_SINK,       "RDO_RECEIVED_FROM_SINK" }, \
0029         { TPS_REG_INT_BIST,             "BIST" }, \
0030         { TPS_REG_INT_OVERCURRENT,          "OVERCURRENT" }, \
0031         { TPS_REG_INT_ATTENTION_RECEIVED,       "ATTENTION_RECEIVED" }, \
0032         { TPS_REG_INT_VDM_RECEIVED,         "VDM_RECEIVED" }, \
0033         { TPS_REG_INT_NEW_CONTRACT_AS_CONSUMER,     "NEW_CONTRACT_AS_CONSUMER" }, \
0034         { TPS_REG_INT_NEW_CONTRACT_AS_PROVIDER,     "NEW_CONTRACT_AS_PROVIDER" }, \
0035         { TPS_REG_INT_SOURCE_CAP_MESSAGE_READY,     "SOURCE_CAP_MESSAGE_READY" }, \
0036         { TPS_REG_INT_SINK_CAP_MESSAGE_READY,       "SINK_CAP_MESSAGE_READY" }, \
0037         { TPS_REG_INT_PR_SWAP_REQUESTED,        "PR_SWAP_REQUESTED" }, \
0038         { TPS_REG_INT_GOTO_MIN_RECEIVED,        "GOTO_MIN_RECEIVED" }, \
0039         { TPS_REG_INT_USB_HOST_PRESENT,         "USB_HOST_PRESENT" }, \
0040         { TPS_REG_INT_USB_HOST_PRESENT_NO_LONGER,   "USB_HOST_PRESENT_NO_LONGER" }, \
0041         { TPS_REG_INT_HIGH_VOLTAGE_WARNING,     "HIGH_VOLTAGE_WARNING" }, \
0042         { TPS_REG_INT_PP_SWITCH_CHANGED,        "PP_SWITCH_CHANGED" }, \
0043         { TPS_REG_INT_POWER_STATUS_UPDATE,      "POWER_STATUS_UPDATE" }, \
0044         { TPS_REG_INT_DATA_STATUS_UPDATE,       "DATA_STATUS_UPDATE" }, \
0045         { TPS_REG_INT_STATUS_UPDATE,            "STATUS_UPDATE" }, \
0046         { TPS_REG_INT_PD_STATUS_UPDATE,         "PD_STATUS_UPDATE" }, \
0047         { TPS_REG_INT_ADC_LOW_THRESHOLD,        "ADC_LOW_THRESHOLD" }, \
0048         { TPS_REG_INT_ADC_HIGH_THRESHOLD,       "ADC_HIGH_THRESHOLD" }, \
0049         { TPS_REG_INT_CMD1_COMPLETE,            "CMD1_COMPLETE" }, \
0050         { TPS_REG_INT_CMD2_COMPLETE,            "CMD2_COMPLETE" }, \
0051         { TPS_REG_INT_ERROR_DEVICE_INCOMPATIBLE,    "ERROR_DEVICE_INCOMPATIBLE" }, \
0052         { TPS_REG_INT_ERROR_CANNOT_PROVIDE_PWR,     "ERROR_CANNOT_PROVIDE_PWR" }, \
0053         { TPS_REG_INT_ERROR_CAN_PROVIDE_PWR_LATER,  "ERROR_CAN_PROVIDE_PWR_LATER" }, \
0054         { TPS_REG_INT_ERROR_POWER_EVENT_OCCURRED,   "ERROR_POWER_EVENT_OCCURRED" }, \
0055         { TPS_REG_INT_ERROR_MISSING_GET_CAP_MESSAGE,    "ERROR_MISSING_GET_CAP_MESSAGE" }, \
0056         { TPS_REG_INT_ERROR_PROTOCOL_ERROR,     "ERROR_PROTOCOL_ERROR" }, \
0057         { TPS_REG_INT_ERROR_MESSAGE_DATA,       "ERROR_MESSAGE_DATA" }, \
0058         { TPS_REG_INT_ERROR_DISCHARGE_FAILED,       "ERROR_DISCHARGE_FAILED" }, \
0059         { TPS_REG_INT_SRC_TRANSITION,           "SRC_TRANSITION" }, \
0060         { TPS_REG_INT_ERROR_UNABLE_TO_SOURCE,       "ERROR_UNABLE_TO_SOURCE" }, \
0061         { TPS_REG_INT_VDM_ENTERED_MODE,         "VDM_ENTERED_MODE" }, \
0062         { TPS_REG_INT_VDM_MSG_SENT,         "VDM_MSG_SENT" }, \
0063         { TPS_REG_INT_DISCOVER_MODES_COMPLETE,      "DISCOVER_MODES_COMPLETE" }, \
0064         { TPS_REG_INT_EXIT_MODES_COMPLETE,      "EXIT_MODES_COMPLETE" }, \
0065         { TPS_REG_INT_USER_VID_ALT_MODE_ENTERED,    "USER_VID_ALT_MODE_ENTERED" }, \
0066         { TPS_REG_INT_USER_VID_ALT_MODE_EXIT,       "USER_VID_ALT_MODE_EXIT" }, \
0067         { TPS_REG_INT_USER_VID_ALT_MODE_ATTN_VDM,   "USER_VID_ALT_MODE_ATTN_VDM" }, \
0068         { TPS_REG_INT_USER_VID_ALT_MODE_OTHER_VDM,  "USER_VID_ALT_MODE_OTHER_VDM" })
0069 
0070 #define show_cd321x_irq_flags(flags) \
0071     __print_flags_u64(flags, "|", \
0072         { APPLE_CD_REG_INT_PLUG_EVENT,          "PLUG_EVENT" }, \
0073         { APPLE_CD_REG_INT_POWER_STATUS_UPDATE,     "POWER_STATUS_UPDATE" }, \
0074         { APPLE_CD_REG_INT_DATA_STATUS_UPDATE,      "DATA_STATUS_UPDATE" }, \
0075         { APPLE_CD_REG_INT_STATUS_UPDATE,       "STATUS_UPDATE" })
0076 
0077 #define TPS6598X_STATUS_FLAGS_MASK (GENMASK(31, 0) ^ (TPS_STATUS_CONN_STATE_MASK | \
0078                               TPS_STATUS_PP_5V0_SWITCH_MASK | \
0079                               TPS_STATUS_PP_HV_SWITCH_MASK | \
0080                               TPS_STATUS_PP_EXT_SWITCH_MASK | \
0081                               TPS_STATUS_PP_CABLE_SWITCH_MASK | \
0082                               TPS_STATUS_POWER_SOURCE_MASK | \
0083                               TPS_STATUS_VBUS_STATUS_MASK | \
0084                               TPS_STATUS_USB_HOST_PRESENT_MASK | \
0085                               TPS_STATUS_LEGACY_MASK))
0086 
0087 #define show_status_conn_state(status) \
0088     __print_symbolic(TPS_STATUS_CONN_STATE((status)), \
0089         { TPS_STATUS_CONN_STATE_CONN_WITH_R_A,  "conn-Ra"  }, \
0090         { TPS_STATUS_CONN_STATE_CONN_NO_R_A,    "conn-no-Ra" }, \
0091         { TPS_STATUS_CONN_STATE_NO_CONN_R_A,    "no-conn-Ra" }, \
0092         { TPS_STATUS_CONN_STATE_DEBUG_CONN, "debug"  }, \
0093         { TPS_STATUS_CONN_STATE_AUDIO_CONN, "audio"  }, \
0094         { TPS_STATUS_CONN_STATE_DISABLED,   "disabled" }, \
0095         { TPS_STATUS_CONN_STATE_NO_CONN,    "no-conn" })
0096 
0097 #define show_status_pp_switch_state(status) \
0098     __print_symbolic(status, \
0099         { TPS_STATUS_PP_SWITCH_STATE_IN,    "in" }, \
0100         { TPS_STATUS_PP_SWITCH_STATE_OUT,   "out" }, \
0101         { TPS_STATUS_PP_SWITCH_STATE_FAULT, "fault" }, \
0102         { TPS_STATUS_PP_SWITCH_STATE_DISABLED,  "off" })
0103 
0104 #define show_status_power_sources(status) \
0105     __print_symbolic(TPS_STATUS_POWER_SOURCE(status), \
0106         { TPS_STATUS_POWER_SOURCE_VBUS,     "vbus" }, \
0107         { TPS_STATUS_POWER_SOURCE_VIN_3P3,  "vin-3p3" }, \
0108         { TPS_STATUS_POWER_SOURCE_DEAD_BAT, "dead-battery" }, \
0109         { TPS_STATUS_POWER_SOURCE_UNKNOWN,  "unknown" })
0110 
0111 #define show_status_vbus_status(status) \
0112     __print_symbolic(TPS_STATUS_VBUS_STATUS(status), \
0113         { TPS_STATUS_VBUS_STATUS_VSAFE0V,   "vSafe0V" }, \
0114         { TPS_STATUS_VBUS_STATUS_VSAFE5V,   "vSafe5V" }, \
0115         { TPS_STATUS_VBUS_STATUS_PD,        "pd" }, \
0116         { TPS_STATUS_VBUS_STATUS_FAULT,     "fault" })
0117 
0118 #define show_status_usb_host_present(status) \
0119     __print_symbolic(TPS_STATUS_USB_HOST_PRESENT(status), \
0120         { TPS_STATUS_USB_HOST_PRESENT_PD_USB,    "pd-usb" }, \
0121         { TPS_STATUS_USB_HOST_PRESENT_NO_PD,     "no-pd" }, \
0122         { TPS_STATUS_USB_HOST_PRESENT_PD_NO_USB, "pd-no-usb" }, \
0123         { TPS_STATUS_USB_HOST_PRESENT_NO,    "no" })
0124 
0125 #define show_status_legacy(status) \
0126     __print_symbolic(TPS_STATUS_LEGACY(status),      \
0127         { TPS_STATUS_LEGACY_SOURCE,      "source" }, \
0128         { TPS_STATUS_LEGACY_SINK,        "sink" }, \
0129         { TPS_STATUS_LEGACY_NO,          "no" })
0130 
0131 #define show_status_flags(flags) \
0132     __print_flags((flags & TPS6598X_STATUS_FLAGS_MASK), "|", \
0133               { TPS_STATUS_PLUG_PRESENT,    "PLUG_PRESENT" }, \
0134               { TPS_STATUS_PLUG_UPSIDE_DOWN,    "UPSIDE_DOWN" }, \
0135               { TPS_STATUS_PORTROLE,        "PORTROLE" }, \
0136               { TPS_STATUS_DATAROLE,        "DATAROLE" }, \
0137               { TPS_STATUS_VCONN,       "VCONN" }, \
0138               { TPS_STATUS_OVERCURRENT,     "OVERCURRENT" }, \
0139               { TPS_STATUS_GOTO_MIN_ACTIVE, "GOTO_MIN_ACTIVE" }, \
0140               { TPS_STATUS_BIST,        "BIST" }, \
0141               { TPS_STATUS_HIGH_VOLAGE_WARNING, "HIGH_VOLAGE_WARNING" }, \
0142               { TPS_STATUS_HIGH_LOW_VOLTAGE_WARNING, "HIGH_LOW_VOLTAGE_WARNING" })
0143 
0144 #define show_power_status_source_sink(power_status) \
0145     __print_symbolic(TPS_POWER_STATUS_SOURCESINK(power_status), \
0146         { 1, "sink" }, \
0147         { 0, "source" })
0148 
0149 #define show_power_status_typec_status(power_status) \
0150     __print_symbolic(TPS_POWER_STATUS_PWROPMODE(power_status), \
0151         { TPS_POWER_STATUS_TYPEC_CURRENT_PD,  "pd" }, \
0152         { TPS_POWER_STATUS_TYPEC_CURRENT_3A0, "3.0A" }, \
0153         { TPS_POWER_STATUS_TYPEC_CURRENT_1A5, "1.5A" }, \
0154         { TPS_POWER_STATUS_TYPEC_CURRENT_USB, "usb" })
0155 
0156 #define show_power_status_bc12_status(power_status) \
0157     __print_symbolic(TPS_POWER_STATUS_BC12_STATUS(power_status), \
0158         { TPS_POWER_STATUS_BC12_STATUS_DCP, "dcp" }, \
0159         { TPS_POWER_STATUS_BC12_STATUS_CDP, "cdp" }, \
0160         { TPS_POWER_STATUS_BC12_STATUS_SDP, "sdp" })
0161 
0162 #define TPS_DATA_STATUS_FLAGS_MASK (GENMASK(31, 0) ^ (TPS_DATA_STATUS_DP_PIN_ASSIGNMENT_MASK | \
0163                               TPS_DATA_STATUS_TBT_CABLE_SPEED_MASK | \
0164                               TPS_DATA_STATUS_TBT_CABLE_GEN_MASK))
0165 
0166 #define show_data_status_flags(data_status) \
0167     __print_flags(data_status & TPS_DATA_STATUS_FLAGS_MASK, "|", \
0168         { TPS_DATA_STATUS_DATA_CONNECTION,  "DATA_CONNECTION" }, \
0169         { TPS_DATA_STATUS_UPSIDE_DOWN,      "DATA_UPSIDE_DOWN" }, \
0170         { TPS_DATA_STATUS_ACTIVE_CABLE,     "ACTIVE_CABLE" }, \
0171         { TPS_DATA_STATUS_USB2_CONNECTION,  "USB2_CONNECTION" }, \
0172         { TPS_DATA_STATUS_USB3_CONNECTION,  "USB3_CONNECTION" }, \
0173         { TPS_DATA_STATUS_USB3_GEN2,        "USB3_GEN2" }, \
0174         { TPS_DATA_STATUS_USB_DATA_ROLE,    "USB_DATA_ROLE" }, \
0175         { TPS_DATA_STATUS_DP_CONNECTION,    "DP_CONNECTION" }, \
0176         { TPS_DATA_STATUS_DP_SINK,      "DP_SINK" }, \
0177         { TPS_DATA_STATUS_TBT_CONNECTION,   "TBT_CONNECTION" }, \
0178         { TPS_DATA_STATUS_TBT_TYPE,     "TBT_TYPE" }, \
0179         { TPS_DATA_STATUS_OPTICAL_CABLE,    "OPTICAL_CABLE" }, \
0180         { TPS_DATA_STATUS_ACTIVE_LINK_TRAIN,    "ACTIVE_LINK_TRAIN" }, \
0181         { TPS_DATA_STATUS_FORCE_LSX,        "FORCE_LSX" }, \
0182         { TPS_DATA_STATUS_POWER_MISMATCH,   "POWER_MISMATCH" })
0183 
0184 #define show_data_status_dp_pin_assignment(data_status) \
0185     __print_symbolic(TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT(data_status), \
0186         { TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT_E, "E" }, \
0187         { TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT_F, "F" }, \
0188         { TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT_C, "C" }, \
0189         { TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT_D, "D" }, \
0190         { TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT_A, "A" }, \
0191         { TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT_B, "B" })
0192 
0193 #define maybe_show_data_status_dp_pin_assignment(data_status) \
0194     (data_status & TPS_DATA_STATUS_DP_CONNECTION ? \
0195      show_data_status_dp_pin_assignment(data_status) : "")
0196 
0197 TRACE_EVENT(tps6598x_irq,
0198         TP_PROTO(u64 event1,
0199              u64 event2),
0200         TP_ARGS(event1, event2),
0201 
0202         TP_STRUCT__entry(
0203                  __field(u64, event1)
0204                  __field(u64, event2)
0205                  ),
0206 
0207         TP_fast_assign(
0208                __entry->event1 = event1;
0209                __entry->event2 = event2;
0210                ),
0211 
0212         TP_printk("event1=%s, event2=%s",
0213               show_irq_flags(__entry->event1),
0214               show_irq_flags(__entry->event2))
0215 );
0216 
0217 TRACE_EVENT(cd321x_irq,
0218         TP_PROTO(u64 event),
0219         TP_ARGS(event),
0220 
0221         TP_STRUCT__entry(
0222                  __field(u64, event)
0223                  ),
0224 
0225         TP_fast_assign(
0226                __entry->event = event;
0227                ),
0228 
0229         TP_printk("event=%s",
0230               show_cd321x_irq_flags(__entry->event))
0231 );
0232 
0233 TRACE_EVENT(tps6598x_status,
0234         TP_PROTO(u32 status),
0235         TP_ARGS(status),
0236 
0237         TP_STRUCT__entry(
0238                  __field(u32, status)
0239                  ),
0240 
0241         TP_fast_assign(
0242                __entry->status = status;
0243                ),
0244 
0245         TP_printk("conn: %s, pp_5v0: %s, pp_hv: %s, pp_ext: %s, pp_cable: %s, "
0246               "pwr-src: %s, vbus: %s, usb-host: %s, legacy: %s, flags: %s",
0247               show_status_conn_state(__entry->status),
0248               show_status_pp_switch_state(TPS_STATUS_PP_5V0_SWITCH(__entry->status)),
0249               show_status_pp_switch_state(TPS_STATUS_PP_HV_SWITCH(__entry->status)),
0250               show_status_pp_switch_state(TPS_STATUS_PP_EXT_SWITCH(__entry->status)),
0251               show_status_pp_switch_state(TPS_STATUS_PP_CABLE_SWITCH(__entry->status)),
0252               show_status_power_sources(__entry->status),
0253               show_status_vbus_status(__entry->status),
0254               show_status_usb_host_present(__entry->status),
0255               show_status_legacy(__entry->status),
0256               show_status_flags(__entry->status)
0257             )
0258 );
0259 
0260 TRACE_EVENT(tps6598x_power_status,
0261         TP_PROTO(u16 power_status),
0262         TP_ARGS(power_status),
0263 
0264         TP_STRUCT__entry(
0265                  __field(u16, power_status)
0266                  ),
0267 
0268         TP_fast_assign(
0269                __entry->power_status = power_status;
0270                ),
0271 
0272         TP_printk("conn: %d, pwr-role: %s, typec: %s, bc: %s",
0273               !!TPS_POWER_STATUS_CONNECTION(__entry->power_status),
0274               show_power_status_source_sink(__entry->power_status),
0275               show_power_status_typec_status(__entry->power_status),
0276               show_power_status_bc12_status(__entry->power_status)
0277             )
0278 );
0279 
0280 TRACE_EVENT(tps6598x_data_status,
0281         TP_PROTO(u32 data_status),
0282         TP_ARGS(data_status),
0283 
0284         TP_STRUCT__entry(
0285                  __field(u32, data_status)
0286                  ),
0287 
0288         TP_fast_assign(
0289                __entry->data_status = data_status;
0290                ),
0291 
0292         TP_printk("%s%s%s",
0293               show_data_status_flags(__entry->data_status),
0294               __entry->data_status & TPS_DATA_STATUS_DP_CONNECTION ? ", DP pinout " : "",
0295               maybe_show_data_status_dp_pin_assignment(__entry->data_status)
0296             )
0297 );
0298 
0299 #endif /* _TPS6598X_TRACE_H_ */
0300 
0301 /* This part must be outside protection */
0302 #undef TRACE_INCLUDE_FILE
0303 #define TRACE_INCLUDE_FILE trace
0304 #undef TRACE_INCLUDE_PATH
0305 #define TRACE_INCLUDE_PATH .
0306 #include <trace/define_trace.h>