summaryrefslogtreecommitdiff
path: root/src/mainboard/google/slippy
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@chromium.org>2013-05-24 11:27:12 -0700
committerStefan Reinauer <stefan.reinauer@coreboot.org>2013-11-25 23:45:44 +0100
commitd67c5dbf06f009b705bc0c2b7278504bb538d36e (patch)
treefe910094ccb42e0f275489d34704e68f12233cbc /src/mainboard/google/slippy
parent14031db21f3a41966a30bfc27bc97ddf03f40458 (diff)
slippy: Add on-board devices and configure GPIO irq/wake
Add the onboard I2C devices for Slippy 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. tested on slippy with trackpad with additional kernel changes to chromeos_laptop.c to initialize devices. 1) Ensure trackpad interrupt is functional and that there is not a flood of ACPI SCI when trackpad does interrupt: 9: 1 0 0 0 IO-APIC-fasteoi acpi 37: 421 0 0 0 IO-APIC-fasteoi cyapa 2) Ensure that devices are exposed as wake capable: Device S-state Status Sysfs node TPAD S3 *enabled pnp:00:00 TSCR S3 *disabled pnp:00:01 3) Ensure that trackpad can wake from S3 by default, but that it does not cause an immediate wake when entering suspend. 4) Ensure that trackpad can be disabled as a wake source with echo TPAD > /proc/acpi/wakeup Change-Id: Id562d20b54eeefec56040b8f70ef238911312628 Signed-off-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/56622 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/4190 Reviewed-by: Ronald G. Minnich <rminnich@gmail.com> Tested-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src/mainboard/google/slippy')
-rw-r--r--src/mainboard/google/slippy/acpi/mainboard.asl72
-rw-r--r--src/mainboard/google/slippy/gpio.h12
-rw-r--r--src/mainboard/google/slippy/mainboard.c38
-rw-r--r--src/mainboard/google/slippy/onboard.h40
4 files changed, 156 insertions, 6 deletions
diff --git a/src/mainboard/google/slippy/acpi/mainboard.asl b/src/mainboard/google/slippy/acpi/mainboard.asl
index 948d7dfe87..0047772729 100644
--- a/src/mainboard/google/slippy/acpi/mainboard.asl
+++ b/src/mainboard/google/slippy/acpi/mainboard.asl
@@ -19,6 +19,8 @@
* MA 02110-1301 USA
*/
+#include <mainboard/google/slippy/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/slippy/gpio.h b/src/mainboard/google/slippy/gpio.h
index 7fb670b4c6..4b557ce3ae 100644
--- a/src/mainboard/google/slippy/gpio.h
+++ b/src/mainboard/google/slippy/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_IRQ_EDGE, /* 12: TRACKPAD_INT_L */
+ 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_IRQ_EDGE, /* 25: TOUCH_INT_L */
+ 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_OUT_LOW, /* 49: PP3300_SSD_IO_EN (iSSD VCC_IO) */
LP_GPIO_UNUSED, /* 50: UNUSED */
- LP_GPIO_IRQ_EDGE, /* 51: ALS_INT_L */
- LP_GPIO_IRQ_EDGE, /* 52: SIM_DET */
- LP_GPIO_ACPI_SCI, /* 53: TRACKPAD_INT_DX (WAKE) */
- LP_GPIO_ACPI_SCI, /* 54: TOUCH_INT_L_DX (WAKE) */
+ 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_OUT_HIGH, /* 57: PP3300_CCD_EN */
diff --git a/src/mainboard/google/slippy/mainboard.c b/src/mainboard/google/slippy/mainboard.c
index 0159bd0b6c..3bf26e3f21 100644
--- a/src/mainboard/google/slippy/mainboard.c
+++ b/src/mainboard/google/slippy/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/slippy/onboard.h b/src/mainboard/google/slippy/onboard.h
new file mode 100644
index 0000000000..23e8f1e062
--- /dev/null
+++ b/src/mainboard/google/slippy/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