/*
 * Copyright (c) 2020 Google LLC.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Public APIs for Host Command Peripherals that respond to host commands
 */

#ifndef ZEPHYR_INCLUDE_DRIVERS_HOST_CMD_PERIPH_H_
#define ZEPHYR_INCLUDE_DRIVERS_HOST_CMD_PERIPH_H_

#include <sys/__assert.h>
#include <zephyr/types.h>
#include <device.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Host Command Peripherals API
 * @defgroup ec_host_cmd_periph Host Command Peripherals API
 * @ingroup io_interfaces
 * @{
 */

/**
 * @brief Context for host command peripheral and framework to pass rx data
 */
struct ec_host_cmd_periph_rx_ctx {
	/** Buffer written to by device (when dev_owns) and read from by
	 *  command framework and handler (when handler_owns). Buffer is owned
	 *  by devices and lives as long as device is valid. Device will never
	 *  read from this buffer (for security reasons).
	 */
	uint8_t *buf;
	/** Number of bytes written to @a buf by device (when dev_owns). */
	size_t *len;
	/** Device will take when it needs to write to @a buf and @a size. */
	struct k_sem *dev_owns;
	/** Handler will take so it can read @a buf and @a size */
	struct k_sem *handler_owns;
};

/**
 * @brief Context for host command peripheral and framework to pass tx data
 */
struct ec_host_cmd_periph_tx_buf {
	/** Data to write to the host */
	void *buf;
	/** Number of bytes to write from @a buf */
	size_t len;
};

typedef int (*ec_host_cmd_periph_api_init)(
	const struct device *dev, struct ec_host_cmd_periph_rx_ctx *rx_ctx);

typedef int (*ec_host_cmd_periph_api_send)(
	const struct device *dev,
	const struct ec_host_cmd_periph_tx_buf *tx_buf);

__subsystem struct ec_host_cmd_periph_api {
	ec_host_cmd_periph_api_init init;
	ec_host_cmd_periph_api_send send;
};

/**
 * @brief Initialize a host command device
 *
 * This routine initializes a host command device, prior to its first use. The
 * receive context object are an output of this function and are valid
 * for the lifetime of this device. The RX context is used by the client to
 * receive data from the host.
 *
 * @param dev Pointer to the device structure for the driver instance.
 * @param rx_ctx [out] The receiving context object that are valid for the
 *               lifetime of the device. These objects are used to receive data
 *               from the driver when the host send data.
 *
 * @retval 0 if successful
 */
__syscall int ec_host_cmd_periph_init(const struct device *dev,
				      struct ec_host_cmd_periph_rx_ctx *rx_ctx);

static inline int
z_impl_ec_host_cmd_periph_init(const struct device *dev,
			       struct ec_host_cmd_periph_rx_ctx *rx_ctx)
{
	const struct ec_host_cmd_periph_api *api =
		(const struct ec_host_cmd_periph_api *)dev->api;

	return api->init(dev, rx_ctx);
}

/**
 * @brief Sends the specified data to the host
 *
 * Sends the data specified in @a tx_buf to the host over the host communication
 * bus.
 *
 * @param dev Pointer to the device structure for the driver instance.
 * @param tx_buf The data to transmit to the host.
 *
 * @retval 0 if successful
 */
__syscall int ec_host_cmd_periph_send(
	const struct device *dev,
	const struct ec_host_cmd_periph_tx_buf *tx_buf);

static inline int z_impl_ec_host_cmd_periph_send(
	const struct device *dev,
	const struct ec_host_cmd_periph_tx_buf *tx_buf)
{
	const struct ec_host_cmd_periph_api *api =
		(const struct ec_host_cmd_periph_api *)dev->api;

	return api->send(dev, tx_buf);
}

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#include <syscalls/ec_host_cmd_periph.h>

#endif /* ZEPHYR_INCLUDE_DRIVERS_HOST_CMD_PERIPH_H_ */
