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:
parent
7e1962a3cc
commit
8ed87f71ec
23 changed files with 70 additions and 23 deletions
|
|
@ -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
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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""
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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""
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue