LCOV - code coverage report
Current view: top level - zephyr/drivers/usb_c - usbc_ppc.h Hit Total Coverage
Test: new.info Lines: 13 24 54.2 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           1 : /*
       2             :  * Copyright 2023 Google LLC
       3             :  * SPDX-License-Identifier: Apache-2.0
       4             :  */
       5             : 
       6             : /**
       7             :  * @file
       8             :  * @brief USB Type-C Power Path Controller device API
       9             :  *
      10             :  */
      11             : 
      12             : #ifndef ZEPHYR_INCLUDE_DRIVERS_USBC_USBC_PPC_H_
      13             : #define ZEPHYR_INCLUDE_DRIVERS_USBC_USBC_PPC_H_
      14             : 
      15             : #include <zephyr/types.h>
      16             : #include <zephyr/device.h>
      17             : #include <errno.h>
      18             : 
      19             : #ifdef __cplusplus
      20             : extern "C" {
      21             : #endif
      22             : 
      23             : /** Type of event being notified by Power Path Controller */
      24           1 : enum usbc_ppc_event {
      25             :         /** Exit from dead-battery mode failed */
      26             :         USBC_PPC_EVENT_DEAD_BATTERY_ERROR = 0,
      27             : 
      28             :         /** Overvoltage detected while being in a source role */
      29             :         USBC_PPC_EVENT_SRC_OVERVOLTAGE,
      30             :         /** Reverse current detected while being in a source role */
      31             :         USBC_PPC_EVENT_SRC_REVERSE_CURRENT,
      32             :         /** Overcurrent detected while being in a source role */
      33             :         USBC_PPC_EVENT_SRC_OVERCURRENT,
      34             :         /** VBUS short detected while being in a source role */
      35             :         USBC_PPC_EVENT_SRC_SHORT,
      36             : 
      37             :         /** Chip over temperature detected  */
      38             :         USBC_PPC_EVENT_OVER_TEMPERATURE,
      39             :         /** Sink and source paths enabled simultaneously */
      40             :         USBC_PPC_EVENT_BOTH_SNKSRC_ENABLED,
      41             : 
      42             :         /** Reverse current detected while being in a sink role */
      43             :         USBC_PPC_EVENT_SNK_REVERSE_CURRENT,
      44             :         /** VBUS short detected while being in a sink role */
      45             :         USBC_PPC_EVENT_SNK_SHORT,
      46             :         /** Overvoltage detected while being in a sink role */
      47             :         USBC_PPC_EVENT_SNK_OVERVOLTAGE,
      48             : };
      49             : 
      50           0 : typedef void (*usbc_ppc_event_cb_t)(const struct device *dev, void *data, enum usbc_ppc_event ev);
      51             : 
      52             : /** Structure with pointers to the functions implemented by driver */
      53           1 : __subsystem struct usbc_ppc_driver_api {
      54           0 :         int (*is_dead_battery_mode)(const struct device *dev);
      55           0 :         int (*exit_dead_battery_mode)(const struct device *dev);
      56           0 :         int (*is_vbus_source)(const struct device *dev);
      57           0 :         int (*is_vbus_sink)(const struct device *dev);
      58           0 :         int (*set_snk_ctrl)(const struct device *dev, bool enable);
      59           0 :         int (*set_src_ctrl)(const struct device *dev, bool enable);
      60           0 :         int (*set_vbus_discharge)(const struct device *dev, bool enable);
      61           0 :         int (*is_vbus_present)(const struct device *dev);
      62           0 :         int (*set_event_handler)(const struct device *dev, usbc_ppc_event_cb_t handler, void *data);
      63           0 :         int (*dump_regs)(const struct device *dev);
      64             : };
      65             : 
      66             : /*
      67             :  * API functions
      68             :  */
      69             : 
      70             : /**
      71             :  * @brief Check if PPC is in the dead battery mode
      72             :  *
      73             :  * @param dev PPC device structure
      74             :  * @retval 1 if PPC is in the dead battery mode
      75             :  * @retval 0 if PPC is not in the dead battery mode
      76             :  * @retval -EIO if I2C communication failed
      77             :  * @retval -ENOSYS if this function is not supported by the driver
      78             :  */
      79           1 : static inline int ppc_is_dead_battery_mode(const struct device *dev)
      80             : {
      81             :         const struct usbc_ppc_driver_api *api = (const struct usbc_ppc_driver_api *)dev->api;
      82             : 
      83             :         if (api->is_dead_battery_mode == NULL) {
      84             :                 return -ENOSYS;
      85             :         }
      86             : 
      87             :         return api->is_dead_battery_mode(dev);
      88             : }
      89             : 
      90             : /**
      91             :  * @brief Request the PPC to exit from the dead battery mode
      92             :  * Return from this call doesn't mean that the PPC is not in the dead battery anymore.
      93             :  * In the case of error, the driver should execute the callback with
      94             :  * USBC_PPC_EVENT_DEAD_BATTERY_ERROR enum. To check if the PPC disabled the dead battery mode,
      95             :  * the call to ppc_is_dead_battery_mode should be done.
      96             :  *
      97             :  * @param dev PPC device structure
      98             :  * @retval 0 if request was successfully sent
      99             :  * @retval -EIO if I2C communication failed
     100             :  * @retval -ENOSYS if this function is not supported by the driver
     101             :  */
     102           1 : static inline int ppc_exit_dead_battery_mode(const struct device *dev)
     103             : {
     104             :         const struct usbc_ppc_driver_api *api = (const struct usbc_ppc_driver_api *)dev->api;
     105             : 
     106             :         if (api->exit_dead_battery_mode == NULL) {
     107             :                 return -ENOSYS;
     108             :         }
     109             : 
     110             :         return api->exit_dead_battery_mode(dev);
     111             : }
     112             : 
     113             : /**
     114             :  * @brief Check if the PPC is sourcing the VBUS
     115             :  *
     116             :  * @param dev PPC device structure
     117             :  * @retval 1 if the PPC is sourcing the VBUS
     118             :  * @retval 0 if the PPC is not sourcing the VBUS
     119             :  * @retval -EIO if I2C communication failed
     120             :  * @retval -ENOSYS if this function is not supported by the driver
     121             :  */
     122           1 : static inline int ppc_is_vbus_source(const struct device *dev)
     123             : {
     124             :         const struct usbc_ppc_driver_api *api = (const struct usbc_ppc_driver_api *)dev->api;
     125             : 
     126             :         if (api->is_vbus_source == NULL) {
     127             :                 return -ENOSYS;
     128             :         }
     129             : 
     130             :         return api->is_vbus_source(dev);
     131             : }
     132             : 
     133             : /**
     134             :  * @brief Check if the PPC is sinking the VBUS
     135             :  *
     136             :  * @param dev PPC device structure
     137             :  * @retval 1 if the PPC is sinking the VBUS
     138             :  * @retval 0 if the PPC is not sinking the VBUS
     139             :  * @retval -EIO if I2C communication failed
     140             :  * @retval -ENOSYS if this function is not supported by the driver
     141             :  */
     142           1 : static inline int ppc_is_vbus_sink(const struct device *dev)
     143             : {
     144             :         const struct usbc_ppc_driver_api *api = (const struct usbc_ppc_driver_api *)dev->api;
     145             : 
     146             :         if (api->is_vbus_sink == NULL) {
     147             :                 return -ENOSYS;
     148             :         }
     149             : 
     150             :         return api->is_vbus_sink(dev);
     151             : }
     152             : 
     153             : /**
     154             :  * @brief Set the state of VBUS sinking
     155             :  *
     156             :  * @param dev PPC device structure
     157             :  * @param enable True if sinking VBUS should be enabled, false if should be disabled
     158             :  * @retval 0 if success
     159             :  * @retval -EIO if I2C communication failed
     160             :  * @retval -ENOSYS if this function is not supported by the driver
     161             :  */
     162           1 : static inline int ppc_set_snk_ctrl(const struct device *dev, bool enable)
     163             : {
     164             :         const struct usbc_ppc_driver_api *api = (const struct usbc_ppc_driver_api *)dev->api;
     165             : 
     166             :         if (api->set_snk_ctrl == NULL) {
     167             :                 return -ENOSYS;
     168             :         }
     169             : 
     170             :         return api->set_snk_ctrl(dev, enable);
     171             : }
     172             : 
     173             : /**
     174             :  * @brief Set the state of VBUS sourcing
     175             :  *
     176             :  * @param dev PPC device structure
     177             :  * @param enable True if sourcing VBUS should be enabled, false if should be disabled
     178             :  * @retval 0 if success
     179             :  * @retval -EIO if I2C communication failed
     180             :  * @retval -ENOSYS if this function is not supported by the driver
     181             :  */
     182           1 : static inline int ppc_set_src_ctrl(const struct device *dev, bool enable)
     183             : {
     184             :         const struct usbc_ppc_driver_api *api = (const struct usbc_ppc_driver_api *)dev->api;
     185             : 
     186             :         if (api->set_src_ctrl == NULL) {
     187             :                 return -ENOSYS;
     188             :         }
     189             : 
     190             :         return api->set_src_ctrl(dev, enable);
     191             : }
     192             : 
     193             : /**
     194             :  * @brief Set the state of VBUS discharging
     195             :  *
     196             :  * @param dev PPC device structure
     197             :  * @param enable True if VBUS discharging should be enabled, false if should be disabled
     198             :  * @retval 0 if success
     199             :  * @retval -EIO if I2C communication failed
     200             :  * @retval -ENOSYS if this function is not supported by the driver
     201             :  */
     202           1 : static inline int ppc_set_vbus_discharge(const struct device *dev, bool enable)
     203             : {
     204             :         const struct usbc_ppc_driver_api *api = (const struct usbc_ppc_driver_api *)dev->api;
     205             : 
     206             :         if (api->set_vbus_discharge == NULL) {
     207             :                 return -ENOSYS;
     208             :         }
     209             : 
     210             :         return api->set_vbus_discharge(dev, enable);
     211             : }
     212             : 
     213             : /**
     214             :  * @brief Check if VBUS is present
     215             :  *
     216             :  * @param dev PPC device structure
     217             :  * @retval 1 if VBUS voltage is present
     218             :  * @retval 0 if no VBUS voltage is detected
     219             :  * @retval -EIO if I2C communication failed
     220             :  * @retval -ENOSYS if this function is not supported by the driver
     221             :  */
     222           1 : static inline int ppc_is_vbus_present(const struct device *dev)
     223             : {
     224             :         const struct usbc_ppc_driver_api *api = (const struct usbc_ppc_driver_api *)dev->api;
     225             : 
     226             :         if (api->is_vbus_present == NULL) {
     227             :                 return -ENOSYS;
     228             :         }
     229             : 
     230             :         return api->is_vbus_present(dev);
     231             : }
     232             : 
     233             : /**
     234             :  * @brief Set the callback used to notify about PPC events
     235             :  *
     236             :  * @param dev PPC device structure
     237             :  * @param handler Handler that will be called with events notifications
     238             :  * @param data Pointer used as an argument to the callback
     239             :  * @retval 0 if success
     240             :  * @retval -ENOSYS if this function is not supported by the driver
     241             :  */
     242           1 : static inline int ppc_set_event_handler(const struct device *dev,
     243             :         usbc_ppc_event_cb_t handler, void *data)
     244             : {
     245             :         const struct usbc_ppc_driver_api *api = (const struct usbc_ppc_driver_api *)dev->api;
     246             : 
     247             :         if (api->set_event_handler == NULL) {
     248             :                 return -ENOSYS;
     249             :         }
     250             : 
     251             :         return api->set_event_handler(dev, handler, data);
     252             : }
     253             : 
     254             : /**
     255             :  * @brief Print the values or PPC registers
     256             :  *
     257             :  * @param dev PPC device structure
     258             :  * @retval 0 if success
     259             :  * @retval -EIO if I2C communication failed
     260             :  * @retval -ENOSYS if this function is not supported by the driver
     261             :  */
     262           1 : static inline int ppc_dump_regs(const struct device *dev)
     263             : {
     264             :         const struct usbc_ppc_driver_api *api = (const struct usbc_ppc_driver_api *)dev->api;
     265             : 
     266             :         if (api->dump_regs == NULL) {
     267             :                 return -ENOSYS;
     268             :         }
     269             : 
     270             :         return api->dump_regs(dev);
     271             : }
     272             : 
     273             : #ifdef __cplusplus
     274             : }
     275             : #endif
     276             : 
     277             : #endif /* ZEPHYR_INCLUDE_DRIVERS_USBC_USBC_PPC_H_ */

Generated by: LCOV version 1.14