samples: drivers: espi: Remove delay from eSPI handshake
Make sure eSPI handshake is performed with eSPI master once eSPI master power is up Signed-off-by: Jose Alberto Meza <jose.a.meza.arellano@intel.com>
This commit is contained in:
parent
7e29c9da0b
commit
953952adbd
4 changed files with 102 additions and 20 deletions
|
@ -26,18 +26,30 @@ config ESPI_GPIO_DEV_NEEDED
|
|||
|
||||
if ESPI_GPIO_DEV_NEEDED
|
||||
|
||||
config ESPI_GPIO_DEV
|
||||
string "Name of the GPIO port"
|
||||
config ESPI_GPIO_DEV0
|
||||
string "Name of the GPIO port 0"
|
||||
default "GPIO_0"
|
||||
help
|
||||
Name of the port used in mimimal handshake
|
||||
|
||||
config ESPI_GPIO_DEV1
|
||||
string "Name of the GPIO port 1"
|
||||
default "GPIO_1"
|
||||
help
|
||||
Name of the port used in mimimal handshake
|
||||
|
||||
config ESPI_INIT_PIN
|
||||
int "eSPI master enable pin"
|
||||
default 0
|
||||
help
|
||||
Pin number of eSPI master init pin
|
||||
|
||||
config PWRGD_PIN
|
||||
int "Indication espi master power is up"
|
||||
default 0
|
||||
help
|
||||
Pin number of eSPI master power indication
|
||||
|
||||
endif # ESPI_GPIO_DEV_NEEDED
|
||||
|
||||
source "Kconfig.zephyr"
|
||||
|
|
|
@ -2,6 +2,13 @@
|
|||
CONFIG_ESPI=y
|
||||
CONFIG_ESPI_DEV="ESPI_0"
|
||||
CONFIG_ESPI_GPIO_DEV_NEEDED=y
|
||||
CONFIG_ESPI_GPIO_DEV="GPIO040_076"
|
||||
CONFIG_ESPI_GPIO_DEV0="GPIO000_036"
|
||||
CONFIG_ESPI_GPIO_DEV1="GPIO040_076"
|
||||
|
||||
# This is MCHP_GPIO_012
|
||||
CONFIG_PWRGD_PIN=10
|
||||
|
||||
# This is MCHP_GPIO_0054
|
||||
CONFIG_ESPI_INIT_PIN=12
|
||||
|
||||
CONFIG_LOG=y
|
||||
|
|
|
@ -2,6 +2,13 @@
|
|||
CONFIG_ESPI=y
|
||||
CONFIG_ESPI_DEV="ESPI_0"
|
||||
CONFIG_ESPI_GPIO_DEV_NEEDED=y
|
||||
CONFIG_ESPI_GPIO_DEV="GPIO040_076"
|
||||
CONFIG_ESPI_GPIO_DEV0="GPIO000_036"
|
||||
CONFIG_ESPI_GPIO_DEV1="GPIO040_076"
|
||||
|
||||
# This is MCHP_GPIO_012
|
||||
CONFIG_PWRGD_PIN=10
|
||||
|
||||
# This is MCHP_GPIO_0054
|
||||
CONFIG_ESPI_INIT_PIN=12
|
||||
|
||||
CONFIG_LOG=y
|
||||
|
|
|
@ -13,7 +13,9 @@
|
|||
#include <espi.h>
|
||||
|
||||
#ifdef CONFIG_ESPI_GPIO_DEV_NEEDED
|
||||
static struct device *gpio_dev;
|
||||
static struct device *gpio_dev0;
|
||||
static struct device *gpio_dev1;
|
||||
#define PWR_SEQ_TIMEOUT 3000
|
||||
#endif
|
||||
|
||||
static struct device *espi_dev;
|
||||
|
@ -117,6 +119,37 @@ int espi_init(void)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int wait_for_pin(struct device *dev, u8_t pin, u16_t timeout,
|
||||
u32_t exp_level)
|
||||
{
|
||||
int ret;
|
||||
u16_t loop_cnt = timeout;
|
||||
u32_t level;
|
||||
|
||||
do {
|
||||
ret = gpio_pin_read(dev, pin, &level);
|
||||
if (ret) {
|
||||
printk("Failed to read %x %d\n", pin, ret);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (exp_level == level) {
|
||||
printk("PIN %x = %x\n", pin, exp_level);
|
||||
break;
|
||||
}
|
||||
|
||||
k_busy_wait(100);
|
||||
loop_cnt--;
|
||||
} while (loop_cnt > 0);
|
||||
|
||||
if (loop_cnt == 0) {
|
||||
printk("PWRT! for %x %x\n", pin, level);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int wait_for_vwire(struct device *espi_dev, enum espi_vwire_signal signal,
|
||||
u16_t timeout, u8_t exp_level)
|
||||
{
|
||||
|
@ -155,7 +188,7 @@ int espi_handshake(void)
|
|||
ret = wait_for_vwire(espi_dev, ESPI_VWIRE_SIGNAL_SUS_WARN,
|
||||
CONFIG_ESPI_VIRTUAL_WIRE_TIMEOUT, 1);
|
||||
if (ret) {
|
||||
printk("SUS_WARN Timeout!");
|
||||
printk("SUS_WARN Timeout!\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -163,21 +196,21 @@ int espi_handshake(void)
|
|||
ret = wait_for_vwire(espi_dev, ESPI_VWIRE_SIGNAL_SLP_S5,
|
||||
CONFIG_ESPI_VIRTUAL_WIRE_TIMEOUT, 1);
|
||||
if (ret) {
|
||||
printk("SLP_S5 Timeout!");
|
||||
printk("SLP_S5 Timeout!\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = wait_for_vwire(espi_dev, ESPI_VWIRE_SIGNAL_SLP_S4,
|
||||
CONFIG_ESPI_VIRTUAL_WIRE_TIMEOUT, 1);
|
||||
if (ret) {
|
||||
printk("SLP_S4 Timeout!");
|
||||
printk("SLP_S4 Timeout!\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = wait_for_vwire(espi_dev, ESPI_VWIRE_SIGNAL_SLP_S3,
|
||||
CONFIG_ESPI_VIRTUAL_WIRE_TIMEOUT, 1);
|
||||
if (ret) {
|
||||
printk("SLP_S3 Timeout!");
|
||||
printk("SLP_S3 Timeout!\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -192,10 +225,16 @@ void main(void)
|
|||
k_sleep(500);
|
||||
|
||||
#ifdef CONFIG_ESPI_GPIO_DEV_NEEDED
|
||||
gpio_dev = device_get_binding(CONFIG_ESPI_GPIO_DEV);
|
||||
if (gpio_dev) {
|
||||
printk("%s FOUND!\n", CONFIG_ESPI_GPIO_DEV);
|
||||
gpio_dev0 = device_get_binding(CONFIG_ESPI_GPIO_DEV0);
|
||||
if (gpio_dev0) {
|
||||
printk("%s FOUND!\n", CONFIG_ESPI_GPIO_DEV0);
|
||||
}
|
||||
|
||||
gpio_dev1 = device_get_binding(CONFIG_ESPI_GPIO_DEV1);
|
||||
if (gpio_dev1) {
|
||||
printk("%s FOUND!\n", CONFIG_ESPI_GPIO_DEV1);
|
||||
}
|
||||
|
||||
#endif
|
||||
espi_dev = device_get_binding(CONFIG_ESPI_DEV);
|
||||
if (espi_dev) {
|
||||
|
@ -205,26 +244,43 @@ void main(void)
|
|||
printk("Hello eSPI test! %s\n", CONFIG_BOARD);
|
||||
|
||||
#ifdef CONFIG_ESPI_GPIO_DEV_NEEDED
|
||||
ret = gpio_pin_configure(gpio_dev, CONFIG_ESPI_INIT_PIN, GPIO_DIR_OUT);
|
||||
ret = gpio_pin_configure(gpio_dev0, CONFIG_PWRGD_PIN, GPIO_DIR_IN);
|
||||
if (ret) {
|
||||
printk("Unable to configure %d ", CONFIG_ESPI_INIT_PIN);
|
||||
printk("Unable to configure PWRGD %d\n", CONFIG_PWRGD_PIN);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = gpio_pin_write(gpio_dev, CONFIG_ESPI_INIT_PIN, 0);
|
||||
ret = gpio_pin_configure(gpio_dev1, CONFIG_ESPI_INIT_PIN, GPIO_DIR_OUT);
|
||||
if (ret) {
|
||||
printk("Unable to initialize %d ", CONFIG_ESPI_INIT_PIN);
|
||||
printk("Unable to configure RSMRST %d\n", CONFIG_ESPI_INIT_PIN);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = gpio_pin_write(gpio_dev1, CONFIG_ESPI_INIT_PIN, 0);
|
||||
if (ret) {
|
||||
printk("Unable to initialize %d\n", CONFIG_ESPI_INIT_PIN);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
espi_init();
|
||||
|
||||
#ifdef CONFIG_ESPI_GPIO_DEV_NEEDED
|
||||
k_sleep(1000);
|
||||
ret = gpio_pin_write(gpio_dev, CONFIG_ESPI_INIT_PIN, 1);
|
||||
ret = wait_for_pin(gpio_dev0, CONFIG_PWRGD_PIN, PWR_SEQ_TIMEOUT, 1);
|
||||
if (ret) {
|
||||
printk("Failed to write %x %d", CONFIG_ESPI_INIT_PIN, ret);
|
||||
printk("RSMRST_PWRGD timeout!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = gpio_pin_write(gpio_dev1, CONFIG_ESPI_INIT_PIN, 1);
|
||||
if (ret) {
|
||||
printk("Failed to write %x %d\n", CONFIG_ESPI_INIT_PIN, ret);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
espi_handshake();
|
||||
ret = espi_handshake();
|
||||
if (ret) {
|
||||
printk("Test failed %d\n", ret);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue