/*
 * Copyright (c) 2021 Microchip Technology Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef ZEPHYR_DRIVERS_ESPI_MCHP_XEC_ESPI_V2_H_
#define ZEPHYR_DRIVERS_ESPI_MCHP_XEC_ESPI_V2_H_

#include <stdint.h>
#include <device.h>
#include <drivers/espi.h>

#define ESPI_XEC_V2_DEBUG	1

struct espi_isr {
	uint8_t girq_id;
	uint8_t girq_pos;
	void (*the_isr)(const struct device *dev);
};

struct espi_vw_isr {
	uint8_t signal;
	uint8_t girq_id;
	uint8_t girq_pos;
	void (*the_isr)(int girq, int bpos, void *dev);
};

struct espi_xec_irq_info {
	uint8_t gid;	/* GIRQ id [8, 26] */
	uint8_t gpos;	/* bit position in GIRQ [0, 31] */
	uint8_t anid;	/* Aggregated GIRQ NVIC number */
	uint8_t dnid;	/* Direct GIRQ NVIC number */
};

struct espi_xec_config {
	uint32_t base_addr;
	uint32_t vw_base_addr;
	uint8_t pcr_idx;
	uint8_t pcr_bitpos;
	const struct espi_xec_irq_info *irq_info_list;
	uint8_t irq_info_size;
};

#define ESPI_XEC_CONFIG(dev)						\
	((struct espi_xec_config * const)(dev)->config)

struct espi_xec_data {
	sys_slist_t callbacks;
	struct k_sem tx_lock;
	struct k_sem rx_lock;
	struct k_sem flash_lock;
	uint8_t plt_rst_asserted;
	uint8_t espi_rst_asserted;
	uint8_t sx_state;
#ifdef ESPI_XEC_V2_DEBUG
	uint32_t espi_rst_count;
#endif
};

#define ESPI_XEC_DATA(dev)						\
	((struct espi_xec_data * const)(dev)->data)

struct xec_signal {
	uint8_t xec_reg_idx;
	uint8_t bit;
	uint8_t dir;
};

enum mchp_msvw_regs {
	MCHP_MSVW00,
	MCHP_MSVW01,
	MCHP_MSVW02,
	MCHP_MSVW03,
	MCHP_MSVW04,
	MCHP_MSVW05,
	MCHP_MSVW06,
	MCHP_MSVW07,
	MCHP_MSVW08,
};

enum mchp_smvw_regs {
	MCHP_SMVW00,
	MCHP_SMVW01,
	MCHP_SMVW02,
	MCHP_SMVW03,
	MCHP_SMVW04,
	MCHP_SMVW05,
	MCHP_SMVW06,
	MCHP_SMVW07,
	MCHP_SMVW08,
};

enum xec_espi_girq_idx {
	pc_girq_idx = 0,
	bm1_girq_idx,
	bm2_girq_idx,
	ltr_girq_idx,
	oob_up_girq_idx,
	oob_dn_girq_idx,
	fc_girq_idx,
	rst_girq_idx,
	vw_ch_en_girq_idx,
	max_girq_idx,
};


int xec_host_dev_init(const struct device *dev);
int xec_host_dev_connect_irqs(const struct device *dev);

int espi_xec_read_lpc_request(const struct device *dev,
			      enum lpc_peripheral_opcode op,
			      uint32_t  *data);

int espi_xec_write_lpc_request(const struct device *dev,
			       enum lpc_peripheral_opcode op,
			       uint32_t *data);

#endif /* ZEPHYR_DRIVERS_ESPI_MCHP_XEC_ESPI_V2_H_ */
