[coreboot-gerrit] New patch to review for coreboot: b924979 falco: Add on-board devices and configure GPIO irq/wake

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Tue Nov 19 01:19:38 CET 2013


Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4191

-gerrit

commit b924979644ec270cd3678eb8f1dfdc3c30e9ea7d
Author: Duncan Laurie <dlaurie at chromium.org>
Date:   Fri May 24 12:37:02 2013 -0700

    falco: Add on-board devices and configure GPIO irq/wake
    
    Add the onboard I2C devices for Falco trackpad/lightsensor
    and generate SMBIOS Type41 tables for them.
    
    Add ACPI device for the trackpad to expose the interrupt map
    to the OS so it can be used.
    
    Configure interrupt GPIOs as PIRQ type and wake GPIOs as
    just standard input type.  The wake GPIO is reconfigured as
    ACPI SCI in the specific device _DSW method.  This prevents
    the wake GPIO from generating a flood of SCI at runtime.
    
    LTE_WAKE_L_Q and WLAN_WAKE_L_Q are left as ACPI SCI as these
    are not repurposed interrupt pins so they are not generated
    at runtime.
    
    SIM_DET and ALS_INT_L are set as input since we don't have an
    interrupt handler for them.
    
    Change-Id: Ibe9687b2f7f41ead18353c3f650219fe6e94ae2f
    Signed-off-by: Duncan Laurie <dlaurie at chromium.org>
    Reviewed-on: https://gerrit.chromium.org/gerrit/56632
    Reviewed-by: Aaron Durbin <adurbin at chromium.org>
---
 src/mainboard/google/falco/acpi/mainboard.asl | 72 +++++++++++++++++++++++++++
 src/mainboard/google/falco/gpio.h             | 12 ++---
 src/mainboard/google/falco/mainboard.c        | 38 ++++++++++++++
 src/mainboard/google/falco/onboard.h          | 40 +++++++++++++++
 4 files changed, 156 insertions(+), 6 deletions(-)

diff --git a/src/mainboard/google/falco/acpi/mainboard.asl b/src/mainboard/google/falco/acpi/mainboard.asl
index 948d7df..f9bcc12 100644
--- a/src/mainboard/google/falco/acpi/mainboard.asl
+++ b/src/mainboard/google/falco/acpi/mainboard.asl
@@ -19,6 +19,8 @@
  * MA 02110-1301 USA
  */
 
+#include <mainboard/google/falco/onboard.h>
+
 Scope (\_SB)
 {
 	Device (LID0)
@@ -35,4 +37,74 @@ Scope (\_SB)
 	{
 		Name(_HID, EisaId("PNP0C0C"))
 	}
+
+	Device (TPAD)
+	{
+		Name (_ADR, 0x0)
+		Name (_UID, 1)
+
+		// Report as a Sleep Button device so Linux will
+		// automatically enable it as a wake source
+		Name (_HID, EisaId("PNP0C0E"))
+
+		Name (_CRS, ResourceTemplate()
+		{
+			Interrupt (ResourceConsumer, Level, ActiveLow)
+			{
+				BOARD_TRACKPAD_IRQ
+			}
+
+			VendorShort (ADDR)
+			{
+				BOARD_TRACKPAD_I2C_ADDR
+			}
+		})
+
+		Name (_PRW, Package() { BOARD_TRACKPAD_WAKE_GPIO, 0x3 })
+
+		Method (_DSW, 3, NotSerialized)
+		{
+			Store (BOARD_TRACKPAD_WAKE_GPIO, Local0)
+
+			If (LEqual (Arg0, 1)) {
+				// Enable GPIO as wake source
+				\_SB.PCI0.LPCB.GWAK (Local0)
+			}
+		}
+	}
+
+	Device (TSCR)
+	{
+		Name (_ADR, 0x0)
+		Name (_UID, 2)
+
+		// Report as a Sleep Button device so Linux will
+		// automatically enable it as a wake source
+		Name (_HID, EisaId("PNP0C0E"))
+
+		Name (_CRS, ResourceTemplate()
+		{
+			Interrupt (ResourceConsumer, Level, ActiveLow)
+			{
+				BOARD_TOUCHSCREEN_IRQ
+			}
+
+			VendorShort (ADDR)
+			{
+				BOARD_TOUCHSCREEN_I2C_ADDR
+			}
+		})
+
+		Name (_PRW, Package() { BOARD_TOUCHSCREEN_WAKE_GPIO, 0x3 })
+
+		Method (_DSW, 3, NotSerialized)
+		{
+			Store (BOARD_TOUCHSCREEN_WAKE_GPIO, Local0)
+
+			If (LEqual (Arg0, 1)) {
+				// Enable GPIO as wake source
+				\_SB.PCI0.LPCB.GWAK (Local0)
+			}
+		}
+	}
 }
diff --git a/src/mainboard/google/falco/gpio.h b/src/mainboard/google/falco/gpio.h
index ce97bf1..037ddcb 100644
--- a/src/mainboard/google/falco/gpio.h
+++ b/src/mainboard/google/falco/gpio.h
@@ -35,7 +35,7 @@ const struct pch_lp_gpio_map mainboard_gpio_map[] = {
 	LP_GPIO_INPUT,         /* 9: RAM_ID1 */
 	LP_GPIO_ACPI_SCI,      /* 10: WLAN_WAKE_L_Q */
 	LP_GPIO_UNUSED,        /* 11: UNUSED */
-	LP_GPIO_ACPI_SCI,      /* 12: TRACKPAD_INT_L (WAKE) */
+	LP_GPIO_INPUT,         /* 12: TRACKPAD_INT_L (WAKE) */
 	LP_GPIO_INPUT,         /* 13: RAM_ID0 */
 	LP_GPIO_INPUT,         /* 14: EC_IN_RW */
 	LP_GPIO_UNUSED,        /* 15: UNUSED (STRAP) */
@@ -48,7 +48,7 @@ const struct pch_lp_gpio_map mainboard_gpio_map[] = {
 	LP_GPIO_UNUSED,        /* 22: UNUSED */
 	LP_GPIO_UNUSED,        /* 23: UNUSED */
 	LP_GPIO_UNUSED,        /* 24: UNUSED */
-	LP_GPIO_ACPI_SCI,      /* 25: TOUCH_INT_L (WAKE) */
+	LP_GPIO_INPUT,         /* 25: TOUCH_INT_L (WAKE) */
 	LP_GPIO_UNUSED,        /* 26: UNUSED */
 	LP_GPIO_UNUSED,        /* 27: UNUSED */
 	LP_GPIO_UNUSED,        /* 28: UNUSED */
@@ -74,10 +74,10 @@ const struct pch_lp_gpio_map mainboard_gpio_map[] = {
 	LP_GPIO_UNUSED,        /* 48: UNUSED */
 	LP_GPIO_UNUSED,        /* 49: UNUSED */
 	LP_GPIO_UNUSED,        /* 50: UNUSED */
-	LP_GPIO_IRQ_EDGE,      /* 51: ALS_INT_L */
-	LP_GPIO_IRQ_EDGE,      /* 52: SIM_DET */
-	LP_GPIO_IRQ_EDGE,      /* 53: TRACKPAD_INT_DX */
-	LP_GPIO_IRQ_EDGE,      /* 54: TOUCH_INT_L_DX */
+	LP_GPIO_INPUT,         /* 51: ALS_INT_L */
+	LP_GPIO_INPUT,         /* 52: SIM_DET */
+	LP_GPIO_PIRQ,          /* 53: TRACKPAD_INT_DX (PIRQV) */
+	LP_GPIO_PIRQ,          /* 54: TOUCH_INT_L_DX (PIRQW) */
 	LP_GPIO_UNUSED,        /* 55: UNUSED */
 	LP_GPIO_UNUSED,        /* 56: UNUSED */
 	LP_GPIO_UNUSED,        /* 57: UNUSED */
diff --git a/src/mainboard/google/falco/mainboard.c b/src/mainboard/google/falco/mainboard.c
index 0159bd0..3bf26e3 100644
--- a/src/mainboard/google/falco/mainboard.c
+++ b/src/mainboard/google/falco/mainboard.c
@@ -20,6 +20,7 @@
 
 #include <types.h>
 #include <string.h>
+#include <smbios.h>
 #include <device/device.h>
 #include <device/device.h>
 #include <device/pci_def.h>
@@ -36,6 +37,7 @@
 #include "hda_verb.h"
 #include <southbridge/intel/lynxpoint/pch.h>
 #include "ec.h"
+#include "onboard.h"
 
 void mainboard_suspend_resume(void)
 {
@@ -145,12 +147,48 @@ static void mainboard_init(device_t dev)
 	mainboard_ec_init();
 }
 
+static int mainboard_smbios_data(device_t dev, int *handle,
+				 unsigned long *current)
+{
+	int len = 0;
+
+	len += smbios_write_type41(
+		current, handle,
+		BOARD_LIGHTSENSOR_NAME,		/* name */
+		BOARD_LIGHTSENSOR_IRQ,		/* instance */
+		BOARD_LIGHTSENSOR_I2C_BUS,	/* segment */
+		BOARD_LIGHTSENSOR_I2C_ADDR,	/* bus */
+		0,				/* device */
+		0);				/* function */
+
+	len += smbios_write_type41(
+		current, handle,
+		BOARD_TRACKPAD_NAME,		/* name */
+		BOARD_TRACKPAD_IRQ,		/* instance */
+		BOARD_TRACKPAD_I2C_BUS,		/* segment */
+		BOARD_TRACKPAD_I2C_ADDR,	/* bus */
+		0,				/* device */
+		0);				/* function */
+
+	len += smbios_write_type41(
+		current, handle,
+		BOARD_TOUCHSCREEN_NAME,		/* name */
+		BOARD_TOUCHSCREEN_IRQ,		/* instance */
+		BOARD_TOUCHSCREEN_I2C_BUS,	/* segment */
+		BOARD_TOUCHSCREEN_I2C_ADDR,	/* bus */
+		0,				/* device */
+		0);				/* function */
+
+	return len;
+}
+
 // mainboard_enable is executed as first thing after
 // enumerate_buses().
 
 static void mainboard_enable(device_t dev)
 {
 	dev->ops->init = mainboard_init;
+	dev->ops->get_smbios_data = mainboard_smbios_data;
 #if CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN
 	/* Install custom int15 handler for VGA OPROM */
 	mainboard_interrupt_handlers(0x15, &int15_handler);
diff --git a/src/mainboard/google/falco/onboard.h b/src/mainboard/google/falco/onboard.h
new file mode 100644
index 0000000..23e8f1e
--- /dev/null
+++ b/src/mainboard/google/falco/onboard.h
@@ -0,0 +1,40 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2012 Google Inc.
+ *
+ * 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
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef ONBOARD_H
+#define ONBOARD_H
+
+#define BOARD_LIGHTSENSOR_NAME		"lightsensor"
+#define BOARD_LIGHTSENSOR_IRQ		51	/* PIRQT */
+#define BOARD_LIGHTSENSOR_I2C_BUS	2	/* I2C1 */
+#define BOARD_LIGHTSENSOR_I2C_ADDR	0x44
+
+#define BOARD_TRACKPAD_NAME		"trackpad"
+#define BOARD_TRACKPAD_IRQ		37	/* PIRQV */
+#define BOARD_TRACKPAD_WAKE_GPIO	12	/* GPIO12 */
+#define BOARD_TRACKPAD_I2C_BUS		1	/* I2C0 */
+#define BOARD_TRACKPAD_I2C_ADDR		0x67
+
+#define BOARD_TOUCHSCREEN_NAME		"touchscreen"
+#define BOARD_TOUCHSCREEN_IRQ		38	/* PIRQW */
+#define BOARD_TOUCHSCREEN_WAKE_GPIO	25	/* GPIO25 */
+#define BOARD_TOUCHSCREEN_I2C_BUS	2	/* I2C1 */
+#define BOARD_TOUCHSCREEN_I2C_ADDR	0x4a
+
+#endif



More information about the coreboot-gerrit mailing list