/*
 * Copyright 2022 The Chromium OS Authors
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief USB-C VBUS device APIs
 *
 * This file contains the USB-C VBUS device APIs.
 * All USB-C VBUS measurment and control device drivers should
 * implement the APIs described in this file.
 */

#ifndef ZEPHYR_INCLUDE_DRIVERS_USBC_VBUS_H_
#define ZEPHYR_INCLUDE_DRIVERS_USBC_VBUS_H_

/**
 * @brief USB-C VBUS API
 * @defgroup usbc_vbus_api USB-C VBUS API
 * @since 3.3
 * @version 0.1.0
 * @ingroup io_interfaces
 * @{
 */

#include <zephyr/types.h>
#include <zephyr/device.h>
#include <zephyr/drivers/usb_c/usbc_tc.h>

#ifdef __cplusplus
extern "C" {
#endif

struct usbc_vbus_driver_api {
	bool (*check_level)(const struct device *dev, enum tc_vbus_level level);
	int (*measure)(const struct device *dev, int *vbus_meas);
	int (*discharge)(const struct device *dev, bool enable);
	int (*enable)(const struct device *dev, bool enable);
};

/**
 * @brief Checks if VBUS is at a particular level
 *
 * @param dev    Runtime device structure
 * @param level  The level voltage to check against
 *
 * @retval true if VBUS is at the level voltage
 * @retval false if VBUS is not at that level voltage
 */
static inline bool usbc_vbus_check_level(const struct device *dev, enum tc_vbus_level level)
{
	const struct usbc_vbus_driver_api *api = (const struct usbc_vbus_driver_api *)dev->api;

	return api->check_level(dev, level);
}

/**
 * @brief Reads and returns VBUS measured in mV
 *
 * @param dev        Runtime device structure
 * @param meas       pointer where the measured VBUS voltage is stored
 *
 * @retval 0 on success
 * @retval -EIO on failure
 */
static inline int usbc_vbus_measure(const struct device *dev, int *meas)
{
	const struct usbc_vbus_driver_api *api = (const struct usbc_vbus_driver_api *)dev->api;

	return api->measure(dev, meas);
}

/**
 * @brief Controls a pin that discharges VBUS
 *
 * @param dev        Runtime device structure
 * @param enable     Discharge VBUS when true
 *
 * @retval 0 on success
 * @retval -EIO on failure
 * @retval -ENOENT if discharge pin isn't defined
 */
static inline int usbc_vbus_discharge(const struct device *dev, bool enable)
{
	const struct usbc_vbus_driver_api *api = (const struct usbc_vbus_driver_api *)dev->api;

	return api->discharge(dev, enable);
}

/**
 * @brief Controls a pin that enables VBUS measurments
 *
 * @param dev     Runtime device structure
 * @param enable  enable VBUS measurments when true
 *
 * @retval 0 on success
 * @retval -EIO on failure
 * @retval -ENOENT if enable pin isn't defined
 */
static inline int usbc_vbus_enable(const struct device *dev, bool enable)
{
	const struct usbc_vbus_driver_api *api = (const struct usbc_vbus_driver_api *)dev->api;

	return api->enable(dev, enable);
}

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* ZEPHYR_INCLUDE_DRIVERS_USBC_VBUS_H_ */
