LCOV - code coverage report
Current view: top level - zephyr/drivers/usb_c - usbc_tcpc.h Hit Total Coverage
Test: new.info Lines: 47 83 56.6 %
Date: 2024-12-22 00:14:23

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

Generated by: LCOV version 1.14