mb/google/volteer: Make touchpad wake user-selectable via CFR

Add CFR option "touchpad_wake" (default: false) to allow users to
enable touchpad wake from sleep. Wake is disabled by default to
prevent random wakeups when systems are moved while sleeping.

Implementation:
- Add touchpad_wake CFR option to System form
- Add device alias "touchpad" to variant devicetree files
  (add touchpad2 where a 2nd touchpad option is present)
- Update variant GPIO configs to support wake capability
  (this was set inconsistently)
- Conditionally disable wake in ramstage based on CFR option

When the option is disabled (default), config->wake and
config->irq.wake are set to 0, preventing the touchpad ACPI device
from defining wake methods and capability.

TEST_1: Build for ELDRID, boot system into mainlinue Linux (Fedora).
Close the lid to suspend the system, firmly grab it with both hands and
jump 10 times. Make sure that system doesn't wake up from sleep state.

TEST_2: Build for DROBIT, boot system into mainline Linux (NixOS).
Close the lid to suspend the system, firmly grab it with both hands and
jump few times. Make sure that system doesn't wake up from sleep state.

Tested-by: Ingo Reitz <9l@9lo.re>
Change-Id: Ie3b5013bcf2d5ea45388bcdce987dd9ae5870597
Co-authored-by: Alicja Michalska <alicja.michalska@9elements.com>
Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/90500
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Alicja Michalska <ahplka19@gmail.com>
This commit is contained in:
Matt DeVillier 2025-12-16 19:34:48 -06:00
commit 8ed87f71ec
23 changed files with 70 additions and 23 deletions

View file

@ -7,6 +7,19 @@
#include <intelblocks/cfr.h>
#include <soc/cfr.h>
static const struct sm_object touchpad_wake = SM_DECLARE_ENUM({
.opt_name = "touchpad_wake",
.ui_name = "Touchpad Wake",
.ui_helptext = "Enable or disable touchpad wake from sleep.\n"
"Disabled by default to prevent random wakeups when\n"
"the system is moved while sleeping.",
.default_value = 0,
.values = (const struct sm_enum_value[]) {
{ "Disabled", 0 },
{ "Enabled", 1 },
SM_ENUM_VALUE_END },
});
static struct sm_obj_form system = {
.ui_name = "System",
.obj_list = (const struct sm_object *[]) {
@ -21,6 +34,7 @@ static struct sm_obj_form system = {
&pciexp_l1ss,
&pciexp_speed,
&s0ix_enable,
&touchpad_wake,
&vtd,
NULL
},

View file

@ -4,10 +4,12 @@
#include <baseboard/variants.h>
#include <device/device.h>
#include <drivers/tpm/cr50.h>
#include <drivers/i2c/generic/chip.h>
#include <ec/ec.h>
#include <fw_config.h>
#include <gpio.h>
#include <intelblocks/gpio.h>
#include <option.h>
#include <security/tpm/tss.h>
#include <intelblocks/tcss.h>
#include <soc/pci_devs.h>
@ -16,10 +18,13 @@
#include <stdio.h>
#include <variant/gpio.h>
#include <vb2_api.h>
#include <static.h>
#include "drivers/intel/pmc_mux/conn/chip.h"
WEAK_DEV_PTR(conn1);
WEAK_DEV_PTR(touchpad);
WEAK_DEV_PTR(touchpad2);
static void typec_orientation_fixup(void)
{
@ -74,12 +79,40 @@ static void mainboard_smbios_strings(struct device *dev, struct smbios_type11 *t
fw_config_for_each_found(add_fw_config_oem_string, t);
}
static void update_touchpad_wake_config(const struct device *touchpad)
{
if (!touchpad || !touchpad->chip_info || !is_dev_enabled(touchpad))
return;
/* Check CFR option for touchpad wake */
unsigned int touchpad_wake_enabled = get_uint_option("touchpad_wake", 0);
printk(BIOS_DEBUG, "Touchpad wake: %s\n", touchpad_wake_enabled?"enabled":"disabled");
/* Modify devicetree config directly */
struct drivers_i2c_generic_config *config =
(struct drivers_i2c_generic_config *)touchpad->chip_info;
if (!touchpad_wake_enabled) {
/* Disable wake GPE and wake flag in IRQ descriptor */
config->wake = 0;
config->irq.wake = 0;
/* Reconfigure GPIO pad to remove wake capability */
const struct pad_config touchpad_gpio[] = {
PAD_CFG_GPI_APIC(GPP_E15, NONE, PLTRST, LEVEL, INVERT),
};
gpio_configure_pads(touchpad_gpio, ARRAY_SIZE(touchpad_gpio));
}
}
static void mainboard_enable(struct device *dev)
{
dev->ops->init = mainboard_init;
dev->ops->get_smbios_strings = mainboard_smbios_strings;
variant_ramstage_init();
update_touchpad_wake_config(DEV_PTR(touchpad));
update_touchpad_wake_config(DEV_PTR(touchpad2));
}
void mainboard_update_soc_chip_config(struct soc_intel_tigerlake_config *cfg)

View file

@ -242,7 +242,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref pch_espi on

View file

@ -157,7 +157,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on
device i2c 15 alias touchpad on
probe TOUCHPAD REGULAR_TOUCHPAD
end
end
@ -168,7 +168,7 @@ chip soc/intel/tigerlake
register "generic.wake" = "GPE0_DW2_15"
register "generic.detect" = "1"
register "hid_desc_reg_offset" = "0x01"
device i2c 15 on
device i2c 15 alias touchpad2 on
probe TOUCHPAD NUMPAD_TOUCHPAD
end
end

View file

@ -184,7 +184,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on
device i2c 15 alias touchpad on
probe TOUCHPAD REGULAR_TOUCHPAD
end
end
@ -195,7 +195,7 @@ chip soc/intel/tigerlake
register "generic.wake" = "GPE0_DW2_15"
register "generic.detect" = "1"
register "hid_desc_reg_offset" = "0x01"
device i2c 15 on
device i2c 15 alias touchpad2 on
probe TOUCHPAD NUMPAD_TOUCHPAD
end
end

View file

@ -176,7 +176,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref pch_espi on

View file

@ -186,7 +186,7 @@ chip soc/intel/tigerlake
register "generic.wake" = "GPE0_DW2_15"
register "generic.detect" = "1"
register "hid_desc_reg_offset" = "0x01"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref pch_espi on

View file

@ -148,7 +148,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref pch_espi on

View file

@ -243,7 +243,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref pch_espi on

View file

@ -93,7 +93,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref hda on end

View file

@ -240,7 +240,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
chip drivers/i2c/hid
register "generic.hid" = ""SYNA0000""

View file

@ -72,7 +72,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref hda on

View file

@ -112,7 +112,7 @@ chip soc/intel/tigerlake
register "generic.wake" = "GPE0_DW2_15"
register "generic.detect" = "1"
register "hid_desc_reg_offset" = "0x01"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref pch_espi on

View file

@ -124,7 +124,7 @@ chip soc/intel/tigerlake
register "generic.wake" = "GPE0_DW2_15"
register "generic.detect" = "1"
register "hid_desc_reg_offset" = "0x01"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref pch_espi on

View file

@ -128,7 +128,7 @@ static const struct pad_config override_gpio_table[] = {
/* E12 : SPI1_MISO_IO1 ==> PEN_OC_ODL */
PAD_CFG_GPI(GPP_E12, NONE, DEEP),
/* E15 : ISH_GP6 ==> TRACKPAD_INT_ODL */
PAD_CFG_GPI_APIC(GPP_E15, NONE, PLTRST, LEVEL, INVERT),
PAD_CFG_GPI_IRQ_WAKE(GPP_E15, NONE, PLTRST, LEVEL, INVERT),
/* E16 : ISH_GP7 ==> WWAN_SIM1_DET_OD */
PAD_CFG_GPI(GPP_E16, NONE, DEEP),
/* E17 : THC0_SPI1_INT# ==> WWAN_PERST_L */

View file

@ -65,7 +65,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref north_xhci on

View file

@ -69,7 +69,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref pch_espi on

View file

@ -128,7 +128,7 @@ static const struct pad_config override_gpio_table[] = {
/* E12 : SPI1_MISO_IO1 ==> PEN_OC_ODL */
PAD_CFG_GPI(GPP_E12, NONE, DEEP),
/* E15 : ISH_GP6 ==> TRACKPAD_INT_ODL */
PAD_CFG_GPI_APIC(GPP_E15, NONE, PLTRST, LEVEL, INVERT),
PAD_CFG_GPI_IRQ_WAKE(GPP_E15, NONE, PLTRST, LEVEL, INVERT),
/* E16 : ISH_GP7 ==> WWAN_SIM1_DET_OD */
PAD_CFG_GPI(GPP_E16, NONE, DEEP),
/* E17 : THC0_SPI1_INT# ==> WWAN_PERST_L */

View file

@ -107,7 +107,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
chip drivers/i2c/hid
register "generic.hid" = ""SYNA0000""

View file

@ -174,7 +174,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref hda on

View file

@ -233,7 +233,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
end
device ref hda on

View file

@ -128,7 +128,7 @@ static const struct pad_config override_gpio_table[] = {
/* E12 : SPI1_MISO_IO1 ==> PEN_OC_ODL */
PAD_CFG_GPI(GPP_E12, NONE, DEEP),
/* E15 : ISH_GP6 ==> TRACKPAD_INT_ODL */
PAD_CFG_GPI_APIC(GPP_E15, NONE, PLTRST, LEVEL, INVERT),
PAD_CFG_GPI_IRQ_WAKE(GPP_E15, NONE, PLTRST, LEVEL, INVERT),
/* E16 : ISH_GP7 ==> WWAN_SIM1_DET_OD */
PAD_CFG_GPI(GPP_E16, NONE, DEEP),
/* E17 : THC0_SPI1_INT# ==> WWAN_PERST_L */

View file

@ -200,7 +200,7 @@ chip soc/intel/tigerlake
register "irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_E15_IRQ)"
register "wake" = "GPE0_DW2_15"
register "detect" = "1"
device i2c 15 on end
device i2c 15 alias touchpad on end
end
chip drivers/i2c/hid
register "generic.hid" = ""SYNA0000""