[coreboot-gerrit] New patch to review for coreboot: soc/glk: Add gpio initialization

Hannah Williams (hannah.williams@intel.com) gerrit at coreboot.org
Tue Dec 13 04:39:18 CET 2016


Hannah Williams (hannah.williams at intel.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/17817

-gerrit

commit 789d649b069e197b3126d5a7cbb77921c512c89c
Author: Hannah Williams <hannah.williams at intel.com>
Date:   Mon Oct 10 15:08:55 2016 -0700

    soc/glk: Add gpio initialization
    
    Change-Id: I8d03c7091880bc67e7896856234ddfe0290d397f
    Signed-off-by: Hannah Williams <hannah.williams at 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 at 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();
 }



More information about the coreboot-gerrit mailing list