diff --git a/drivers/espi/Kconfig b/drivers/espi/Kconfig index 955caad3395..ff9cc4146ed 100644 --- a/drivers/espi/Kconfig +++ b/drivers/espi/Kconfig @@ -40,6 +40,19 @@ config ESPI_VWIRE_CHANNEL help eSPI Controller supports virtual wires channel. +if ESPI_VWIRE_CHANNEL + +config ESPI_AUTOMATIC_WARNING_ACKNOWLEDGE + bool "Automatic acknowledge for eSPI HOST warnings" + default y + help + Enable automatic acknowledge from eSPI slave towards eSPI host + whenever it receives suspend or reset warning. + If this is disabled, it means the app wants to be give the opportunity + to prepare for either HOST suspend or reset. + +endif # ESPI_VWIRE_CHANNEL + config ESPI_OOB_CHANNEL bool "eSPI Out-of-band channel" help diff --git a/drivers/espi/espi_mchp_xec.c b/drivers/espi/espi_mchp_xec.c index 7fa7a0f092b..7ff40f0542b 100644 --- a/drivers/espi/espi_mchp_xec.c +++ b/drivers/espi/espi_mchp_xec.c @@ -789,18 +789,43 @@ static void vw_host_rst_warn_isr(struct device *dev) { u8_t status; +#ifndef CONFIG_ESPI_AUTOMATIC_WARNING_ACKNOWLEDGE + struct espi_xec_data *data = (struct espi_xec_data *)(dev->driver_data); + struct espi_event evt = { ESPI_BUS_EVENT_VWIRE_RECEIVED, 0, 0 }; +#endif + espi_xec_receive_vwire(dev, ESPI_VWIRE_SIGNAL_HOST_RST_WARN, &status); + +#ifndef CONFIG_ESPI_AUTOMATIC_WARNING_ACKNOWLEDGE + evt.evt_details = ESPI_VWIRE_SIGNAL_HOST_RST_WARN; + evt.evt_details = ESPI_BUS_EVENT_VWIRE_RECEIVED; + espi_send_callbacks(&data->callbacks, dev, evt); +#else + k_busy_wait(ESPI_XEC_VWIRE_ACK_DELAY); espi_xec_send_vwire(dev, ESPI_VWIRE_SIGNAL_HOST_RST_ACK, status); +#endif } static void vw_sus_warn_isr(struct device *dev) { u8_t status; +#ifndef CONFIG_ESPI_AUTOMATIC_WARNING_ACKNOWLEDGE + struct espi_xec_data *data = (struct espi_xec_data *)(dev->driver_data); + struct espi_event evt = { ESPI_BUS_EVENT_VWIRE_RECEIVED, 0, 0 }; +#endif + espi_xec_receive_vwire(dev, ESPI_VWIRE_SIGNAL_SUS_WARN, &status); + +#ifndef CONFIG_ESPI_AUTOMATIC_WARNING_ACKNOWLEDGE + evt.evt_details = ESPI_BUS_EVENT_VWIRE_RECEIVED; + evt.evt_data = status; + espi_send_callbacks(&data->callbacks, dev, evt); +#else k_busy_wait(ESPI_XEC_VWIRE_ACK_DELAY); espi_xec_send_vwire(dev, ESPI_VWIRE_SIGNAL_SUS_ACK, status); +#endif } static void ibf_isr(struct device *dev)