Microchip: MEC172x: eSPI driver

MEC172x eSPI driver, eSPI pin programming, interrupt updates related
to eSPI and other updates for MEC172x eSPI driver.

Signed-off-by: Jay Vasanth <jay.vasanth@microchip.com>
This commit is contained in:
Jay Vasanth 2021-10-18 16:44:45 -04:00 committed by Christopher Friedt
commit c214c59548
24 changed files with 3291 additions and 79 deletions

View file

@ -19,6 +19,7 @@
#include <sys/__assert.h>
#include <drivers/clock_control/mchp_xec_clock_control.h>
#include <drivers/interrupt_controller/intc_mchp_xec_ecia.h>
#include <dt-bindings/interrupt-controller/mchp-xec-ecia.h>
/* defined at the SoC layer */
#define MCHP_FIRST_GIRQ MCHP_FIRST_GIRQ_NOS
@ -186,6 +187,58 @@ void mchp_xec_ecia_nvic_clr_pend(uint32_t nvic_num)
NVIC_ClearPendingIRQ(nvic_num);
}
/* API taking input encoded with MCHP_XEC_ECIA(g, gb, na, nd) macro */
void mchp_xec_ecia_info_girq_aggr_en(int ecia_info, uint8_t enable)
{
uint8_t girq_num = MCHP_XEC_ECIA_GIRQ(ecia_info);
mchp_xec_ecia_girq_aggr_en(girq_num, enable);
}
void mchp_xec_ecia_info_girq_src_clr(int ecia_info)
{
uint8_t girq_num = MCHP_XEC_ECIA_GIRQ(ecia_info);
uint8_t bitpos = MCHP_XEC_ECIA_GIRQ_POS(ecia_info);
mchp_xec_ecia_girq_src_clr(girq_num, bitpos);
}
void mchp_xec_ecia_info_girq_src_en(int ecia_info)
{
uint8_t girq_num = MCHP_XEC_ECIA_GIRQ(ecia_info);
uint8_t bitpos = MCHP_XEC_ECIA_GIRQ_POS(ecia_info);
mchp_xec_ecia_girq_src_en(girq_num, bitpos);
}
void mchp_xec_ecia_info_girq_src_dis(int ecia_info)
{
uint8_t girq_num = MCHP_XEC_ECIA_GIRQ(ecia_info);
uint8_t bitpos = MCHP_XEC_ECIA_GIRQ_POS(ecia_info);
mchp_xec_ecia_girq_src_dis(girq_num, bitpos);
}
uint32_t mchp_xec_ecia_info_girq_result(int ecia_info)
{
uint8_t girq_num = MCHP_XEC_ECIA_GIRQ(ecia_info);
return mchp_xec_ecia_girq_result(girq_num);
}
/*
* Clear NVIC pending status given GIRQ source information encoded by macro
* MCHP_XEC_ECIA. For aggregated only sources the ecoding sets direct NVIC
* number equal to aggregated NVIC number.
*/
void mchp_xec_ecia_info_nvic_clr_pend(int ecia_info)
{
uint8_t nvic_num = MCHP_XEC_ECIA_NVIC_DIRECT(ecia_info);
mchp_xec_ecia_nvic_clr_pend(nvic_num);
}
/**
* @brief enable GIRQn interrupt for specific source
*
@ -207,6 +260,20 @@ int mchp_xec_ecia_enable(int girq, int src)
return 0;
}
/**
* @brief enable EXTI interrupt for specific line specified by parameter
* encoded with MCHP_XEC_ECIA macro.
*
* @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
*/
int mchp_xec_ecia_info_enable(int ecia_info)
{
uint8_t girq = (uint8_t)MCHP_XEC_ECIA_GIRQ(ecia_info);
uint8_t src = (uint8_t)MCHP_XEC_ECIA_GIRQ_POS(ecia_info);
return mchp_xec_ecia_enable(girq, src);
}
/**
* @brief disable EXTI interrupt for specific line
*
@ -228,6 +295,20 @@ int mchp_xec_ecia_disable(int girq, int src)
return 0;
}
/**
* @brief disable EXTI interrupt for specific line specified by parameter
* encoded with MCHP_XEC_ECIA macro.
*
* @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
*/
int mchp_xec_ecia_info_disable(int ecia_info)
{
uint8_t girq = (uint8_t)MCHP_XEC_ECIA_GIRQ(ecia_info);
uint8_t src = (uint8_t)MCHP_XEC_ECIA_GIRQ_POS(ecia_info);
return mchp_xec_ecia_disable(girq, src);
}
/* forward reference */
static const struct device *get_girq_dev(int girq_num);
@ -279,6 +360,22 @@ int mchp_xec_ecia_set_callback(int girq_num, int src,
return mchp_xec_ecia_set_callback_by_dev(dev, src, cb, data);
}
/**
* @brief set GIRQn interrupt source callback
*
* @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
* @param cb user callback
* @param data user data
*/
int mchp_xec_ecia_info_set_callback(int ecia_info, mchp_xec_ecia_callback_t cb,
void *data)
{
const struct device *dev = get_girq_dev(MCHP_XEC_ECIA_GIRQ(ecia_info));
uint8_t src = MCHP_XEC_ECIA_GIRQ_POS(ecia_info);
return mchp_xec_ecia_set_callback_by_dev(dev, src, cb, data);
}
/**
* @brief unset GIRQn interrupt source callback by device handle
*
@ -321,6 +418,20 @@ int mchp_ecia_unset_callback(int girq_num, int src)
return mchp_ecia_unset_callback_by_dev(dev, src);
}
/**
* @brief unset GIRQn interrupt source callback
*
* @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
*/
int mchp_ecia_info_unset_callback(int ecia_info)
{
const struct device *dev = get_girq_dev(MCHP_XEC_ECIA_GIRQ(ecia_info));
uint8_t src = MCHP_XEC_ECIA_GIRQ_POS(ecia_info);
return mchp_ecia_unset_callback_by_dev(dev, src);
}
/*
* Create a build time flag to know if any aggregated GIRQ has been enabled.
* We make use of DT FOREACH macro to check GIRQ node status.