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

#ifndef ZEPHYR_DRIVERS_USBC_DEVICE_UCPD_STM32_PRIV_H_
#define ZEPHYR_DRIVERS_USBC_DEVICE_UCPD_STM32_PRIV_H_

#include <sys/util.h>
#include <drivers/usbc/usbc_tcpc.h>
#include <stm32_ll_ucpd.h>

/**
 * @brief The packet type(SOP*) consists of 2-bytes
 */
#define PACKET_TYPE_SIZE 2

/**
 * @brief The message header consists of 2-bytes
 */
#define MSG_HEADER_SIZE 2

/**
 * @brief USB PD message buffer length.
 */
#define UCPD_BUF_LEN (PD_MAX_EXTENDED_MSG_LEN +	\
		      PACKET_TYPE_SIZE +	\
		      MSG_HEADER_SIZE)

/**
 * @brief UCPD alert mask used for enabling alerts
 *        used to receive a message
 */
#define UCPD_IMR_RX_INT_MASK (UCPD_IMR_RXNEIE |	     \
			      UCPD_IMR_RXORDDETIE |  \
			      UCPD_IMR_RXHRSTDETIE | \
			      UCPD_IMR_RXOVRIE |     \
			      UCPD_IMR_RXMSGENDIE)
/**
 * @brief UCPD alert mask used for clearing alerts
 *        used to receive a message
 */
#define UCPD_ICR_RX_INT_MASK (UCPD_ICR_RXORDDETCF |  \
			      UCPD_ICR_RXHRSTDETCF | \
			      UCPD_ICR_RXOVRCF |     \
			      UCPD_ICR_RXMSGENDCF)

/**
 * @brief UCPD alert mask used for enabling alerts
 *        used to transmit a message
 */
#define UCPD_IMR_TX_INT_MASK (UCPD_IMR_TXISIE |	     \
			      UCPD_IMR_TXMSGDISCIE | \
			      UCPD_IMR_TXMSGSENTIE | \
			      UCPD_IMR_TXMSGABTIE |  \
			      UCPD_IMR_TXUNDIE)

/**
 * @brief UCPD alert mask used for clearing alerts
 *        used to transmit a message
 */
#define UCPD_ICR_TX_INT_MASK (UCPD_ICR_TXMSGDISCCF | \
			      UCPD_ICR_TXMSGSENTCF | \
			      UCPD_ICR_TXMSGABTCF |  \
			      UCPD_ICR_TXUNDCF)

/**
 * @brief UCPD alert mask for all alerts
 */
#define UCPD_ICR_ALL_INT_MASK (UCPD_ICR_FRSEVTCF |    \
			       UCPD_ICR_TYPECEVT2CF | \
			       UCPD_ICR_TYPECEVT1CF | \
			       UCPD_ICR_RXMSGENDCF |  \
			       UCPD_ICR_RXOVRCF |     \
			       UCPD_ICR_RXHRSTDETCF | \
			       UCPD_ICR_RXORDDETCF |  \
			       UCPD_ICR_TXUNDCF |     \
			       UCPD_ICR_HRSTSENTCF |  \
			       UCPD_ICR_HRSTDISCCF |  \
			       UCPD_ICR_TXMSGABTCF |  \
			       UCPD_ICR_TXMSGSENTCF | \
			       UCPD_ICR_TXMSGDISCCF)

/**
 * @brief Map UCPD ANASUB value to TCPC RP value
 *
 * @param r UCPD ANASUB value
 */
#define UCPD_ANASUB_TO_RP(r) ((r - 1) & 0x3)

/**
 * @brief Map TCPC RP value to UCPD ANASUB value
 *
 * @param r TCPC RP value
 */
#define UCPD_RP_TO_ANASUB(r) ((r + 1) & 0x3)

/**
 * @brief Create value for writing to UCPD CR ANASUBMOD
 */
#define STM32_UCPD_CR_ANASUBMODE_VAL(x) ((x) << UCPD_CR_ANASUBMODE_Pos)

/**
 * @brief UCPD VSTATE CCx open value when in source mode
 */
#define STM32_UCPD_SR_VSTATE_OPEN 3

/**
 * @brief UCPD VSTATE CCx RA value when in source mode
 */
#define STM32_UCPD_SR_VSTATE_RA 0

/**
 * @brief PD message send retry count for Rev 2.0
 */
#define UCPD_N_RETRY_COUNT_REV20 3

/**
 * @brief PD message send retry count for Rev 3.0
 */
#define UCPD_N_RETRY_COUNT_REV30 2

/**
 * @brief Events for ucpd_alert_handler
 */
enum {
	/* Request to send a goodCRC message */
	UCPD_EVT_GOOD_CRC_REQ,
	/* Request to send a power delivery message */
	UCPD_EVT_TCPM_MSG_REQ,
	/* Request to send a Hard Reset message */
	UCPD_EVT_HR_REQ,
	/* Transmission of power delivery message failed */
	UCPD_EVT_TX_MSG_FAIL,
	/* Transmission of power delivery message was discarded */
	UCPD_EVT_TX_MSG_DISC,
	/* Transmission of power delivery message was successful */
	UCPD_EVT_TX_MSG_SUCCESS,
	/* Transmission of Hard Reset message was successful */
	UCPD_EVT_HR_DONE,
	/* Transmission of Hard Reset message failed */
	UCPD_EVT_HR_FAIL,
	/* A goodCRC message was received */
	UCPD_EVT_RX_GOOD_CRC,
	/* A power delivery message was received */
	UCPD_EVT_RX_MSG,
	/* A CC event occurred */
	UCPD_EVT_EVENT_CC,
	/* A Hard Reset message was received */
	UCPD_EVT_HARD_RESET_RECEIVED,
};

/**
 * @brief GoodCRC message header roles
 */
struct msg_header_info {
	/* Power Role */
	enum tc_power_role pr;
	/* Data Role */
	enum tc_data_role dr;
};

/**
 * @brief States for managing TX messages
 */
enum ucpd_state {
	/* Idle state */
	STATE_IDLE,
	/* Transmitting a message state */
	STATE_ACTIVE_TCPM,
	/* Transmitting a goodCRC message state */
	STATE_ACTIVE_CRC,
	/* Transmitting a Hard Reset message state */
	STATE_HARD_RESET,
	/* Waiting for a goodCRC message state */
	STATE_WAIT_CRC_ACK
};

/**
 * @brief Tx messages are initiated either by the application or from
 *        the driver when a GoodCRC ack message needs to be sent.
 */
enum ucpd_tx_msg {
	/* Default value for not sending a message */
	TX_MSG_NONE     = -1,
	/* Message initiated from the application */
	TX_MSG_TCPM     = 0,
	/* Message initiated from the driver */
	TX_MSG_GOOD_CRC = 1,
	/* Total number sources that can initiate a message */
	TX_MSG_TOTAL    = 2
};

/**
 * @brief Message from application mask
 */
#define MSG_TCPM_MASK      BIT(TX_MSG_TCPM)

/**
 * @brief Message from driver mask
 */
#define MSG_GOOD_CRC_MASK  BIT(TX_MSG_GOOD_CRC)

/**
 * @brief Buffer for holding the received message
 */
union pd_buffer {
	/* Power Delivery message header */
	uint16_t header;
	/* Power Deliver message data including the message header */
	uint8_t msg[UCPD_BUF_LEN];
};

/**
 * @brief Struct used for transmitting a power delivery message
 */
struct ucpd_tx_desc {
	/* Type of the message */
	enum pd_packet_type type;
	/* Length of the message */
	int msg_len;
	/* Index of the current byte to transmit */
	int msg_index;
	/* Power Delivery message to transmit */
	union pd_buffer data;
};

/**
 * @brief Alert handler information
 */
struct alert_info {
	/* Runtime device structure */
	const struct device *dev;
	/* Application supplied data that's passed to the
	 * application's alert handler callback
	 **/
	void *data;
	/* Application's alert handler callback */
	tcpc_alert_handler_cb_t handler;
	/*
	 * Kernel worker used to call the application's
	 * alert handler callback
	 */
	struct k_work work;
	/* Event flags used in the kernel worker */
	atomic_t evt;
};

/**
 * @brief Driver config
 */
struct tcpc_config {
	/* STM32 UCPD port */
	UCPD_TypeDef *ucpd_port;
	/* STM32 UCPD parameters */
	LL_UCPD_InitTypeDef ucpd_params;
};

/**
 * @brief Driver data
 */
struct tcpc_data {
	/* VBUS callback function */
	tcpc_vbus_cb_t vbus_cb;
	/* Discharge VBUS callback function */
	tcpc_discharge_vbus_cb_t discharge_vbus_cb;
	/* VCONN callback function */
	tcpc_vconn_control_cb_t vconn_cb;
	/* Alert information */
	struct alert_info alert_info;

	/* CC Rp value */
	enum tc_rp_value rp;

	/* PD Rx variables */

	/* Number of RX bytes received */
	int ucpd_rx_byte_count;
	/* Buffer to hold the received bytes */
	uint8_t ucpd_rx_buffer[UCPD_BUF_LEN];
	/* GoodCRC message ID */
	int ucpd_crc_id;
	/* Flag to receive or ignore SOP Prime messages */
	bool ucpd_rx_sop_prime_enabled;
	/* Flag set to true when receiving a message */
	bool ucpd_rx_msg_active;
	/* Flag set to true when in RX BIST Mode */
	bool ucpd_rx_bist_mode;

	/* Tx message variables */

	/* Buffers to hold messages ready for transmission */
	struct ucpd_tx_desc ucpd_tx_buffers[TX_MSG_TOTAL];
	/* Current buffer being transmitted */
	struct ucpd_tx_desc *ucpd_tx_active_buffer;
	/* Request to send a transmission message */
	int ucpd_tx_request;
	/* State of the TX state machine */
	enum ucpd_state ucpd_tx_state;
	/* Transmission message ID */
	int msg_id_match;
	/* Retry count on failure to transmit a message */
	int tx_retry_count;
	/* Max number of reties before giving up */
	int tx_retry_max;

	/* GoodCRC message Header */
	struct msg_header_info msg_header;
	/* Track VCONN on/off state */
	bool ucpd_vconn_enable;
};

#endif /* ZEPHYR_DRIVERS_USBC_DEVICE_UCPD_STM32_PRIV_H_ */
