Hannah Williams (hannah.williams@intel.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/17817
-gerrit
commit 2133a315c06b70e828e07c8f6842d08234367454 Author: Hannah Williams hannah.williams@intel.com Date: Mon Oct 10 15:08:55 2016 -0700
soc/glk: Add SOC GPIO access functions
Change-Id: I8d03c7091880bc67e7896856234ddfe0290d397f Signed-off-by: Hannah Williams hannah.williams@intel.com --- src/soc/intel/glk/acpi.c | 2 + src/soc/intel/glk/acpi/gpio.asl | 38 +- src/soc/intel/glk/gpio.c | 176 ++---- src/soc/intel/glk/include/soc/gpio.h | 127 +---- src/soc/intel/glk/include/soc/gpio_defs.h | 912 ++++++++++++++---------------- src/soc/intel/glk/uart_early.c | 9 +- 6 files changed, 525 insertions(+), 739 deletions(-)
diff --git a/src/soc/intel/glk/acpi.c b/src/soc/intel/glk/acpi.c index ca479b8..ffb67ad 100644 --- a/src/soc/intel/glk/acpi.c +++ b/src/soc/intel/glk/acpi.c @@ -178,8 +178,10 @@ static void acpi_create_gnvs(struct global_nvs_t *gnvs) gnvs->dpte = cfg->dptf_enable;
/* Assign address of PERST_0 if GPIO is defined in devicetree */ +/* TODO if (cfg->prt0_gpio != GPIO_PRT0_UDEF) gnvs->prt0 = (uintptr_t)gpio_dwx_address(cfg->prt0_gpio); + */ }
/* Save wake source information for calculating ACPI _SWS values */ diff --git a/src/soc/intel/glk/acpi/gpio.asl b/src/soc/intel/glk/acpi/gpio.asl index ffc5b75..b46c0de 100644 --- a/src/soc/intel/glk/acpi/gpio.asl +++ b/src/soc/intel/glk/acpi/gpio.asl @@ -14,17 +14,21 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ -#include <soc/gpio_defs.h> #include "gpiolib.asl" +#define GPIO_NORTHWEST 0xc4 +#define GPIO_NORTH 0xc5 +#define GPIO_AUDIO 0xc9 +#define GPIO_SCC 0xc8 +#define PAD_CFG0_TX_STATE (1 << 0)
scope (_SB) {
Device (GPO0) { Name (_ADR, 0) - Name (_HID, "INT3452") - Name (_CID, "INT3452") - Name (_DDN, "General Purpose Input/Output (GPIO) Controller - North" ) + Name (_HID, "INT3453") + Name (_CID, "INT3453") + Name (_DDN, "General Purpose Input/Output (GPIO) Controller - NorthWest" ) Name (_UID, 1)
Name (RBUF, ResourceTemplate () @@ -39,7 +43,7 @@ scope (_SB) { Method (_CRS, 0x0, NotSerialized) { CreateDwordField (^RBUF, ^RMEM._BAS, RBAS) - ShiftLeft (GPIO_N, 16, Local0) + ShiftLeft (GPIO_NORTHWEST, 16, Local0) Or (CONFIG_IOSF_BASE_ADDRESS, Local0, RBAS) Return (^RBUF) } @@ -53,9 +57,9 @@ scope (_SB) { Device (GPO1) { Name (_ADR, 0) - Name (_HID, "INT3452") - Name (_CID, "INT3452") - Name (_DDN, "General Purpose Input/Output (GPIO) Controller - Northwest" ) + Name (_HID, "INT3453") + Name (_CID, "INT3453") + Name (_DDN, "General Purpose Input/Output (GPIO) Controller - North" ) Name (_UID, 2)
Name (RBUF, ResourceTemplate () @@ -70,7 +74,7 @@ scope (_SB) { Method (_CRS, 0x0, NotSerialized) { CreateDwordField (^RBUF, ^RMEM._BAS, RBAS) - ShiftLeft (GPIO_NW, 16, Local0) + ShiftLeft (GPIO_NORTH, 16, Local0) Or (CONFIG_IOSF_BASE_ADDRESS, Local0, RBAS) Return (^RBUF) } @@ -84,9 +88,9 @@ scope (_SB) { Device (GPO2) { Name (_ADR, 0) - Name (_HID, "INT3452") - Name (_CID, "INT3452") - Name (_DDN, "General Purpose Input/Output (GPIO) Controller - West" ) + Name (_HID, "INT3453") + Name (_CID, "INT3453") + Name (_DDN, "General Purpose Input/Output (GPIO) Controller - Audio" ) Name (_UID, 3)
Name (RBUF, ResourceTemplate () @@ -101,7 +105,7 @@ scope (_SB) { Method (_CRS, 0x0, NotSerialized) { CreateDwordField (^RBUF, ^RMEM._BAS, RBAS) - ShiftLeft (GPIO_W, 16, Local0) + ShiftLeft (GPIO_AUDIO, 16, Local0) Or (CONFIG_IOSF_BASE_ADDRESS, Local0, RBAS) Return (^RBUF) } @@ -115,9 +119,9 @@ scope (_SB) { Device (GPO3) { Name (_ADR, 0) - Name (_HID, "INT3452") - Name (_CID, "INT3452") - Name (_DDN, "General Purpose Input/Output (GPIO) Controller - Southwest" ) + Name (_HID, "INT3453") + Name (_CID, "INT3453") + Name (_DDN, "General Purpose Input/Output (GPIO) Controller - SCC" ) Name (_UID, 4)
Name (RBUF, ResourceTemplate () @@ -132,7 +136,7 @@ scope (_SB) { Method (_CRS, 0x0, NotSerialized) { CreateDwordField (^RBUF, ^RMEM._BAS, RBAS) - ShiftLeft (GPIO_SW, 16, Local0) + ShiftLeft (GPIO_SCC, 16, Local0) Or (CONFIG_IOSF_BASE_ADDRESS, Local0, RBAS) Return (^RBUF) } diff --git a/src/soc/intel/glk/gpio.c b/src/soc/intel/glk/gpio.c index 4731d56..8e5c6e6 100644 --- a/src/soc/intel/glk/gpio.c +++ b/src/soc/intel/glk/gpio.c @@ -31,29 +31,29 @@ static const struct pad_community { const char *grp_name; } gpio_communities[] = { { - .port = GPIO_SW, - .first_pad = SW_OFFSET, - .num_gpi_regs = NUM_SW_GPI_REGS, + .port = GPIO_SCC, + .first_pad = SCC_OFFSET, + .num_gpi_regs = 0, .gpi_offset = 0, - .grp_name = "GPIO_GPE_SW", + .grp_name = "GPIO_SCC", }, { - .port = GPIO_W, - .first_pad = W_OFFSET, - .num_gpi_regs = NUM_W_GPI_REGS, - .gpi_offset = NUM_SW_GPI_REGS, - .grp_name = "GPIO_GPE_W", - }, { - .port = GPIO_NW, - .first_pad = NW_OFFSET, - .num_gpi_regs = NUM_NW_GPI_REGS, - .gpi_offset = NUM_W_GPI_REGS + NUM_SW_GPI_REGS, - .grp_name = "GPIO_GPE_NW", + .port = GPIO_AUDIO, + .first_pad = AUDIO_OFFSET, + .num_gpi_regs = 0, + .gpi_offset = 0, + .grp_name = "GPIO_AUDIO", }, { - .port = GPIO_N, + .port = GPIO_NORTH, .first_pad = N_OFFSET, - .num_gpi_regs = NUM_N_GPI_REGS, - .gpi_offset = NUM_NW_GPI_REGS+ NUM_W_GPI_REGS + NUM_SW_GPI_REGS, - .grp_name = "GPIO_GPE_N", + .num_gpi_regs = 0, + .gpi_offset = 0, + .grp_name = "GPIO_NORTH", + }, { + .port = GPIO_NORTHWEST, + .first_pad = NW_OFFSET, + .num_gpi_regs = 0, + .gpi_offset = 0, + .grp_name = "GPIO_NORTHWEST", } };
@@ -76,99 +76,50 @@ static void gpio_configure_itss(const struct pad_config *cfg, if (ENV_SMM) return;
- int irq; - - /* Set up ITSS polarity if pad is routed to APIC. - * - * The ITSS takes only active high interrupt signals. Therefore, - * if the pad configuration indicates an inversion assume the - * intent is for the ITSS polarity. Before forwarding on the - * request to the APIC there's an inversion setting for how the - * signal is forwarded to the APIC. Honor the inversion setting - * in the GPIO pad configuration so that a hardware active low - * signal looks that way to the APIC (double inversion). - */ - if (!(cfg->config0 & PAD_CFG0_ROUTE_IOAPIC)) - return; - - irq = iosf_read(port, pad_cfg_offset + sizeof(uint32_t)); - irq &= PAD_CFG1_IRQ_MASK; - if (!irq) { - printk(BIOS_ERR, "GPIO %u doesn't support APIC routing,\n", - cfg->pad); - return; - } - - itss_set_irq_polarity(irq, !!(cfg->config0 & PAD_CFG0_RX_POL_INVERT)); +/* TODO */ }
static void gpio_configure_owner(const struct pad_config *cfg, uint16_t port, int pin) { - uint32_t val; - uint16_t hostsw_reg; - - /* The 4th bit in pad_config 1 (RO) is used to indicate if the pad - * needs GPIO driver ownership. - */ - if (!(cfg->config1 & PAD_CFG1_GPIO_DRIVER)) - return; - - /* Based on the gpio pin number configure the corresponding bit in - * HOSTSW_OWN register. Value of 0x1 indicates GPIO Driver onwership. - */ - hostsw_reg = HOSTSW_OWN_REG_BASE + ((pin / 32) * sizeof(uint32_t)); - val = iosf_read(port, hostsw_reg); - val |= 1 << (pin % 32); - iosf_write(port, hostsw_reg, val); +/* TODO */ }
static void gpi_enable_smi(const struct pad_config *cfg, uint16_t port, int pin) { - uint32_t value; - uint16_t sts_reg; - uint16_t en_reg; - int group; - - if (((cfg->config0) & PAD_CFG0_ROUTE_SMI) != PAD_CFG0_ROUTE_SMI) - return; - - group = pin / GPIO_MAX_NUM_PER_GROUP; - - sts_reg = GPI_SMI_STS_OFFSET(group); - value = iosf_read(port, sts_reg); - /* Write back 1 to reset the sts bits */ - iosf_write(port, sts_reg, value); - - /* Set enable bits */ - en_reg = GPI_SMI_EN_OFFSET(group); - value = iosf_read(port, en_reg ); - value |= 1 << (pin % GPIO_MAX_NUM_PER_GROUP); - iosf_write(port, en_reg , value); +/* TODO */ }
void gpio_configure_pad(const struct pad_config *cfg) { - uint32_t dw1; const struct pad_community *comm = gpio_get_community(cfg->pad); - uint16_t config_offset = PAD_CFG_OFFSET(cfg->pad - comm->first_pad); - - /* Iostandby bits are tentatively stored in [3:0] bits (RO) of config1. - * dw1 is used to extract the bits of Iostandby. - * This is done to preserve config1 size as unit16 in gpio.h. - */ - dw1 = cfg->config1 & ~PAD_CFG1_IOSSTATE_MASK; - dw1 |= (cfg->config1 & PAD_CFG1_IOSSTATE_MASK) << PAD_CFG1_IOSSTATE_SHIFT; - - iosf_write(comm->port, config_offset, cfg->config0); - iosf_write(comm->port, config_offset + sizeof(uint32_t), dw1); + uint16_t config_offset = + PAD_CFG_OFFSET(comm->port, (cfg->pad - comm->first_pad)); + uint32_t pad_conf0; + uint32_t pad_conf1; + + printk(BIOS_DEBUG, "gpio_padcfg [0x%x, 0x%x] DW0 [0x%x : 0x%x] " + "DW1 [0x%x : 0x%x]\n", + comm->port, + (cfg->pad - comm->first_pad), + pad_conf0 = iosf_read(comm->port, config_offset), /* old value */ + cfg->pad_config0, /* new value */ + pad_conf1 = iosf_read(comm->port, config_offset+4), /* old value */ + cfg->pad_config1); /* new value */ + + iosf_write(comm->port, config_offset, (pad_conf0 & PAD_DW0_MASK) | + cfg->pad_config0); + + iosf_write(comm->port, config_offset + 4, (pad_conf1 & PAD_DW1_MASK) | + cfg->pad_config1);
gpio_configure_itss(cfg, comm->port, config_offset); gpio_configure_owner(cfg, comm->port, cfg->pad - comm->first_pad); - gpi_enable_smi(cfg, comm->port, cfg->pad - comm->first_pad); }
+ + void gpio_configure_pads(const struct pad_config *cfg, size_t num_pads) { uint32_t i; @@ -184,38 +135,34 @@ void * gpio_dwx_address(const uint16_t pad) * returns - address of GPIO */ const struct pad_community *comm = gpio_get_community(pad); - return iosf_address(comm->port, PAD_CFG_OFFSET(pad - comm->first_pad)); + return iosf_address(comm->port, PAD_CFG_OFFSET(comm->port, (pad - comm->first_pad))); }
void gpio_input_pulldown(gpio_t gpio) { - struct pad_config cfg = PAD_CFG_GPI(gpio, DN_20K, DEEP); - gpio_configure_pad(&cfg); +/* TODO */ }
void gpio_input_pullup(gpio_t gpio) { - struct pad_config cfg = PAD_CFG_GPI(gpio, UP_20K, DEEP); - gpio_configure_pad(&cfg); +/* TODO */ }
void gpio_input(gpio_t gpio) { - struct pad_config cfg = PAD_CFG_GPI(gpio, NONE, DEEP); - gpio_configure_pad(&cfg); +/* TODO */ }
void gpio_output(gpio_t gpio, int value) { - struct pad_config cfg = PAD_CFG_GPO(gpio, value, DEEP); - gpio_configure_pad(&cfg); +/* TODO */ }
int gpio_get(gpio_t gpio_num) { uint32_t reg; const struct pad_community *comm = gpio_get_community(gpio_num); - uint16_t config_offset = PAD_CFG_OFFSET(gpio_num - comm->first_pad); + uint16_t config_offset = PAD_CFG_OFFSET(comm->port, (gpio_num - comm->first_pad));
reg = iosf_read(comm->port, config_offset);
@@ -226,7 +173,7 @@ void gpio_set(gpio_t gpio_num, int value) { uint32_t reg; const struct pad_community *comm = gpio_get_community(gpio_num); - uint16_t config_offset = PAD_CFG_OFFSET(gpio_num - comm->first_pad); + uint16_t config_offset = PAD_CFG_OFFSET(comm->port, (gpio_num - comm->first_pad));
reg = iosf_read(comm->port, config_offset); reg &= ~PAD_CFG0_TX_STATE; @@ -239,13 +186,13 @@ const char *gpio_acpi_path(gpio_t gpio_num) const struct pad_community *comm = gpio_get_community(gpio_num);
switch (comm->port) { - case GPIO_N: + case GPIO_NORTHWEST: return "\_SB.GPO0"; - case GPIO_NW: + case GPIO_NORTH: return "\_SB.GPO1"; - case GPIO_W: + case GPIO_AUDIO: return "\_SB.GPO2"; - case GPIO_SW: + case GPIO_SCC: return "\_SB.GPO3"; }
@@ -255,19 +202,8 @@ const char *gpio_acpi_path(gpio_t gpio_num) uint16_t gpio_acpi_pin(gpio_t gpio_num) { const struct pad_community *comm = gpio_get_community(gpio_num); - - switch (comm->port) { - case GPIO_N: - return PAD_N(gpio_num); - case GPIO_NW: - return PAD_NW(gpio_num); - case GPIO_W: - return PAD_W(gpio_num); - case GPIO_SW: - return PAD_SW(gpio_num); - } - - return gpio_num; + + return (gpio_num - comm->first_pad); }
static void print_gpi_status(const struct gpi_status *sts) diff --git a/src/soc/intel/glk/include/soc/gpio.h b/src/soc/intel/glk/include/soc/gpio.h index 9495a0f..e9f3f14 100644 --- a/src/soc/intel/glk/include/soc/gpio.h +++ b/src/soc/intel/glk/include/soc/gpio.h @@ -18,13 +18,22 @@ #ifndef _SOC_GLK_GPIO_H_ #define _SOC_GLK_GPIO_H_
-#include <soc/gpio_defs.h> -/* __ACPI__ guard is needed to ignore below code in ACPI/ASL compilation */ -#ifndef __ACPI__ #include <types.h> +#include <soc/gpio_defs.h>
typedef uint32_t gpio_t;
+struct pad_config { + int pad;/* offset of pad within community*/ + uint32_t pad_config0; + uint32_t pad_config1; + enum glk_gpio_community comm_port;/* community port id */ + int hostsw; + int wake_enabled; /*Wake enable for direct IRQ pin*/ + const char *pad_name; +}; + + /* * Structure to represent GPI status for GPE and SMI. Use helper * functions for interrogating particular GPIs. Here the number of @@ -44,114 +53,6 @@ void gpi_clear_get_smi_status(struct gpi_status *sts); /* Return 1 if gpio is set in the gpi_status struct. Otherwise 0. */ int gpi_status_get(const struct gpi_status *sts, gpio_t gpi);
-#define PAD_FUNC(value) PAD_CFG0_MODE_##value -#define PAD_RESET(value) PAD_CFG0_RESET_##value -#define PAD_PULL(value) PAD_CFG1_PULL_##value -#define PAD_IOSSTATE(value) PAD_CFG1_IOSSTATE_##value -#define PAD_IRQ_CFG(route, trig, inv) \ - (PAD_CFG0_ROUTE_##route | \ - PAD_CFG0_TRIG_##trig | \ - (PAD_CFG0_RX_POL_##inv)) - -#define _PAD_CFG_STRUCT(__pad, __config0, __config1) \ - { \ - .pad = __pad, \ - .config0 = __config0, \ - .config1 = __config1, \ - } - -/* Native function configuration */ -#define PAD_CFG_NF(pad, pull, rst, func) \ - _PAD_CFG_STRUCT(pad, PAD_RESET(rst) | PAD_FUNC(func), PAD_PULL(pull) | \ - PAD_IOSSTATE(TxLASTRxE)) - -/* Native function configuration for standby state */ -#define PAD_CFG_NF_IOSSTATE(pad, pull, rst, func, iosstate) \ - _PAD_CFG_STRUCT(pad, PAD_RESET(rst) | PAD_FUNC(func), PAD_PULL(pull) | \ - PAD_IOSSTATE(iosstate)) - -/* General purpose output, no pullup/down. */ -#define PAD_CFG_GPO(pad, val, rst) \ - _PAD_CFG_STRUCT(pad, \ - PAD_FUNC(GPIO) | PAD_RESET(rst) | PAD_CFG0_RX_DISABLE | !!val, \ - PAD_PULL(NONE) | PAD_IOSSTATE(TxLASTRxE)) - -/* General purpose input */ -#define PAD_CFG_GPI(pad, pull, rst) \ - _PAD_CFG_STRUCT(pad, \ - PAD_FUNC(GPIO) | PAD_RESET(rst) | PAD_CFG0_TX_DISABLE, \ - PAD_PULL(pull) | PAD_IOSSTATE(TxLASTRxE)) - -/* General purpose input. The following macro sets the - * Host Software Pad Ownership to GPIO Driver mode. - */ -#define PAD_CFG_GPI_GPIO_DRIVER(pad, pull, rst) \ - _PAD_CFG_STRUCT(pad, \ - PAD_FUNC(GPIO) | PAD_RESET(rst) | PAD_CFG0_TX_DISABLE, \ - PAD_PULL(pull) | PAD_CFG1_GPIO_DRIVER | PAD_IOSSTATE(TxLASTRxE)) - -/* No Connect configuration for unused pad. - * NC should be GPI with Term as PU20K, PD20K, NONE depending upon default Term - */ -#define PAD_NC(pad, pull) PAD_CFG_GPI(pad, pull, DEEP) - -/* General purpose input, routed to APIC */ -#define PAD_CFG_GPI_APIC(pad, pull, rst, trig, inv) \ - _PAD_CFG_STRUCT(pad, \ - PAD_FUNC(GPIO) | PAD_RESET(rst) | PAD_CFG0_TX_DISABLE | \ - PAD_IRQ_CFG(IOAPIC, trig, inv), PAD_PULL(pull) | \ - PAD_IOSSTATE(TxLASTRxE)) - -/* - * The following APIC macros assume the APIC will handle the filtering - * on its own end. One just needs to pass an active high message into the - * ITSS. - */ -#define PAD_CFG_GPI_APIC_LOW(pad, pull, rst) \ - PAD_CFG_GPI_APIC(pad, pull, rst, LEVEL, INVERT) - -#define PAD_CFG_GPI_APIC_HIGH(pad, pull, rst) \ - PAD_CFG_GPI_APIC(pad, pull, rst, LEVEL, NONE) - -/* General purpose input, routed to SMI */ -#define PAD_CFG_GPI_SMI(pad, pull, rst, trig, inv) \ - _PAD_CFG_STRUCT(pad, \ - PAD_FUNC(GPIO) | PAD_RESET(rst) | PAD_CFG0_TX_DISABLE | \ - PAD_IRQ_CFG(SMI, trig, inv), PAD_PULL(pull) | \ - PAD_IOSSTATE(TxLASTRxE)) - -#define PAD_CFG_GPI_SMI_LOW(pad, pull, rst, trig) \ - PAD_CFG_GPI_SMI(pad, pull, rst, trig, INVERT) - -#define PAD_CFG_GPI_SMI_HIGH(pad, pull, rst, trig) \ - PAD_CFG_GPI_SMI(pad, pull, rst, trig, NONE) - -/* General purpose input, routed to SCI */ -#define PAD_CFG_GPI_SCI(pad, pull, rst, trig, inv) \ - _PAD_CFG_STRUCT(pad, \ - PAD_FUNC(GPIO) | PAD_RESET(rst) | PAD_CFG0_TX_DISABLE | \ - PAD_IRQ_CFG(SCI, trig, inv), PAD_PULL(pull) | \ - PAD_IOSSTATE(TxLASTRxE)) - -#define PAD_CFG_GPI_SCI_LOW(pad, pull, rst, trig) \ - PAD_CFG_GPI_SCI(pad, pull, rst, trig, INVERT) - -#define PAD_CFG_GPI_SCI_HIGH(pad, pull, rst, trig) \ - PAD_CFG_GPI_SCI(pad, pull, rst, trig, NONE) - -/* General purpose input, routed to NMI */ -#define PAD_CFG_GPI_NMI(pad, pull, rst, trig, inv) \ - _PAD_CFG_STRUCT(pad, \ - PAD_FUNC(GPIO) | PAD_RESET(rst) | PAD_CFG0_TX_DISABLE | \ - PAD_IRQ_CFG(NMI, trig, inv), PAD_PULL(pull) | \ - PAD_IOSSTATE(TxLASTRxE)) - -struct pad_config { - uint32_t config0; - uint16_t config1; - uint16_t pad; -}; - /* * Configuration for raw pads. Some pads are designated as only special function * pins, and don't have an associated GPIO number, so we need to expose the raw @@ -159,8 +60,6 @@ struct pad_config { */ void gpio_configure_pad(const struct pad_config *cfg); void gpio_configure_pads(const struct pad_config *cfg, size_t num_pads); - -/* Calculate GPIO DW0 address */ void * gpio_dwx_address(const uint16_t pad); /* * Set the GPIO groups for the GPE blocks. The values from PMC register GPE_CFG @@ -172,6 +71,4 @@ void * gpio_dwx_address(const uint16_t pad); */ void gpio_route_gpe(uint8_t gpe0b, uint8_t gpe0c, uint8_t gpe0d);
-#endif /* __ACPI__ */ - #endif /* _SOC_GLK_GPIO_H_ */ diff --git a/src/soc/intel/glk/include/soc/gpio_defs.h b/src/soc/intel/glk/include/soc/gpio_defs.h index b46957c..16f7bc4 100644 --- a/src/soc/intel/glk/include/soc/gpio_defs.h +++ b/src/soc/intel/glk/include/soc/gpio_defs.h @@ -1,13 +1,12 @@ /* - * Definitions for the GPIO subsystem on Apollolake + * Definitions for the GPIO subsystem on GLK * * Placed in a separate file since some of these definitions can be used from * assembly code * * This file is part of the coreboot project. * - * Copyright (C) 2015 Intel Corp. - * (Written by Alexandru Gagniuc alexandrux.gagniuc@intel.com for Intel Corp.) + * Copyright (C) 2016 Intel Corp. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +22,423 @@ #ifndef _SOC_GLK_GPIO_DEFS_H_ #define _SOC_GLK_GPIO_DEFS_H_
+#define NA 0xFF + +enum interrupt_type { + LEVEL = 0, + EDGE = 1, + INT_DIS = 2, + BOTHEDGE = 3, + INT_TYPE_MASK = BOTHEDGE, +}; + +enum invert_rx { + NO_INVERT = 0, + INVERT = 1, + INVERT_RX_MASK = INVERT, +}; + +enum gpio_route { + GPIO_ROUT_IOAPIC = 8 , + GPIO_ROUT_SCI = 4, + GPIO_ROUT_SMI = 2, + GPIO_ROUT_NMI = 1, + GPIO_ROUT_NONE = 0, + GPIO_ROUT_MASK = 0xF, +}; + +enum pad_mode { + M0 = 0,/* GPIO Controller controls the Pad */ + M1, /* Native Function 1, if applicable, controls the pad */ + M2, + M3, + M4, + M5, + M6, + PAD_MODE_MASK +}; + +enum gpio_config_en { + NATIVE = 0xff, + GPIO = 0, /* Native, no need to set PAD_VALUE */ + GPI = 1, /* GPI, input only in PAD_VALUE */ + GPO = 2, /* GPO, output only in PAD_VALUE */ + HI_Z = 3, + GPIO_CONFIG_MASK = HI_Z, +}; + +enum gpio_tx_state { + LO = 0, + HI = 1, + GPIO_TX_STATE_MASK = HI, +}; + +enum host_sw { + ACPI_D = 0, // ACPI driver + GPIO_D = 1, // GPIO driver +}; + +/* + I/O Standby State +*/ +enum ios_state { + LAST_VALUE = 0, /* Latch last value driven on TX, TX Enable and RX Enable*/ + D0RXDRX0I = 1, /* Drive 0 with RX disabled and RX drive 0 internally*/ + D0RXDRX1I = 2, /* Drive 0 with RX disabled and RX drive 1 internally*/ + D1RXDRX0I = 3, /* Drive 1 with RX disabled and RX drive 0 internally*/ + D1RXDRX1I = 4, /* Drive 1 with RX disabled and RX drive 1 internally*/ + D0RXE = 5, /* Drive 0 with RX enabled*/ + D1RXE = 6, /* Drive 1 with RX enabled*/ + HIZRX0I = 7, /* Hi-Z with RX drive 0 internally*/ + HIZRX1I = 8, /* Hi-Z with RX drive 1 internally*/ + TXDRXE = 9, /* TX Disabled and RX Enabled (i.e. wake or interrupt)*/ + IOS_MASK = 15, /* IO Standby signal is masked for this pad*/ +}; + +/* + I/O Standby Termination +*/ +enum iosterm { + SAME = 0, /* Same as functional pull */ + DISPUPD = 1, /* Disable Pullup and Pulldown */ + ENPD = 2, /* Enable Pulldown */ + ENPU = 3, /* Enable Pullup */ + IOSTERM_MASK = ENPU +}; + +/* + Wake enable or disable for direct IRQ GPIO pin +*/ +enum wake_capable { + WAKE_DISABLED = 0, + WAKE_ENABLED = 1, +}; + +enum term_type { + P_NONE = 0, ///< Pull None + P_5K_L = 2, ///< Pull Down 5K + P_20K_L = 4, ///< Pull Down 20K + P_1K_H = 9, ///< Pull Up 1K + P_2K_H = 11, ///< Pull Up 2K + P_20K_H = 12, ///< Pull Up 20K + P_5K_H = 10, ///< Pull Up 5K + P_1K2K_H = 13, ///< Pull Up 1K + NATIVE_CONTROL = 15 +}; + +enum pad_reset_cfg { + RESET_POWERGOOD, + RESET_DEEP, + RESET_GPIO, + RESET_CONFIG_MASK +}; + + +/* IOSF port numbers for GPIO comminuties*/ +enum glk_gpio_community { + GPIO_NORTHWEST = 0xc4, + GPIO_NORTH = 0xc5, + GPIO_AUDIO = 0xc9, + GPIO_SCC = 0xc8, +}; + +/* North West community pads */ +/* For DFx GPIO, Display, USB, I2C, UART, and Thermal GPIO*/ +#define NW_OFFSET 0 +#define GPIO_0 (NW_OFFSET + 0) +#define GPIO_1 (NW_OFFSET + 1) +#define GPIO_2 (NW_OFFSET + 2) +#define GPIO_3 (NW_OFFSET + 3) +#define GPIO_4 (NW_OFFSET + 4) +#define GPIO_5 (NW_OFFSET + 5) +#define GPIO_6 (NW_OFFSET + 6) +#define GPIO_7 (NW_OFFSET + 7) +#define GPIO_8 (NW_OFFSET + 8) +#define GPIO_9 (NW_OFFSET + 9) +#define GPIO_10 (NW_OFFSET + 10) +#define GPIO_11 (NW_OFFSET + 11) +#define GPIO_12 (NW_OFFSET + 12) +#define GPIO_13 (NW_OFFSET + 13) +#define GPIO_14 (NW_OFFSET + 14) +#define GPIO_15 (NW_OFFSET + 15) +#define GPIO_16 (NW_OFFSET + 16) +#define GPIO_17 (NW_OFFSET + 17) +#define GPIO_18 (NW_OFFSET + 18) +#define GPIO_19 (NW_OFFSET + 19) +#define GPIO_20 (NW_OFFSET + 20) +#define GPIO_21 (NW_OFFSET + 21) +#define GPIO_22 (NW_OFFSET + 22) +#define GPIO_23 (NW_OFFSET + 23) +#define GPIO_24 (NW_OFFSET + 24) +#define GPIO_25 (NW_OFFSET + 25) +#define GPIO_26 (NW_OFFSET + 26) +#define GPIO_27 (NW_OFFSET + 27) +#define GPIO_28 (NW_OFFSET + 28) +#define GPIO_29 (NW_OFFSET + 29) +#define GPIO_30 (NW_OFFSET + 30) +#define GPIO_31 (NW_OFFSET + 31) +#define GPIO_32 (NW_OFFSET + 32) +#define GPIO_33 (NW_OFFSET + 33) +#define GPIO_34 (NW_OFFSET + 34) +#define GPIO_35 (NW_OFFSET + 35) +#define GPIO_36 (NW_OFFSET + 36) +#define GPIO_37 (NW_OFFSET + 37) +#define GPIO_38 (NW_OFFSET + 38) +#define GPIO_39 (NW_OFFSET + 39) +#define GPIO_40 (NW_OFFSET + 40) +#define GPIO_41 (NW_OFFSET + 41) +#define GPIO_42 (NW_OFFSET + 42) +#define GPIO_43 (NW_OFFSET + 43) +#define GPIO_44 (NW_OFFSET + 44) +#define GPIO_45 (NW_OFFSET + 45) +#define GPIO_46 (NW_OFFSET + 46) +#define GPIO_47 (NW_OFFSET + 47) +#define GPIO_48 (NW_OFFSET + 48) +#define GPIO_49 (NW_OFFSET + 49) +#define GPIO_50 (NW_OFFSET + 50) +#define GPIO_51 (NW_OFFSET + 51) +#define GPIO_52 (NW_OFFSET + 52) +#define GPIO_53 (NW_OFFSET + 53) +#define GPIO_54 (NW_OFFSET + 54) +#define GPIO_55 (NW_OFFSET + 55) +#define GPIO_56 (NW_OFFSET + 56) +#define GPIO_57 (NW_OFFSET + 57) +#define GPIO_58 (NW_OFFSET + 58) +#define GPIO_59 (NW_OFFSET + 59) +#define GPIO_60 (NW_OFFSET + 60) +#define GPIO_61 (NW_OFFSET + 61) +#define GPIO_62 (NW_OFFSET + 62) +#define GPIO_63 (NW_OFFSET + 63) +#define GPIO_64 (NW_OFFSET + 64) +#define GPIO_65 (NW_OFFSET + 65) +#define GPIO_66 (NW_OFFSET + 66) +#define GPIO_67 (NW_OFFSET + 67) +#define GPIO_68 (NW_OFFSET + 68) +#define GPIO_69 (NW_OFFSET + 69) +#define GPIO_70 (NW_OFFSET + 70) +#define GPIO_71 (NW_OFFSET + 71) +#define GPIO_72 (NW_OFFSET + 72) +#define GPIO_73 (NW_OFFSET + 73) +#define GPIO_74 (NW_OFFSET + 74) +#define GPIO_75 (NW_OFFSET + 75) +#define GPIO_211 (NW_OFFSET + 76) +#define GPIO_212 (NW_OFFSET + 77) +#define GPIO_213 (NW_OFFSET + 78) +#define GPIO_214 (NW_OFFSET + 79) +#define TOTAL_NW_PADS 80 + +/* North Community Pads */ +/* For power management GPIO, I2C, Display, LPC/eSPI, SPI */ +#define N_OFFSET (NW_OFFSET + 80) +#define GPIO_76 (N_OFFSET + 0) +#define GPIO_77 (N_OFFSET + 1) +#define GPIO_78 (N_OFFSET + 2) +#define GPIO_79 (N_OFFSET + 3) +#define GPIO_80 (N_OFFSET + 4) +#define GPIO_81 (N_OFFSET + 5) +#define GPIO_82 (N_OFFSET + 6) +#define GPIO_83 (N_OFFSET + 7) +#define GPIO_84 (N_OFFSET + 8) +#define GPIO_85 (N_OFFSET + 9) +#define GPIO_86 (N_OFFSET + 10) +#define GPIO_87 (N_OFFSET + 11) +#define GPIO_88 (N_OFFSET + 12) +#define GPIO_89 (N_OFFSET + 13) +#define GPIO_90 (N_OFFSET + 14) +#define GPIO_91 (N_OFFSET + 15) +#define GPIO_92 (N_OFFSET + 16) +#define GPIO_93 (N_OFFSET + 17) +#define GPIO_94 (N_OFFSET + 18) +#define GPIO_95 (N_OFFSET + 19) +#define GPIO_96 (N_OFFSET + 20) +#define GPIO_97 (N_OFFSET + 21) +#define GPIO_98 (N_OFFSET + 22) +#define GPIO_99 (N_OFFSET + 23) +#define GPIO_100 (N_OFFSET + 24) +#define GPIO_101 (N_OFFSET + 25) +#define GPIO_102 (N_OFFSET + 26) +#define GPIO_103 (N_OFFSET + 27) +#define GPIO_104 (N_OFFSET + 28) +#define GPIO_105 (N_OFFSET + 29) +#define GPIO_106 (N_OFFSET + 30) +#define GPIO_107 (N_OFFSET + 31) +#define GPIO_108 (N_OFFSET + 32) +#define GPIO_109 (N_OFFSET + 33) +#define GPIO_110 (N_OFFSET + 34) +#define GPIO_111 (N_OFFSET + 35) +#define GPIO_112 (N_OFFSET + 36) +#define GPIO_113 (N_OFFSET + 37) +#define GPIO_114 (N_OFFSET + 38) +#define GPIO_115 (N_OFFSET + 39) +#define GPIO_116 (N_OFFSET + 40) +#define GPIO_117 (N_OFFSET + 41) +#define GPIO_118 (N_OFFSET + 42) +#define GPIO_119 (N_OFFSET + 43) +#define GPIO_120 (N_OFFSET + 44) +#define GPIO_121 (N_OFFSET + 45) +#define GPIO_122 (N_OFFSET + 46) +#define GPIO_123 (N_OFFSET + 47) +#define GPIO_124 (N_OFFSET + 48) +#define GPIO_125 (N_OFFSET + 49) +#define GPIO_126 (N_OFFSET + 50) +#define GPIO_127 (N_OFFSET + 51) +#define GPIO_128 (N_OFFSET + 52) +#define GPIO_129 (N_OFFSET + 53) +#define GPIO_130 (N_OFFSET + 54) +#define GPIO_131 (N_OFFSET + 55) +#define GPIO_132 (N_OFFSET + 56) +#define GPIO_133 (N_OFFSET + 57) +#define GPIO_134 (N_OFFSET + 58) +#define GPIO_135 (N_OFFSET + 59) +#define GPIO_136 (N_OFFSET + 60) +#define GPIO_137 (N_OFFSET + 61) +#define GPIO_138 (N_OFFSET + 62) +#define GPIO_139 (N_OFFSET + 63) +#define GPIO_140 (N_OFFSET + 64) +#define GPIO_141 (N_OFFSET + 65) +#define GPIO_142 (N_OFFSET + 66) +#define GPIO_143 (N_OFFSET + 67) +#define GPIO_144 (N_OFFSET + 68) +#define GPIO_145 (N_OFFSET + 69) +#define GPIO_146 (N_OFFSET + 70) +#define GPIO_147 (N_OFFSET + 71) +#define GPIO_148 (N_OFFSET + 72) +#define GPIO_149 (N_OFFSET + 73) +#define GPIO_150 (N_OFFSET + 74) +#define GPIO_151 (N_OFFSET + 75) +#define GPIO_152 (N_OFFSET + 76) +#define GPIO_153 (N_OFFSET + 77) +#define GPIO_154 (N_OFFSET + 78) +#define GPIO_155 (N_OFFSET + 79) +#define TOTAL_N_PADS 80 + +/* Audio Community Pads */ +#define AUDIO_OFFSET (N_OFFSET + 80) +#define GPIO_156 (AUDIO_OFFSET + 0) +#define GPIO_157 (AUDIO_OFFSET + 1) +#define GPIO_158 (AUDIO_OFFSET + 2) +#define GPIO_159 (AUDIO_OFFSET + 3) +#define GPIO_160 (AUDIO_OFFSET + 4) +#define GPIO_161 (AUDIO_OFFSET + 5) +#define GPIO_162 (AUDIO_OFFSET + 6) +#define GPIO_163 (AUDIO_OFFSET + 7) +#define GPIO_164 (AUDIO_OFFSET + 8) +#define GPIO_165 (AUDIO_OFFSET + 9) +#define GPIO_166 (AUDIO_OFFSET + 10) +#define GPIO_167 (AUDIO_OFFSET + 11) +#define GPIO_168 (AUDIO_OFFSET + 12) +#define GPIO_169 (AUDIO_OFFSET + 13) +#define GPIO_170 (AUDIO_OFFSET + 14) +#define GPIO_171 (AUDIO_OFFSET + 15) +#define GPIO_172 (AUDIO_OFFSET + 16) +#define GPIO_173 (AUDIO_OFFSET + 17) +#define GPIO_174 (AUDIO_OFFSET + 18) +#define GPIO_175 (AUDIO_OFFSET + 19) +#define TOTAL_AUDIO_PADS 20 + + +/* SCC community pads */ +/* For SMBus, SD-Card, Clock, CNV/SDIO, eMMC */ +#define SCC_OFFSET (AUDIO_OFFSET + 20) +#define GPIO_176 (SCC_OFFSET + 0) +#define GPIO_177 (SCC_OFFSET + 1) +#define GPIO_178 (SCC_OFFSET + 2) +#define GPIO_187 (SCC_OFFSET + 3) +#define GPIO_179 (SCC_OFFSET + 4) +#define GPIO_180 (SCC_OFFSET + 5) +#define GPIO_181 (SCC_OFFSET + 6) +#define GPIO_182 (SCC_OFFSET + 7) +#define GPIO_183 (SCC_OFFSET + 8) +#define GPIO_184 (SCC_OFFSET + 9) +#define GPIO_185 (SCC_OFFSET + 10) +#define GPIO_186 (SCC_OFFSET + 11) +#define GPIO_188 (SCC_OFFSET + 12) +#define GPIO_210 (SCC_OFFSET + 13) +#define GPIO_189 (SCC_OFFSET + 14) +#define GPIO_190 (SCC_OFFSET + 15) +#define GPIO_191 (SCC_OFFSET + 16) +#define GPIO_192 (SCC_OFFSET + 17) +#define GPIO_193 (SCC_OFFSET + 18) +#define GPIO_194 (SCC_OFFSET + 19) +#define GPIO_195 (SCC_OFFSET + 20) +#define GPIO_196 (SCC_OFFSET + 21) +#define GPIO_197 (SCC_OFFSET + 22) +#define GPIO_198 (SCC_OFFSET + 23) +#define GPIO_199 (SCC_OFFSET + 24) +#define GPIO_200 (SCC_OFFSET + 25) +#define GPIO_201 (SCC_OFFSET + 26) +#define GPIO_202 (SCC_OFFSET + 27) +#define GPIO_203 (SCC_OFFSET + 28) +#define GPIO_204 (SCC_OFFSET + 29) +#define GPIO_205 (SCC_OFFSET + 30) +#define GPIO_206 (SCC_OFFSET + 31) +#define GPIO_207 (SCC_OFFSET + 32) +#define GPIO_208 (SCC_OFFSET + 33) +#define GPIO_209 (SCC_OFFSET + 34) +#define TOTAL_SCC_PADS 35 +#define TOTAL_PADS (SCC_OFFSET + 35) + +/* keep some default bits masked*/ +#define PAD_DW0_MASK 0xF961E0FE +#define PAD_DW1_MASK 0xFFFC00FF + +#define GLK_GPIO_PAD0_CONF(interrupt_type, rx_invert, gpi_rout, pmode, gpio_config, gpo_state, pad_reset_config) \ + ((((interrupt_type ) != NA) ? \ + (interrupt_type & INT_TYPE_MASK) << 25 : INT_DIS << 25 ) | \ + ((rx_invert != NA) ? \ + (rx_invert & INVERT_RX_MASK) << 23 : NO_INVERT << 23) | \ + ((gpi_rout != NA) ? \ + ((gpi_rout & GPIO_ROUT_MASK) << 17) : GPIO_ROUT_NONE << 17) | \ + ((pmode & PAD_MODE_MASK) << 10) | \ + ((gpio_config != NA) ? \ + ((gpio_config & GPIO_CONFIG_MASK) << 8 ): 0 << 8) | \ + ((gpo_state != NA) ? \ + (gpo_state & GPIO_TX_STATE_MASK) : 0) | \ + ((pad_reset_config != NA) ? \ + ((pad_reset_config & RESET_CONFIG_MASK) << 30) : 0)) + +#define GLK_GPIO_PAD1_CONF(ios_state, term_H_L, ios_term) \ + (((ios_state != NA) ? \ + ((ios_state & IOS_MASK) << 14) : LAST_VALUE) | \ + ((term_H_L != NA) ? \ + ((term_H_L & NATIVE_CONTROL) << 10) : P_NONE) | \ + ((ios_term != NA) ? \ + ((ios_term & IOSTERM_MASK) << 8) : SAME)) + +#define GLK_GPIO_PAD_CONF(pad_name, pad_offset, pmode, gpio_config, host_sw, gpo_state, interrupt_type, wake_enabled, term_H_L, rx_invert, gpi_rout, ios_state, ios_term, pad_reset_cfg, community ) \ + { \ + pad_offset, \ + GLK_GPIO_PAD0_CONF(interrupt_type, rx_invert, gpi_rout, pmode, gpio_config, gpo_state, pad_reset_cfg), \ + GLK_GPIO_PAD1_CONF(ios_state, term_H_L, ios_term), \ + community, \ + ((host_sw == NA)||(host_sw == ACPI_D))? ACPI_D : GPIO_D,\ + wake_enabled, \ + pad_name, \ + } + +#define PAD_CFG_GPI(pad, term, reset_cfg) \ + GLK_GPIO_PAD_CONF("", pad, M0, GPI, NA, NA, NA, NA, term, NA, NA, NA,\ + SAME, NA, NA) + +#define PAD_CFG_GPO(pad, value, reset_cfg) \ + GLK_GPIO_PAD_CONF("", pad, M0, GPO, NA, value, NA, NA, NA, NA, NA, NA,\ + SAME, NA, NA) + +#define PADBAR_OFFSET 0xC /* PAD BASE ADDRESS */ +#define PAD_CFG_OFFSET(port, pad) (iosf_read(port,PADBAR_OFFSET) \ + + ((pad) * 16)) + +#define PAD_CFG0_TX_STATE (1 << 0) +#define PAD_CFG0_RX_STATE (1 << 1) + +/* Default configurations */ +#define PAD_CFG0_DEFAULT_FUNC(x) (PAD_CFG0_RESET_DEEP | PAD_CFG0_MODE_FUNC(x)) +#define PAD_CFG0_DEFAULT_NATIVE PAD_CFG0_DEFAULT_FUNC(1) + +#define PAD_CFG1_DEFAULT_PULLUP PAD_CFG1_PULL_UP_20K +#define PAD_CFG1_DEFAULT_NATIVE PAD_CFG1_PULL_NATIVE + + /* * Miscellaneous Configuration register(MISCCFG).These are community specific * registers and are meant to house miscellaneous configuration fields per @@ -53,98 +469,18 @@ */ #define HOSTSW_OWN_REG_BASE 0x80
-#define PAD_CFG0_TX_STATE (1 << 0) -#define PAD_CFG0_RX_STATE (1 << 1) -#define PAD_CFG0_TX_DISABLE (1 << 8) -#define PAD_CFG0_RX_DISABLE (1 << 9) -#define PAD_CFG0_MODE_MASK (7 << 10) -#define PAD_CFG0_MODE_GPIO (0 << 10) -#define PAD_CFG0_MODE_FUNC(x) ((x) << 10) -#define PAD_CFG0_MODE_NF1 (1 << 10) -#define PAD_CFG0_MODE_NF2 (2 << 10) -#define PAD_CFG0_MODE_NF3 (3 << 10) -#define PAD_CFG0_MODE_NF4 (4 << 10) -#define PAD_CFG0_MODE_NF5 (5 << 10) -#define PAD_CFG0_ROUTE_NMI (1 << 17) -#define PAD_CFG0_ROUTE_SMI (1 << 18) -#define PAD_CFG0_ROUTE_SCI (1 << 19) -#define PAD_CFG0_ROUTE_IOAPIC (1 << 20) -#define PAD_CFG0_RX_POL_INVERT (1 << 23) -#define PAD_CFG0_RX_POL_NONE (0 << 23) - -#define PAD_CFG0_TRIG_MASK (3 << 25) -#define PAD_CFG0_TRIG_LEVEL (0 << 25) -#define PAD_CFG0_TRIG_EDGE_SINGLE (1 << 25) /* controlled by RX_INVERT*/ -#define PAD_CFG0_TRIG_OFF (2 << 25) -#define PAD_CFG0_TRIG_EDGE_BOTH (3 << 25) -#define PAD_CFG0_RESET_MASK (3 << 30) -#define PAD_CFG0_RESET_PWROK (0 << 30) -#define PAD_CFG0_RESET_DEEP (1 << 30) -#define PAD_CFG0_RESET_PLTRST (2 << 30) -#define PAD_CFG0_RESET_RSMRST (3 << 30) - -/* Use the fourth bit in IntSel field to indicate gpio - * ownership. This field is RO and hence not used during - * gpio configuration. - */ -#define PAD_CFG1_GPIO_DRIVER (0x1 << 4) -#define PAD_CFG1_IRQ_MASK (0xff << 0) -#define PAD_CFG1_PULL_MASK (0xf << 10) -#define PAD_CFG1_PULL_NONE (0x0 << 10) -#define PAD_CFG1_PULL_DN_5K (0x2 << 10) -#define PAD_CFG1_PULL_DN_20K (0x4 << 10) -#define PAD_CFG1_PULL_UP_1K (0x9 << 10) -#define PAD_CFG1_PULL_UP_5K (0xa << 10) -#define PAD_CFG1_PULL_UP_2K (0xb << 10) -#define PAD_CFG1_PULL_UP_20K (0xc << 10) -#define PAD_CFG1_PULL_UP_667 (0xd << 10) -#define PAD_CFG1_PULL_NATIVE (0xf << 10) -/* Tx enabled driving last value driven, Rx enabled */ -#define PAD_CFG1_IOSSTATE_TxLASTRxE (0x0 << 0) -/* Tx enabled driving 0, Rx disabled and Rx driving 0 back to its controller - * internally */ -#define PAD_CFG1_IOSSTATE_Tx0RxDCRx0 (0x1 << 0) -/* Tx enabled driving 0, Rx disabled and Rx driving 1 back to its controller - * internally */ -#define PAD_CFG1_IOSSTATE_Tx0RXDCRx1 (0x2 << 0) -/* Tx enabled driving 1, Rx disabled and Rx driving 0 back to its controller - * internally */ -#define PAD_CFG1_IOSSTATE_Tx1RXDCRx0 (0x3 << 0) -/* Tx enabled driving 1, Rx disabled and Rx driving 1 back to its controller - * internally */ -#define PAD_CFG1_IOSSTATE_Tx1RxDCRx1 (0x4 << 0) -/* Tx enabled driving 0, Rx enabled */ -#define PAD_CFG1_IOSSTATE_Tx0RxE (0x5 << 0) -/* Tx enabled driving 1, Rx enabled */ -#define PAD_CFG1_IOSSTATE_Tx1RxE (0x6 << 0) -/* Hi-Z, Rx driving 0 back to its controller internally */ -#define PAD_CFG1_IOSSTATE_HIZCRx0 (0x7 << 0) -/* Hi-Z, Rx driving 1 back to its controller internally */ -#define PAD_CFG1_IOSSTATE_HIZCRx1 (0x8 << 0) -#define PAD_CFG1_IOSSTATE_TxDRxE (0x9 << 0) /* Tx disabled, Rx enabled */ -#define PAD_CFG1_IOSSTATE_IGNORE (0xf << 0) /* Ignore Iostandby */ -#define PAD_CFG1_IOSSTATE_MASK 0xf /* mask to extract Iostandby bits */ -#define PAD_CFG1_IOSSTATE_SHIFT 14 /* set Iostandby bits [17:14] */ - -#define PAD_CFG_BASE 0x500 -#define PAD_CFG_OFFSET(pad) (PAD_CFG_BASE + ((pad) * 8)) - -/* IOSF port numbers for GPIO comminuties*/ -#define GPIO_SW 0xc0 -#define GPIO_S 0xc2 -#define GPIO_NW 0xc4 -#define GPIO_N 0xc5 -#define GPIO_W 0xc7 - #define GPI_SMI_STS_0 0x140 #define GPI_SMI_EN_0 0x150 #define GPI_SMI_STS_OFFSET(group) (GPI_SMI_STS_0 + ((group) * 4)) #define GPI_SMI_EN_OFFSET(group) (GPI_SMI_EN_0 + ((group) * 4))
-#define NUM_N_PADS (PAD_N(SVID0_CLK) + 1) -#define NUM_NW_PADS (PAD_NW(GPIO_123) + 1) -#define NUM_W_PADS (PAD_W(SUSPWRDNACK) + 1) -#define NUM_SW_PADS (PAD_SW(LPC_FRAMEB) + 1) +/* PERST_0 not defined */ +#define GPIO_PRT0_UDEF 0xFF + +#define NUM_N_PADS (1) +#define NUM_NW_PADS (1) +#define NUM_W_PADS (1) +#define NUM_SW_PADS (1)
#define NUM_N_GPI_REGS \ (ALIGN_UP(NUM_N_PADS, GPIO_MAX_NUM_PER_GROUP) / GPIO_MAX_NUM_PER_GROUP) @@ -161,399 +497,9 @@ #define NUM_GPI_STATUS_REGS (NUM_N_GPI_REGS + NUM_NW_GPI_REGS \ + NUM_W_GPI_REGS + NUM_SW_GPI_REGS)
-/* North community pads */ -#define GPIO_0 0 -#define GPIO_1 1 -#define GPIO_2 2 -#define GPIO_3 3 -#define GPIO_4 4 -#define GPIO_5 5 -#define GPIO_6 6 -#define GPIO_7 7 -#define GPIO_8 8 -#define GPIO_9 9 -#define GPIO_10 10 -#define GPIO_11 11 -#define GPIO_12 12 -#define GPIO_13 13 -#define GPIO_14 14 -#define GPIO_15 15 -#define GPIO_16 16 -#define GPIO_17 17 -#define GPIO_18 18 -#define GPIO_19 19 -#define GPIO_20 20 -#define GPIO_21 21 -#define GPIO_22 22 -#define GPIO_23 23 -#define GPIO_24 24 -#define GPIO_25 25 -#define GPIO_26 26 -#define GPIO_27 27 -#define GPIO_28 28 -#define GPIO_29 29 -#define GPIO_30 30 -#define GPIO_31 31 -#define GPIO_32 32 -#define GPIO_33 33 -#define GPIO_34 34 -#define GPIO_35 35 -#define GPIO_36 36 -#define GPIO_37 37 -#define GPIO_38 38 -#define GPIO_39 39 -#define GPIO_40 40 -#define GPIO_41 41 -#define GPIO_42 42 -#define GPIO_43 43 -#define GPIO_44 44 -#define GPIO_45 45 -#define GPIO_46 46 -#define GPIO_47 47 -#define GPIO_48 48 -#define GPIO_49 49 -#define GPIO_62 50 -#define GPIO_63 51 -#define GPIO_64 52 -#define GPIO_65 53 -#define GPIO_66 54 -#define GPIO_67 55 -#define GPIO_68 56 -#define GPIO_69 57 -#define GPIO_70 58 -#define GPIO_71 59 -#define GPIO_72 60 -#define GPIO_73 61 -#define TCK 62 -#define TRST_B 63 -#define TMS 64 -#define TDI 65 -#define CX_PMODE 66 -#define CX_PREQ_B 67 -#define JTAGX 68 -#define CX_PRDY_B 69 -#define TDO 70 -#define CNV_BRI_DT 71 -#define CNV_BRI_RSP 72 -#define CNV_RGI_DT 73 -#define CNV_RGI_RSP 74 -#define SVID0_ALERT_B 75 -#define SVID0_DATA 76 -#define SVID0_CLK 77 - -/* Northwest community pads */ -#define GPIO_187 78 -#define GPIO_188 79 -#define GPIO_189 80 -#define GPIO_190 81 -#define GPIO_191 82 -#define GPIO_192 83 -#define GPIO_193 84 -#define GPIO_194 85 -#define GPIO_195 86 -#define GPIO_196 87 -#define GPIO_197 88 -#define GPIO_198 89 -#define GPIO_199 90 -#define GPIO_200 91 -#define GPIO_201 92 -#define GPIO_202 93 -#define GPIO_203 94 -#define GPIO_204 95 -#define PMC_SPI_FS0 96 -#define PMC_SPI_FS1 97 -#define PMC_SPI_FS2 98 -#define PMC_SPI_RXD 99 -#define PMC_SPI_TXD 100 -#define PMC_SPI_CLK 101 -#define PMIC_PWRGOOD 102 -#define PMIC_RESET_B 103 -#define GPIO_213 104 -#define GPIO_214 105 -#define GPIO_215 106 -#define PMIC_THERMTRIP_B 107 -#define PMIC_STDBY 108 -#define PROCHOT_B 109 -#define PMIC_I2C_SCL 110 -#define PMIC_I2C_SDA 111 -#define GPIO_74 112 -#define GPIO_75 113 -#define GPIO_76 114 -#define GPIO_77 115 -#define GPIO_78 116 -#define GPIO_79 117 -#define GPIO_80 118 -#define GPIO_81 119 -#define GPIO_82 120 -#define GPIO_83 121 -#define GPIO_84 122 -#define GPIO_85 123 -#define GPIO_86 124 -#define GPIO_87 125 -#define GPIO_88 126 -#define GPIO_89 127 -#define GPIO_90 128 -#define GPIO_91 129 -#define GPIO_92 130 -#define GPIO_97 131 -#define GPIO_98 132 -#define GPIO_99 133 -#define GPIO_100 134 -#define GPIO_101 135 -#define GPIO_102 136 -#define GPIO_103 137 -#define FST_SPI_CLK_FB 138 -#define GPIO_104 139 -#define GPIO_105 140 -#define GPIO_106 141 -#define GPIO_109 142 -#define GPIO_110 143 -#define GPIO_111 144 -#define GPIO_112 145 -#define GPIO_113 146 -#define GPIO_116 147 -#define GPIO_117 148 -#define GPIO_118 149 -#define GPIO_119 150 -#define GPIO_120 151 -#define GPIO_121 152 -#define GPIO_122 153 -#define GPIO_123 154 - -/* West community pads */ -#define GPIO_124 155 -#define GPIO_125 156 -#define GPIO_126 157 -#define GPIO_127 158 -#define GPIO_128 159 -#define GPIO_129 160 -#define GPIO_130 161 -#define GPIO_131 162 -#define GPIO_132 163 -#define GPIO_133 164 -#define GPIO_134 165 -#define GPIO_135 166 -#define GPIO_136 167 -#define GPIO_137 168 -#define GPIO_138 169 -#define GPIO_139 170 -#define GPIO_146 171 -#define GPIO_147 172 -#define GPIO_148 173 -#define GPIO_149 174 -#define GPIO_150 175 -#define GPIO_151 176 -#define GPIO_152 177 -#define GPIO_153 178 -#define GPIO_154 179 -#define GPIO_155 180 -#define GPIO_209 181 -#define GPIO_210 182 -#define GPIO_211 183 -#define GPIO_212 184 -#define OSC_CLK_OUT_0 185 -#define OSC_CLK_OUT_1 186 -#define OSC_CLK_OUT_2 187 -#define OSC_CLK_OUT_3 188 -#define OSC_CLK_OUT_4 189 -#define PMU_AC_PRESENT 190 -#define PMU_BATLOW_B 191 -#define PMU_PLTRST_B 192 -#define PMU_PWRBTN_B 193 -#define PMU_RESETBUTTON_B 194 -#define PMU_SLP_S0_B 195 -#define PMU_SLP_S3_B 196 -#define PMU_SLP_S4_B 197 -#define PMU_SUSCLK 198 -#define PMU_WAKE_B 199 -#define SUS_STAT_B 200 -#define SUSPWRDNACK 201 - -/* Southwest community pads */ -#define GPIO_205 202 -#define GPIO_206 203 -#define GPIO_207 204 -#define GPIO_208 205 -#define GPIO_156 206 -#define GPIO_157 207 -#define GPIO_158 208 -#define GPIO_159 209 -#define GPIO_160 210 -#define GPIO_161 211 -#define GPIO_162 212 -#define GPIO_163 213 -#define GPIO_164 214 -#define GPIO_165 215 -#define GPIO_166 216 -#define GPIO_167 217 -#define GPIO_168 218 -#define GPIO_169 219 -#define GPIO_170 220 -#define GPIO_171 221 -#define GPIO_172 222 -#define GPIO_179 223 -#define GPIO_173 224 -#define GPIO_174 225 -#define GPIO_175 226 -#define GPIO_176 227 -#define GPIO_177 228 -#define GPIO_178 229 -#define GPIO_186 230 -#define GPIO_182 231 -#define GPIO_183 232 -#define SMB_ALERTB 233 -#define SMB_CLK 234 -#define SMB_DATA 235 -#define LPC_ILB_SERIRQ 236 -#define LPC_CLKOUT0 237 -#define LPC_CLKOUT1 238 -#define LPC_AD0 239 -#define LPC_AD1 240 -#define LPC_AD2 241 -#define LPC_AD3 242 -#define LPC_CLKRUNB 243 -#define LPC_FRAMEB 244 +#define GPIO_18_IRQ 0x3C +#define GPIO_21_IRQ 0x3F
-/* PERST_0 not defined */ -#define GPIO_PRT0_UDEF 0xFF - -#define TOTAL_PADS 245 -#define N_OFFSET GPIO_0 -#define NW_OFFSET GPIO_187 -#define W_OFFSET GPIO_124 -#define SW_OFFSET GPIO_205 - -/* Macros for translating a global pad offset to a local offset */ -#define PAD_N(pad) (pad - N_OFFSET) -#define PAD_NW(pad) (pad - NW_OFFSET) -#define PAD_W(pad) (pad - W_OFFSET) -#define PAD_SW(pad) (pad - SW_OFFSET) - -/* Linux names of the GPIO devices. */ -#define GPIO_COMM_N_NAME "INT3452:00" #define GPIO_COMM_NW_NAME "INT3452:01" -#define GPIO_COMM_W_NAME "INT3452:02" -#define GPIO_COMM_SW_NAME "INT3452:03" - -/* Default configurations */ -#define PAD_CFG0_DEFAULT_FUNC(x) (PAD_CFG0_RESET_DEEP | PAD_CFG0_MODE_FUNC(x)) -#define PAD_CFG0_DEFAULT_NATIVE PAD_CFG0_DEFAULT_FUNC(1) - -#define PAD_CFG1_DEFAULT_PULLUP PAD_CFG1_PULL_UP_20K -#define PAD_CFG1_DEFAULT_NATIVE PAD_CFG1_PULL_NATIVE - -/* - * IOxAPIC IRQs for the GPIOs, overlap is expected as we encourage to use - * shared IRQ instead of direct IRQ, in case of overlapping, we can easily - * program one of the overlap to shared IRQ to avoid the conflict. - */ - -/* NorthWest community pads */ -#define PMIC_I2C_SDA_IRQ 0x32 -#define GPIO_74_IRQ 0x33 -#define GPIO_75_IRQ 0x34 -#define GPIO_76_IRQ 0x35 -#define GPIO_77_IRQ 0x36 -#define GPIO_78_IRQ 0x37 -#define GPIO_79_IRQ 0x38 -#define GPIO_80_IRQ 0x39 -#define GPIO_81_IRQ 0x3A -#define GPIO_82_IRQ 0x3B -#define GPIO_83_IRQ 0x3C -#define GPIO_84_IRQ 0x3D -#define GPIO_85_IRQ 0x3E -#define GPIO_86_IRQ 0x3F -#define GPIO_87_IRQ 0x40 -#define GPIO_88_IRQ 0x41 -#define GPIO_89_IRQ 0x42 -#define GPIO_90_IRQ 0x43 -#define GPIO_91_IRQ 0x44 -#define GPIO_97_IRQ 0x49 -#define GPIO_98_IRQ 0x4A -#define GPIO_99_IRQ 0x4B -#define GPIO_100_IRQ 0x4C -#define GPIO_101_IRQ 0x4D -#define GPIO_102_IRQ 0x4E -#define GPIO_103_IRQ 0x4F -#define GPIO_104_IRQ 0x50 -#define GPIO_105_IRQ 0x51 -#define GPIO_106_IRQ 0x52 -#define GPIO_109_IRQ 0x54 -#define GPIO_110_IRQ 0x55 -#define GPIO_111_IRQ 0x56 -#define GPIO_112_IRQ 0x57 -#define GPIO_113_IRQ 0x58 -#define GPIO_116_IRQ 0x5B -#define GPIO_117_IRQ 0x5C -#define GPIO_118_IRQ 0x5D -#define GPIO_119_IRQ 0x5E -#define GPIO_120_IRQ 0x5F -#define GPIO_121_IRQ 0x60 -#define GPIO_122_IRQ 0x61 -#define GPIO_123_IRQ 0x62 - -/* North community pads */ -#define GPIO_0_IRQ 0x63 -#define GPIO_1_IRQ 0x64 -#define GPIO_2_IRQ 0x65 -#define GPIO_3_IRQ 0x66 -#define GPIO_4_IRQ 0x67 -#define GPIO_5_IRQ 0x68 -#define GPIO_6_IRQ 0x69 -#define GPIO_7_IRQ 0x6A -#define GPIO_8_IRQ 0x6B -#define GPIO_9_IRQ 0x6C -#define GPIO_10_IRQ 0x6D -#define GPIO_11_IRQ 0x6E -#define GPIO_12_IRQ 0x6F -#define GPIO_13_IRQ 0x6F -#define GPIO_14_IRQ 0x71 -#define GPIO_15_IRQ 0x72 -#define GPIO_16_IRQ 0x73 -#define GPIO_17_IRQ 0x74 -#define GPIO_18_IRQ 0x75 -#define GPIO_19_IRQ 0x76 -#define GPIO_20_IRQ 0x77 -#define GPIO_21_IRQ 0x32 -#define GPIO_22_IRQ 0x33 -#define GPIO_23_IRQ 0x34 -#define GPIO_24_IRQ 0x35 -#define GPIO_25_IRQ 0x36 -#define GPIO_26_IRQ 0x37 -#define GPIO_27_IRQ 0x38 -#define GPIO_28_IRQ 0x39 -#define GPIO_29_IRQ 0x3A -#define GPIO_30_IRQ 0x3B -#define GPIO_31_IRQ 0x3C -#define GPIO_32_IRQ 0x3D -#define GPIO_33_IRQ 0x3E -#define GPIO_34_IRQ 0x3F -#define GPIO_35_IRQ 0x40 -#define GPIO_36_IRQ 0x41 -#define GPIO_37_IRQ 0x42 -#define GPIO_38_IRQ 0x43 -#define GPIO_39_IRQ 0x44 -#define GPIO_40_IRQ 0x45 -#define GPIO_41_IRQ 0x46 -#define GPIO_42_IRQ 0x47 -#define GPIO_43_IRQ 0x48 -#define GPIO_44_IRQ 0x49 -#define GPIO_45_IRQ 0x4A -#define GPIO_46_IRQ 0x4B -#define GPIO_47_IRQ 0x4C -#define GPIO_48_IRQ 0x4D -#define GPIO_49_IRQ 0x4E -#define GPIO_62_IRQ 0x5B -#define GPIO_63_IRQ 0x5C -#define GPIO_64_IRQ 0x5D -#define GPIO_65_IRQ 0x5E -#define GPIO_66_IRQ 0x5F -#define GPIO_67_IRQ 0x60 -#define GPIO_68_IRQ 0x61 -#define GPIO_69_IRQ 0x62 -#define GPIO_70_IRQ 0x63 -#define GPIO_71_IRQ 0x64 -#define GPIO_72_IRQ 0x65 -#define GPIO_73_IRQ 0x66 - +#define PAD_NW(pad) 0 #endif /* _SOC_GLK_GPIO_DEFS_H_ */ diff --git a/src/soc/intel/glk/uart_early.c b/src/soc/intel/glk/uart_early.c index ea7d902..6e62e6a 100644 --- a/src/soc/intel/glk/uart_early.c +++ b/src/soc/intel/glk/uart_early.c @@ -69,18 +69,19 @@ uintptr_t uart_platform_base(int idx) }
static const struct pad_config uart_gpios[] = { + GLK_GPIO_PAD_CONF("LPSS_UART2_RXD", GPIO_64, M1, NA, NA, NA, NA, + NA, P_20K_H, NA, NA, NA, NA, NA, GPIO_NORTHWEST), + GLK_GPIO_PAD_CONF("LPSS_UART2_TXD", GPIO_65, M1, NA, NA, NA, NA, + NA, P_20K_H, NA, NA, NA, NA, NA, GPIO_NORTHWEST), };
void soc_console_uart_init(void) { - /* Get a 0-based pad index. See invalid_uart_for_console() above. */ - //const int pad_index = CONFIG_UART_FOR_CONSOLE - 1; - if (invalid_uart_for_console()) return;
/* Configure the 2 pads per UART. */ - //gpio_configure_pads(&uart_gpios[pad_index * 2], 2); + gpio_configure_pads(&uart_gpios[0], ARRAY_SIZE(uart_gpios));
lpss_console_uart_init(); }