LCOV - code coverage report
Current view: top level - zephyr/drivers/usb_c - usbc_tcpc.h Coverage Total Hit
Test: new.info Lines: 56.6 % 83 47
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            1 : /*
       2              :  * Copyright 2022 The Chromium OS Authors
       3              :  * SPDX-License-Identifier: Apache-2.0
       4              :  */
       5              : 
       6              : /**
       7              :  * @file
       8              :  * @brief USBC Type-C Port Controller device APIs
       9              :  *
      10              :  * This file contains the USB Type-C Port Controller device APIs.
      11              :  * All Type-C Port Controller device drivers should implement the
      12              :  * APIs described in this file.
      13              :  */
      14              : 
      15              : #ifndef ZEPHYR_INCLUDE_DRIVERS_USBC_USBC_TCPC_H_
      16              : #define ZEPHYR_INCLUDE_DRIVERS_USBC_USBC_TCPC_H_
      17              : 
      18              : /**
      19              :  * @brief USB Type-C Port Controller API
      20              :  * @defgroup usb_type_c_port_controller_api USB Type-C Port Controller API
      21              :  * @since 3.1
      22              :  * @version 0.1.0
      23              :  * @ingroup usb_type_c
      24              :  * @{
      25              :  */
      26              : 
      27              : #include <zephyr/types.h>
      28              : #include <zephyr/device.h>
      29              : #include <errno.h>
      30              : 
      31              : #include "usbc_tc.h"
      32              : #include "usbc_pd.h"
      33              : 
      34              : #ifdef __cplusplus
      35              : extern "C" {
      36              : #endif
      37              : 
      38              : /**
      39              :  * @brief TCPC Alert bits
      40              :  */
      41            1 : enum tcpc_alert {
      42              :         /** CC status changed */
      43              :         TCPC_ALERT_CC_STATUS,
      44              :         /** Power status changed */
      45              :         TCPC_ALERT_POWER_STATUS,
      46              :         /** Receive Buffer register changed */
      47              :         TCPC_ALERT_MSG_STATUS,
      48              :         /** Received Hard Reset message */
      49              :         TCPC_ALERT_HARD_RESET_RECEIVED,
      50              :         /** SOP* message transmission not successful */
      51              :         TCPC_ALERT_TRANSMIT_MSG_FAILED,
      52              :         /**
      53              :          * Reset or SOP* message transmission not sent
      54              :          * due to an incoming receive message
      55              :          */
      56              :         TCPC_ALERT_TRANSMIT_MSG_DISCARDED,
      57              :         /** Reset or SOP* message transmission successful */
      58              :         TCPC_ALERT_TRANSMIT_MSG_SUCCESS,
      59              :         /** A high-voltage alarm has occurred */
      60              :         TCPC_ALERT_VBUS_ALARM_HI,
      61              :         /** A low-voltage alarm has occurred */
      62              :         TCPC_ALERT_VBUS_ALARM_LO,
      63              :         /** A fault has occurred. Read the FAULT_STATUS register */
      64              :         TCPC_ALERT_FAULT_STATUS,
      65              :         /** TCPC RX buffer has overflowed */
      66              :         TCPC_ALERT_RX_BUFFER_OVERFLOW,
      67              :         /** The TCPC in Attached.SNK state has detected a sink disconnect */
      68              :         TCPC_ALERT_VBUS_SNK_DISCONNECT,
      69              :         /** Receive buffer register changed */
      70              :         TCPC_ALERT_BEGINNING_MSG_STATUS,
      71              :         /** Extended status changed */
      72              :         TCPC_ALERT_EXTENDED_STATUS,
      73              :         /**
      74              :          * An extended interrupt event has occurred. Read the alert_extended
      75              :          * register
      76              :          */
      77              :         TCPC_ALERT_EXTENDED,
      78              :         /** A vendor defined alert has been detected */
      79              :         TCPC_ALERT_VENDOR_DEFINED
      80              : };
      81              : 
      82              : /**
      83              :  * @brief TCPC Status register
      84              :  */
      85            1 : enum tcpc_status_reg {
      86              :         /** The Altert register */
      87              :         TCPC_ALERT_STATUS,
      88              :         /** The CC Status register */
      89              :         TCPC_CC_STATUS,
      90              :         /** The Power Status register */
      91              :         TCPC_POWER_STATUS,
      92              :         /** The Fault Status register */
      93              :         TCPC_FAULT_STATUS,
      94              :         /** The Extended Status register */
      95              :         TCPC_EXTENDED_STATUS,
      96              :         /** The Extended Alert Status register */
      97              :         TCPC_EXTENDED_ALERT_STATUS,
      98              :         /** The Vendor Defined Status register */
      99              :         TCPC_VENDOR_DEFINED_STATUS
     100              : };
     101              : 
     102              : /**
     103              :  * @brief TCPC Chip Information
     104              :  */
     105            1 : struct tcpc_chip_info {
     106              :         /** Vendor Id */
     107            1 :         uint16_t vendor_id;
     108              :         /** Product Id */
     109            1 :         uint16_t product_id;
     110              :         /** Device Id */
     111            1 :         uint16_t device_id;
     112              :         /** Firmware version number */
     113            1 :         uint64_t fw_version_number;
     114              : 
     115              :         union {
     116              :                 /** Minimum Required firmware version string */
     117            1 :                 uint8_t min_req_fw_version_string[8];
     118              :                 /** Minimum Required firmware version number */
     119            1 :                 uint64_t min_req_fw_version_number;
     120            0 :         };
     121              : };
     122              : 
     123            0 : typedef int (*tcpc_vconn_control_cb_t)(const struct device *dev, enum tc_cc_polarity pol,
     124              :                                        bool enable);
     125            0 : typedef int (*tcpc_vconn_discharge_cb_t)(const struct device *dev, enum tc_cc_polarity pol,
     126              :                                          bool enable);
     127            0 : typedef void (*tcpc_alert_handler_cb_t)(const struct device *dev, void *data,
     128              :                                         enum tcpc_alert alert);
     129              : 
     130            0 : __subsystem struct tcpc_driver_api {
     131            0 :         int (*init)(const struct device *dev);
     132            0 :         int (*get_cc)(const struct device *dev, enum tc_cc_voltage_state *cc1,
     133              :                       enum tc_cc_voltage_state *cc2);
     134            0 :         int (*select_rp_value)(const struct device *dev, enum tc_rp_value rp);
     135            0 :         int (*get_rp_value)(const struct device *dev, enum tc_rp_value *rp);
     136            0 :         int (*set_cc)(const struct device *dev, enum tc_cc_pull pull);
     137            0 :         void (*set_vconn_discharge_cb)(const struct device *dev, tcpc_vconn_discharge_cb_t cb);
     138            0 :         void (*set_vconn_cb)(const struct device *dev, tcpc_vconn_control_cb_t vconn_cb);
     139            0 :         int (*vconn_discharge)(const struct device *dev, bool enable);
     140            0 :         int (*set_vconn)(const struct device *dev, bool enable);
     141            0 :         int (*set_roles)(const struct device *dev, enum tc_power_role power_role,
     142              :                          enum tc_data_role data_role);
     143            0 :         int (*get_rx_pending_msg)(const struct device *dev, struct pd_msg *msg);
     144            0 :         int (*set_rx_enable)(const struct device *dev, bool enable);
     145            0 :         int (*set_cc_polarity)(const struct device *dev, enum tc_cc_polarity polarity);
     146            0 :         int (*transmit_data)(const struct device *dev, struct pd_msg *msg);
     147            0 :         int (*dump_std_reg)(const struct device *dev);
     148            0 :         void (*alert_handler_cb)(const struct device *dev, void *data, enum tcpc_alert alert);
     149            0 :         int (*get_status_register)(const struct device *dev, enum tcpc_status_reg reg,
     150              :                                    uint32_t *status);
     151            0 :         int (*clear_status_register)(const struct device *dev, enum tcpc_status_reg reg,
     152              :                                      uint32_t mask);
     153            0 :         int (*mask_status_register)(const struct device *dev, enum tcpc_status_reg reg,
     154              :                                     uint32_t mask);
     155            0 :         int (*set_debug_accessory)(const struct device *dev, bool enable);
     156            0 :         int (*set_debug_detach)(const struct device *dev);
     157            0 :         int (*set_drp_toggle)(const struct device *dev, bool enable);
     158            0 :         int (*get_snk_ctrl)(const struct device *dev);
     159            0 :         int (*set_snk_ctrl)(const struct device *dev, bool enable);
     160            0 :         int (*get_src_ctrl)(const struct device *dev);
     161            0 :         int (*set_src_ctrl)(const struct device *dev, bool enable);
     162            0 :         int (*get_chip_info)(const struct device *dev, struct tcpc_chip_info *chip_info);
     163            0 :         int (*set_low_power_mode)(const struct device *dev, bool enable);
     164            0 :         int (*sop_prime_enable)(const struct device *dev, bool enable);
     165            0 :         int (*set_bist_test_mode)(const struct device *dev, bool enable);
     166            0 :         int (*set_alert_handler_cb)(const struct device *dev, tcpc_alert_handler_cb_t handler,
     167              :                                     void *data);
     168              : };
     169              : 
     170              : /**
     171              :  * @brief Returns whether the sink has detected a Rp resistor on the other side
     172              :  */
     173            1 : static inline int tcpc_is_cc_rp(enum tc_cc_voltage_state cc)
     174              : {
     175              :         return (cc == TC_CC_VOLT_RP_DEF) || (cc == TC_CC_VOLT_RP_1A5) || (cc == TC_CC_VOLT_RP_3A0);
     176              : }
     177              : 
     178              : /**
     179              :  * @brief Returns true if both CC lines are completely open
     180              :  */
     181            1 : static inline int tcpc_is_cc_open(enum tc_cc_voltage_state cc1, enum tc_cc_voltage_state cc2)
     182              : {
     183              :         return (cc1 < TC_CC_VOLT_RD) && (cc2 < TC_CC_VOLT_RD);
     184              : }
     185              : 
     186              : /**
     187              :  * @brief Returns true if we detect the port partner is a snk debug accessory
     188              :  */
     189            1 : static inline int tcpc_is_cc_snk_dbg_acc(enum tc_cc_voltage_state cc1, enum tc_cc_voltage_state cc2)
     190              : {
     191              :         return cc1 == TC_CC_VOLT_RD && cc2 == TC_CC_VOLT_RD;
     192              : }
     193              : 
     194              : /**
     195              :  * @brief Returns true if we detect the port partner is a src debug accessory
     196              :  */
     197            1 : static inline int tcpc_is_cc_src_dbg_acc(enum tc_cc_voltage_state cc1, enum tc_cc_voltage_state cc2)
     198              : {
     199              :         return tcpc_is_cc_rp(cc1) && tcpc_is_cc_rp(cc2);
     200              : }
     201              : 
     202              : /**
     203              :  * @brief Returns true if the port partner is an audio accessory
     204              :  */
     205            1 : static inline int tcpc_is_cc_audio_acc(enum tc_cc_voltage_state cc1, enum tc_cc_voltage_state cc2)
     206              : {
     207              :         return cc1 == TC_CC_VOLT_RA && cc2 == TC_CC_VOLT_RA;
     208              : }
     209              : 
     210              : /**
     211              :  * @brief Returns true if the port partner is presenting at least one Rd
     212              :  */
     213            1 : static inline int tcpc_is_cc_at_least_one_rd(enum tc_cc_voltage_state cc1,
     214              :                                              enum tc_cc_voltage_state cc2)
     215              : {
     216              :         return cc1 == TC_CC_VOLT_RD || cc2 == TC_CC_VOLT_RD;
     217              : }
     218              : 
     219              : /**
     220              :  * @brief Returns true if the port partner is presenting Rd on only one CC line
     221              :  */
     222            1 : static inline int tcpc_is_cc_only_one_rd(enum tc_cc_voltage_state cc1, enum tc_cc_voltage_state cc2)
     223              : {
     224              :         return tcpc_is_cc_at_least_one_rd(cc1, cc2) && cc1 != cc2;
     225              : }
     226              : 
     227              : /**
     228              :  * @brief Initializes the TCPC
     229              :  *
     230              :  * @param dev Runtime device structure
     231              :  *
     232              :  * @retval 0 on success
     233              :  * @retval -EIO on failure
     234              :  * @retval -EAGAIN if initialization should be postponed
     235              :  */
     236            1 : static inline int tcpc_init(const struct device *dev)
     237              : {
     238              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     239              : 
     240              :         __ASSERT(api->init != NULL, "Callback pointer should not be NULL");
     241              : 
     242              :         return api->init(dev);
     243              : }
     244              : 
     245              : /**
     246              :  * @brief Reads the status of the CC lines
     247              :  *
     248              :  * @param dev  Runtime device structure
     249              :  * @param cc1  A pointer where the CC1 status is written
     250              :  * @param cc2  A pointer where the CC2 status is written
     251              :  *
     252              :  * @retval 0 on success
     253              :  * @retval -EIO on failure
     254              :  * @retval -ENOSYS if not implemented
     255              :  */
     256            1 : static inline int tcpc_get_cc(const struct device *dev, enum tc_cc_voltage_state *cc1,
     257              :                               enum tc_cc_voltage_state *cc2)
     258              : {
     259              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     260              : 
     261              :         if (api->get_cc == NULL) {
     262              :                 return -ENOSYS;
     263              :         }
     264              : 
     265              :         return api->get_cc(dev, cc1, cc2);
     266              : }
     267              : 
     268              : /**
     269              :  * @brief Sets the value of CC pull up resistor used when operating as a Source
     270              :  *
     271              :  * @param dev   Runtime device structure
     272              :  * @param rp    Value of the Pull-Up Resistor.
     273              :  *
     274              :  * @retval 0 on success
     275              :  * @retval -ENOSYS
     276              :  * @retval -EIO on failure
     277              :  */
     278            1 : static inline int tcpc_select_rp_value(const struct device *dev, enum tc_rp_value rp)
     279              : {
     280              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     281              : 
     282              :         if (api->select_rp_value == NULL) {
     283              :                 return -ENOSYS;
     284              :         }
     285              : 
     286              :         return api->select_rp_value(dev, rp);
     287              : }
     288              : 
     289              : /**
     290              :  * @brief Gets the value of the CC pull up resistor used when operating as a Source
     291              :  *
     292              :  * @param dev   Runtime device structure
     293              :  * @param rp    pointer where the value of the Pull-Up Resistor is stored
     294              :  *
     295              :  * @retval 0 on success
     296              :  * @retval -ENOSYS
     297              :  * @retval -EIO on failure
     298              :  */
     299            1 : static inline int tcpc_get_rp_value(const struct device *dev, enum tc_rp_value *rp)
     300              : {
     301              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     302              : 
     303              :         if (api->get_rp_value == NULL) {
     304              :                 return -ENOSYS;
     305              :         }
     306              : 
     307              :         return api->get_rp_value(dev, rp);
     308              : }
     309              : 
     310              : /**
     311              :  * @brief Sets the CC pull resistor and sets the role as either Source or Sink
     312              :  *
     313              :  * @param dev   Runtime device structure
     314              :  * @param pull  The pull resistor to set
     315              :  *
     316              :  * @retval 0 on success
     317              :  * @retval -EIO on failure
     318              :  */
     319            1 : static inline int tcpc_set_cc(const struct device *dev, enum tc_cc_pull pull)
     320              : {
     321              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     322              : 
     323              :         __ASSERT(api->set_cc != NULL, "Callback pointer should not be NULL");
     324              : 
     325              :         return api->set_cc(dev, pull);
     326              : }
     327              : 
     328              : /**
     329              :  * @brief Sets a callback that can enable or disable VCONN if the TCPC is
     330              :  *        unable to or the system is configured in a way that does not use
     331              :  *        the VCONN control capabilities of the TCPC
     332              :  *
     333              :  * The callback is called in the tcpc_set_vconn function if vconn_cb isn't NULL
     334              :  *
     335              :  * @param dev       Runtime device structure
     336              :  * @param vconn_cb  pointer to the callback function that controls vconn
     337              :  */
     338            1 : static inline void tcpc_set_vconn_cb(const struct device *dev, tcpc_vconn_control_cb_t vconn_cb)
     339              : {
     340              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     341              : 
     342              :         __ASSERT(api->set_vconn_cb != NULL, "Callback pointer should not be NULL");
     343              : 
     344              :         api->set_vconn_cb(dev, vconn_cb);
     345              : }
     346              : 
     347              : /**
     348              :  * @brief Sets a callback that can enable or discharge VCONN if the TCPC is
     349              :  *        unable to or the system is configured in a way that does not use
     350              :  *        the VCONN control capabilities of the TCPC
     351              :  *
     352              :  * The callback is called in the tcpc_vconn_discharge function if cb isn't NULL
     353              :  *
     354              :  * @param dev       Runtime device structure
     355              :  * @param cb  pointer to the callback function that discharges vconn
     356              :  */
     357            1 : static inline void tcpc_set_vconn_discharge_cb(const struct device *dev,
     358              :                                                tcpc_vconn_discharge_cb_t cb)
     359              : {
     360              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     361              : 
     362              :         __ASSERT(api->set_vconn_discharge_cb != NULL, "Callback pointer should not be NULL");
     363              : 
     364              :         api->set_vconn_discharge_cb(dev, cb);
     365              : }
     366              : 
     367              : /**
     368              :  * @brief Discharges VCONN
     369              :  *
     370              :  * This function uses the TCPC to discharge VCONN if possible or calls the
     371              :  * callback function set by tcpc_set_vconn_cb
     372              :  *
     373              :  * @param dev     Runtime device structure
     374              :  * @param enable  VCONN discharge is enabled when true, it's disabled
     375              :  *
     376              :  * @retval 0 on success
     377              :  * @retval -EIO on failure
     378              :  * @retval -ENOSYS if not implemented
     379              :  */
     380            1 : static inline int tcpc_vconn_discharge(const struct device *dev, bool enable)
     381              : {
     382              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     383              : 
     384              :         if (api->vconn_discharge == NULL) {
     385              :                 return -ENOSYS;
     386              :         }
     387              : 
     388              :         return api->vconn_discharge(dev, enable);
     389              : }
     390              : 
     391              : /**
     392              :  * @brief Enables or disables VCONN
     393              :  *
     394              :  * This function uses the TCPC to measure VCONN if possible or calls the
     395              :  * callback function set by tcpc_set_vconn_cb
     396              :  *
     397              :  * @param dev     Runtime device structure
     398              :  * @param enable  VCONN is enabled when true, it's disabled
     399              :  *
     400              :  * @retval 0 on success
     401              :  * @retval -EIO on failure
     402              :  * @retval -ENOSYS if not implemented
     403              :  */
     404            1 : static inline int tcpc_set_vconn(const struct device *dev, bool enable)
     405              : {
     406              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     407              : 
     408              :         if (api->set_vconn == NULL) {
     409              :                 return -ENOSYS;
     410              :         }
     411              : 
     412              :         return api->set_vconn(dev, enable);
     413              : }
     414              : 
     415              : /**
     416              :  * @brief Sets the Power and Data Role of the PD message header
     417              :  *
     418              :  * This function only needs to be called once per data / power role change
     419              :  *
     420              :  * @param dev         Runtime device structure
     421              :  * @param power_role  current power role
     422              :  * @param data_role   current data role
     423              :  *
     424              :  * @retval 0 on success
     425              :  * @retval -EIO on failure
     426              :  * @retval -ENOSYS if not implemented
     427              :  */
     428            1 : static inline int tcpc_set_roles(const struct device *dev, enum tc_power_role power_role,
     429              :                                  enum tc_data_role data_role)
     430              : {
     431              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     432              : 
     433              :         if (api->set_roles == NULL) {
     434              :                 return -ENOSYS;
     435              :         }
     436              : 
     437              :         return api->set_roles(dev, power_role, data_role);
     438              : }
     439              : 
     440              : /**
     441              :  * @brief Retrieves the Power Delivery message from the TCPC.
     442              :  * If buf is NULL, then only the status is returned, where 0 means there is a message pending and
     443              :  * -ENODATA means there is no pending message.
     444              :  *
     445              :  * @param dev Runtime device structure
     446              :  * @param buf pointer where the pd_buf pointer is written, NULL if only checking the status
     447              :  *
     448              :  * @retval Greater or equal to 0 is the number of bytes received if buf parameter is provided
     449              :  * @retval 0 if there is a message pending and buf parameter is NULL
     450              :  * @retval -EIO on failure
     451              :  * @retval -ENODATA if no message is pending
     452              :  */
     453            1 : static inline int tcpc_get_rx_pending_msg(const struct device *dev, struct pd_msg *buf)
     454              : {
     455              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     456              : 
     457              :         __ASSERT(api->get_rx_pending_msg != NULL, "Callback pointer should not be NULL");
     458              : 
     459              :         return api->get_rx_pending_msg(dev, buf);
     460              : }
     461              : 
     462              : /**
     463              :  * @brief Enables the reception of SOP* message types
     464              :  *
     465              :  * @param dev     Runtime device structure
     466              :  * @param enable  Enable Power Delivery when true, else it's
     467              :  *                disabled
     468              :  *
     469              :  * @retval 0 on success
     470              :  * @retval -EIO on failure
     471              :  * @retval -ENOSYS if not implemented
     472              :  */
     473            1 : static inline int tcpc_set_rx_enable(const struct device *dev, bool enable)
     474              : {
     475              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     476              : 
     477              :         if (api->set_rx_enable == NULL) {
     478              :                 return -ENOSYS;
     479              :         }
     480              : 
     481              :         return api->set_rx_enable(dev, enable);
     482              : }
     483              : 
     484              : /**
     485              :  * @brief Sets the polarity of the CC lines
     486              :  *
     487              :  * @param dev       Runtime device structure
     488              :  * @param polarity  Polarity of the cc line
     489              :  *
     490              :  * @retval 0 on success
     491              :  * @retval -EIO on failure
     492              :  */
     493            1 : static inline int tcpc_set_cc_polarity(const struct device *dev, enum tc_cc_polarity polarity)
     494              : {
     495              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     496              : 
     497              :         __ASSERT(api->set_cc_polarity != NULL, "Callback pointer should not be NULL");
     498              : 
     499              :         return api->set_cc_polarity(dev, polarity);
     500              : }
     501              : 
     502              : /**
     503              :  * @brief Transmits a Power Delivery message
     504              :  *
     505              :  * @param dev     Runtime device structure
     506              :  * @param msg     Power Delivery message to transmit
     507              :  *
     508              :  * @retval 0 on success
     509              :  * @retval -EIO on failure
     510              :  * @retval -ENOSYS if not implemented
     511              :  */
     512            1 : static inline int tcpc_transmit_data(const struct device *dev, struct pd_msg *msg)
     513              : {
     514              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     515              : 
     516              :         if (api->transmit_data == NULL) {
     517              :                 return -ENOSYS;
     518              :         }
     519              : 
     520              :         return api->transmit_data(dev, msg);
     521              : }
     522              : 
     523              : /**
     524              :  * @brief Dump a set of TCPC registers
     525              :  *
     526              :  * @param dev Runtime device structure
     527              :  *
     528              :  * @retval 0 on success
     529              :  * @retval -EIO on failure
     530              :  * @retval -ENOSYS if not implemented
     531              :  */
     532            1 : static inline int tcpc_dump_std_reg(const struct device *dev)
     533              : {
     534              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     535              : 
     536              :         if (api->dump_std_reg == NULL) {
     537              :                 return -ENOSYS;
     538              :         }
     539              : 
     540              :         return api->dump_std_reg(dev);
     541              : }
     542              : 
     543              : /**
     544              :  * @brief Sets the alert function that's called when an interrupt is triggered
     545              :  *        due to an alert bit
     546              :  *
     547              :  * Calling this function enables the particular alert bit
     548              :  *
     549              :  * @param dev      Runtime device structure
     550              :  * @param handler  The callback function called when the bit is set
     551              :  * @param data     user data passed to the callback
     552              :  *
     553              :  * @retval 0 on success
     554              :  * @retval -EINVAL on failure
     555              :  */
     556            1 : static inline int tcpc_set_alert_handler_cb(const struct device *dev,
     557              :                                             tcpc_alert_handler_cb_t handler, void *data)
     558              : {
     559              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     560              : 
     561              :         __ASSERT(api->set_alert_handler_cb != NULL, "Callback pointer should not be NULL");
     562              : 
     563              :         return api->set_alert_handler_cb(dev, handler, data);
     564              : }
     565              : 
     566              : /**
     567              :  * @brief Gets a status register
     568              :  *
     569              :  * @param dev     Runtime device structure
     570              :  * @param reg     The status register to read
     571              :  * @param status  Pointer where the status is stored
     572              :  *
     573              :  * @retval 0 on success
     574              :  * @retval -EIO on failure
     575              :  * @retval -ENOSYS if not implemented
     576              :  */
     577            1 : static inline int tcpc_get_status_register(const struct device *dev, enum tcpc_status_reg reg,
     578              :                                            uint32_t *status)
     579              : {
     580              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     581              : 
     582              :         if (api->get_status_register == NULL) {
     583              :                 return -ENOSYS;
     584              :         }
     585              : 
     586              :         return api->get_status_register(dev, reg, status);
     587              : }
     588              : 
     589              : /**
     590              :  * @brief Clears a TCPC status register
     591              :  *
     592              :  * @param dev   Runtime device structure
     593              :  * @param reg   The status register to read
     594              :  * @param mask  A bit mask of the status register to clear.
     595              :  *              A status bit is cleared when it's set to 1.
     596              :  *
     597              :  * @retval 0 on success
     598              :  * @retval -EIO on failure
     599              :  * @retval -ENOSYS if not implemented
     600              :  */
     601            1 : static inline int tcpc_clear_status_register(const struct device *dev, enum tcpc_status_reg reg,
     602              :                                              uint32_t mask)
     603              : {
     604              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     605              : 
     606              :         if (api->clear_status_register == NULL) {
     607              :                 return -ENOSYS;
     608              :         }
     609              : 
     610              :         return api->clear_status_register(dev, reg, mask);
     611              : }
     612              : 
     613              : /**
     614              :  * @brief Sets the mask of a TCPC status register
     615              :  *
     616              :  * @param dev   Runtime device structure
     617              :  * @param reg   The status register to read
     618              :  * @param mask  A bit mask of the status register to mask.
     619              :  *              The status bit is masked if it's 0, else it's unmasked.
     620              :  *
     621              :  * @retval 0 on success
     622              :  * @retval -EIO on failure
     623              :  * @retval -ENOSYS if not implemented
     624              :  */
     625            1 : static inline int tcpc_mask_status_register(const struct device *dev, enum tcpc_status_reg reg,
     626              :                                             uint32_t mask)
     627              : {
     628              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     629              : 
     630              :         if (api->mask_status_register == NULL) {
     631              :                 return -ENOSYS;
     632              :         }
     633              : 
     634              :         return api->mask_status_register(dev, reg, mask);
     635              : }
     636              : 
     637              : /**
     638              :  * @brief Manual control of TCPC DebugAccessory control
     639              :  *
     640              :  * @param dev     Runtime device structure
     641              :  * @param enable  Enable Debug Accessory when true, else it's disabled
     642              :  *
     643              :  * @retval 0 on success
     644              :  * @retval -EIO on failure
     645              :  * @retval -ENOSYS if not implemented
     646              :  */
     647            1 : static inline int tcpc_set_debug_accessory(const struct device *dev, bool enable)
     648              : {
     649              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     650              : 
     651              :         if (api->set_debug_accessory == NULL) {
     652              :                 return -ENOSYS;
     653              :         }
     654              : 
     655              :         return api->set_debug_accessory(dev, enable);
     656              : }
     657              : 
     658              : /**
     659              :  * @brief Detach from a debug connection
     660              :  *
     661              :  * @param dev Runtime device structure
     662              :  *
     663              :  * @retval 0 on success
     664              :  * @retval -EIO on failure
     665              :  * @retval -ENOSYS if not implemented
     666              :  */
     667            1 : static inline int tcpc_set_debug_detach(const struct device *dev)
     668              : {
     669              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     670              : 
     671              :         if (api->set_debug_detach == NULL) {
     672              :                 return -ENOSYS;
     673              :         }
     674              : 
     675              :         return api->set_debug_detach(dev);
     676              : }
     677              : 
     678              : /**
     679              :  * @brief Enable TCPC auto dual role toggle
     680              :  *
     681              :  * @param dev     Runtime device structure
     682              :  * @param enable  Auto dual role toggle is active when true, else it's disabled
     683              :  *
     684              :  * @retval 0 on success
     685              :  * @retval -EIO on failure
     686              :  * @retval -ENOSYS if not implemented
     687              :  */
     688            1 : static inline int tcpc_set_drp_toggle(const struct device *dev, bool enable)
     689              : {
     690              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     691              : 
     692              :         if (api->set_drp_toggle == NULL) {
     693              :                 return -ENOSYS;
     694              :         }
     695              : 
     696              :         return api->set_drp_toggle(dev, enable);
     697              : }
     698              : 
     699              : /**
     700              :  * @brief Queries the current sinking state of the TCPC
     701              :  *
     702              :  * @param dev Runtime device structure
     703              :  *
     704              :  * @retval true if sinking power
     705              :  * @retval false if not sinking power
     706              :  * @retval -ENOSYS if not implemented
     707              :  */
     708            1 : static inline int tcpc_get_snk_ctrl(const struct device *dev)
     709              : {
     710              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     711              : 
     712              :         if (api->get_snk_ctrl == NULL) {
     713              :                 return -ENOSYS;
     714              :         }
     715              : 
     716              :         return api->get_snk_ctrl(dev);
     717              : }
     718              : 
     719              : /**
     720              :  * @brief Set the VBUS sinking state of the TCPC
     721              :  *
     722              :  * @param dev Runtime device structure
     723              :  * @param enable True if sinking should be enabled, false if disabled
     724              :  * @retval 0 on success
     725              :  * @retval -ENOSYS if not implemented
     726              :  */
     727            1 : static inline int tcpc_set_snk_ctrl(const struct device *dev, bool enable)
     728              : {
     729              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     730              : 
     731              :         if (api->set_snk_ctrl == NULL) {
     732              :                 return -ENOSYS;
     733              :         }
     734              : 
     735              :         return api->set_snk_ctrl(dev, enable);
     736              : }
     737              : 
     738              : /**
     739              :  * @brief Queries the current sourcing state of the TCPC
     740              :  *
     741              :  * @param dev Runtime device structure
     742              :  *
     743              :  * @retval true if sourcing power
     744              :  * @retval false if not sourcing power
     745              :  * @retval -ENOSYS if not implemented
     746              :  */
     747            1 : static inline int tcpc_get_src_ctrl(const struct device *dev)
     748              : {
     749              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     750              : 
     751              :         if (api->get_src_ctrl == NULL) {
     752              :                 return -ENOSYS;
     753              :         }
     754              : 
     755              :         return api->get_src_ctrl(dev);
     756              : }
     757              : 
     758              : /**
     759              :  * @brief Set the VBUS sourcing state of the TCPC
     760              :  *
     761              :  * @param dev Runtime device structure
     762              :  * @param enable True if sourcing should be enabled, false if disabled
     763              :  * @retval 0 on success
     764              :  * @retval -ENOSYS if not implemented
     765              :  */
     766            1 : static inline int tcpc_set_src_ctrl(const struct device *dev, bool enable)
     767              : {
     768              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     769              : 
     770              :         if (api->set_src_ctrl == NULL) {
     771              :                 return -ENOSYS;
     772              :         }
     773              : 
     774              :         return api->set_src_ctrl(dev, enable);
     775              : }
     776              : 
     777              : /**
     778              :  * @brief Controls the BIST Mode of the TCPC. It disables RX alerts while the
     779              :  *        mode is active.
     780              :  *
     781              :  * @param dev Runtime device structure
     782              :  * @param enable The TCPC enters BIST TEST Mode when true
     783              :  *
     784              :  * @retval 0 on success
     785              :  * @retval -EIO on failure
     786              :  * @retval -ENOSYS if not implemented
     787              :  */
     788            1 : static inline int tcpc_set_bist_test_mode(const struct device *dev, bool enable)
     789              : {
     790              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     791              : 
     792              :         if (api->set_bist_test_mode == NULL) {
     793              :                 return -ENOSYS;
     794              :         }
     795              : 
     796              :         return api->set_bist_test_mode(dev, enable);
     797              : }
     798              : 
     799              : /**
     800              :  * @brief Gets the TCPC firmware version
     801              :  *
     802              :  * @param dev        Runtime device structure
     803              :  * @param chip_info  Pointer to TCPC chip info where the version is stored
     804              :  *
     805              :  * @retval 0 on success
     806              :  * @retval -EIO on failure
     807              :  * @retval -ENOSYS if not implemented
     808              :  */
     809            1 : static inline int tcpc_get_chip_info(const struct device *dev, struct tcpc_chip_info *chip_info)
     810              : {
     811              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     812              : 
     813              :         if (api->get_chip_info == NULL) {
     814              :                 return -ENOSYS;
     815              :         }
     816              : 
     817              :         return api->get_chip_info(dev, chip_info);
     818              : }
     819              : 
     820              : /**
     821              :  * @brief Instructs the TCPC to enter or exit low power mode
     822              :  *
     823              :  * @param dev     Runtime device structure
     824              :  * @param enable  The TCPC enters low power mode when true, else it exits it
     825              :  *
     826              :  * @retval 0 on success
     827              :  * @retval -EIO on failure
     828              :  * @retval -ENOSYS if not implemented
     829              :  */
     830            1 : static inline int tcpc_set_low_power_mode(const struct device *dev, bool enable)
     831              : {
     832              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     833              : 
     834              :         if (api->set_low_power_mode == NULL) {
     835              :                 return -ENOSYS;
     836              :         }
     837              : 
     838              :         return api->set_low_power_mode(dev, enable);
     839              : }
     840              : 
     841              : /**
     842              :  * @brief Enables the reception of SOP Prime and optionally SOP Double Prime messages
     843              :  *
     844              :  * @param dev     Runtime device structure
     845              :  * @param enable  Can receive SOP Prime messages and SOP Double Prime messages when true,
     846              :  *                else it can not
     847              :  *
     848              :  * @retval 0 on success
     849              :  * @retval -EIO on failure
     850              :  * @retval -ENOSYS if not implemented
     851              :  */
     852            1 : static inline int tcpc_sop_prime_enable(const struct device *dev, bool enable)
     853              : {
     854              :         const struct tcpc_driver_api *api = (const struct tcpc_driver_api *)dev->api;
     855              : 
     856              :         if (api->sop_prime_enable == NULL) {
     857              :                 return -ENOSYS;
     858              :         }
     859              : 
     860              :         return api->sop_prime_enable(dev, enable);
     861              : }
     862              : 
     863              : /**
     864              :  * @}
     865              :  */
     866              : 
     867              : #ifdef __cplusplus
     868              : }
     869              : #endif
     870              : 
     871              : #endif /* ZEPHYR_INCLUDE_DRIVERS_USBC_USBC_TCPC_H_ */
        

Generated by: LCOV version 2.0-1