diff options
author | Furquan Shaikh <furquan@google.com> | 2020-06-26 01:19:46 -0700 |
---|---|---|
committer | Furquan Shaikh <furquan@google.com> | 2020-06-28 05:22:41 +0000 |
commit | fa8b75fb17ccd739d3e08a184a014d7dca35d3ce (patch) | |
tree | d9bc98cda8ff0829a7a589810ffae05a441c1625 | |
parent | 490473edec3817902c0fff0d6635ac9bbb58bac2 (diff) |
gpio_keys: Allow boards to configure different wakeup routes
This change allows mainboard to configure different wakeup routes that
can be used by a GPIO key:
1. SCI: This is selected when SCI route is used to wake the system. It
results in _PRW property being exposed in ACPI tables.
2. GPIO IRQ: This is selected when GPIO controller wake is used to
wake the system. It is typically used when the input signal is not
dual routed and the GPIO controller block is not capable of applying
filters for IRQ and wake separately. In this case, _PRW is not exposed
in ACPI tables for the key device.
3. Disabled: No wakeup supported.
Based on these wakeup routes, gpio_keys_add_child_node() is updated to
expose _PRW and _DSD properties for wakeup appropriately.
Additionally, the change updates mainboards that were already using
gpio_keys to set wakeup_route attribute correctly and renames "wake"
to "wake_gpe" to make the usage clear.
BUG=b:159942427
Change-Id: Ib32b866b5f0ca559ed680b46218454bdfd8c6457
Signed-off-by: Furquan Shaikh <furquan@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/42826
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
13 files changed, 50 insertions, 12 deletions
diff --git a/src/drivers/generic/gpio_keys/chip.h b/src/drivers/generic/gpio_keys/chip.h index 7bc5007df3..a2ff59dc73 100644 --- a/src/drivers/generic/gpio_keys/chip.h +++ b/src/drivers/generic/gpio_keys/chip.h @@ -24,6 +24,28 @@ enum { EV_ACT_DEASSERTED, }; +enum { + /* + * GPIO key uses SCI route to wake the system from suspend state. This is typically used + * when the input line is dual routed i.e. one for IRQ and other for SCI or if the GPIO + * controller is capable of handling the filtering for IRQ and SCI separately. This + * requires "wake" property to be provided by the board which represents the GPE # for + * wake. It is exposed as _PRW in ACPI tables. + */ + WAKEUP_ROUTE_SCI, + /* + * GPIO key uses GPIO controller IRQ route for wake. This is used when IRQ and wake are + * routed to the same pad and the GPIO controller is not capable of handling the trigger + * filtering separately for IRQ and wake. Kernel driver for gpio-keys takes care of + * reconfiguring the IRQ trigger as both edges when used in S0 and the edge requested by + * BIOS (as per wakeup_event_action) when entering suspend. In this case, _PRW is not + * exposed for the key device. + */ + WAKEUP_ROUTE_GPIO_IRQ, + /* GPIO key does not support wake. */ + WAKEUP_ROUTE_DISABLED, +}; + /* Details of the child node defining key */ struct key_info { /* Device name of the child node - Mandatory */ @@ -37,8 +59,10 @@ struct key_info { uint32_t linux_input_type; /* Descriptive name of the key */ const char *label; - /* Wake GPE */ - unsigned int wake; + /* Wakeup route (if any) for the key. See WAKEUP_ROUTE_* macros above. */ + unsigned int wakeup_route; + /* Wake GPE -- SCI GPE # for wake. Required for WAKEUP_ROUTE_SCI. */ + unsigned int wake_gpe; /* Trigger for Wakeup Event Action as defined in EV_ACT_* enum */ unsigned int wakeup_event_action; /* Can this key be disabled? */ diff --git a/src/drivers/generic/gpio_keys/gpio_keys.c b/src/drivers/generic/gpio_keys/gpio_keys.c index 693fbb54de..f9d71876fa 100644 --- a/src/drivers/generic/gpio_keys/gpio_keys.c +++ b/src/drivers/generic/gpio_keys/gpio_keys.c @@ -26,9 +26,12 @@ static struct acpi_dp *gpio_keys_add_child_node( key->linux_input_type); if (key->label) acpi_dp_add_string(dsd, "label", key->label); - if (key->wake) { + + if (key->wakeup_route == WAKEUP_ROUTE_SCI) + acpigen_write_PRW(key->wake_gpe, 3); + + if (key->wakeup_route != WAKEUP_ROUTE_DISABLED) { acpi_dp_add_integer(dsd, "wakeup-source", 1); - acpigen_write_PRW(key->wake, 3); acpi_dp_add_integer(dsd, "wakeup-event-action", key->wakeup_event_action); } diff --git a/src/mainboard/google/hatch/variants/hatch/overridetree.cb b/src/mainboard/google/hatch/variants/hatch/overridetree.cb index a92ef9b899..76f634f0d7 100644 --- a/src/mainboard/google/hatch/variants/hatch/overridetree.cb +++ b/src/mainboard/google/hatch/variants/hatch/overridetree.cb @@ -109,7 +109,8 @@ chip soc/intel/cannonlake chip drivers/generic/gpio_keys register "name" = ""PENH"" register "gpio" = "ACPI_GPIO_IRQ_EDGE_BOTH(GPP_A8)" - register "key.wake" = "GPE0_DW0_08" + register "key.wake_gpe" = "GPE0_DW0_08" + register "key.wakeup_route" = "WAKEUP_ROUTE_SCI" register "key.wakeup_event_action" = "EV_ACT_DEASSERTED" register "key.dev_name" = ""EJCT"" register "key.linux_code" = "SW_PEN_INSERTED" diff --git a/src/mainboard/google/hatch/variants/helios/overridetree.cb b/src/mainboard/google/hatch/variants/helios/overridetree.cb index 0d73814249..34d235856e 100644 --- a/src/mainboard/google/hatch/variants/helios/overridetree.cb +++ b/src/mainboard/google/hatch/variants/helios/overridetree.cb @@ -122,7 +122,8 @@ chip soc/intel/cannonlake chip drivers/generic/gpio_keys register "name" = ""PENH"" register "gpio" = "ACPI_GPIO_IRQ_EDGE_BOTH(GPP_A8)" - register "key.wake" = "GPE0_DW0_08" + register "key.wake_gpe" = "GPE0_DW0_08" + register "key.wakeup_route" = "WAKEUP_ROUTE_SCI" register "key.wakeup_event_action" = "EV_ACT_ASSERTED" register "key.dev_name" = ""EJCT"" register "key.linux_code" = "SW_PEN_INSERTED" diff --git a/src/mainboard/google/hatch/variants/helios_diskswap/overridetree.cb b/src/mainboard/google/hatch/variants/helios_diskswap/overridetree.cb index 0422a57bd3..6accd0cc92 100644 --- a/src/mainboard/google/hatch/variants/helios_diskswap/overridetree.cb +++ b/src/mainboard/google/hatch/variants/helios_diskswap/overridetree.cb @@ -134,7 +134,8 @@ chip soc/intel/cannonlake chip drivers/generic/gpio_keys register "name" = ""PENH"" register "gpio" = "ACPI_GPIO_IRQ_EDGE_BOTH(GPP_A8)" - register "key.wake" = "GPE0_DW0_08" + register "key.wake_gpe" = "GPE0_DW0_08" + register "key.wakeup_route" = "WAKEUP_ROUTE_SCI" register "key.wakeup_event_action" = "EV_ACT_ASSERTED" register "key.dev_name" = ""EJCT"" register "key.linux_code" = "SW_PEN_INSERTED" diff --git a/src/mainboard/google/hatch/variants/kindred/overridetree.cb b/src/mainboard/google/hatch/variants/kindred/overridetree.cb index 43fdfbf5fa..c75b7ba8c5 100644 --- a/src/mainboard/google/hatch/variants/kindred/overridetree.cb +++ b/src/mainboard/google/hatch/variants/kindred/overridetree.cb @@ -172,7 +172,8 @@ chip soc/intel/cannonlake chip drivers/generic/gpio_keys register "name" = ""PENH"" register "gpio" = "ACPI_GPIO_IRQ_EDGE_BOTH(GPP_A8)" - register "key.wake" = "GPE0_DW0_08" + register "key.wake_gpe" = "GPE0_DW0_08" + register "key.wakeup_route" = "WAKEUP_ROUTE_SCI" register "key.wakeup_event_action" = "EV_ACT_ASSERTED" register "key.dev_name" = ""EJCT"" register "key.linux_code" = "SW_PEN_INSERTED" diff --git a/src/mainboard/google/hatch/variants/kohaku/overridetree.cb b/src/mainboard/google/hatch/variants/kohaku/overridetree.cb index df18277408..6720ffce79 100644 --- a/src/mainboard/google/hatch/variants/kohaku/overridetree.cb +++ b/src/mainboard/google/hatch/variants/kohaku/overridetree.cb @@ -218,7 +218,8 @@ chip soc/intel/cannonlake register "name" = ""PENH"" # GPP_A16 is the IRQ source, and GPP_A8 is the wake source register "gpio" = "ACPI_GPIO_INPUT_ACTIVE_LOW(GPP_A16)" - register "key.wake" = "GPE0_DW0_08" + register "key.wake_gpe" = "GPE0_DW0_08" + register "key.wakeup_route" = "WAKEUP_ROUTE_SCI" register "key.wakeup_event_action" = "EV_ACT_DEASSERTED" register "key.dev_name" = ""EJCT"" register "key.linux_code" = "SW_PEN_INSERTED" diff --git a/src/mainboard/google/hatch/variants/mushu/overridetree.cb b/src/mainboard/google/hatch/variants/mushu/overridetree.cb index db86d68204..4e4d3888bd 100644 --- a/src/mainboard/google/hatch/variants/mushu/overridetree.cb +++ b/src/mainboard/google/hatch/variants/mushu/overridetree.cb @@ -129,7 +129,8 @@ chip soc/intel/cannonlake chip drivers/generic/gpio_keys register "name" = ""PENH"" register "gpio" = "ACPI_GPIO_IRQ_EDGE_BOTH(GPP_A8)" - register "key.wake" = "GPE0_DW0_08" + register "key.wake_gpe" = "GPE0_DW0_08" + register "key.wakeup_route" = "WAKEUP_ROUTE_SCI" register "key.wakeup_event_action" = "EV_ACT_DEASSERTED" register "key.dev_name" = ""EJCT"" register "key.linux_code" = "SW_PEN_INSERTED" diff --git a/src/mainboard/google/octopus/variants/bobba/overridetree.cb b/src/mainboard/google/octopus/variants/bobba/overridetree.cb index c786a5d2b6..20c376a713 100644 --- a/src/mainboard/google/octopus/variants/bobba/overridetree.cb +++ b/src/mainboard/google/octopus/variants/bobba/overridetree.cb @@ -110,7 +110,8 @@ chip soc/intel/apollolake register "key.linux_code" = "SW_PEN_INSERTED" register "key.linux_input_type" = "EV_SW" register "key.label" = ""pen_eject"" - register "key.wake" = "GPE0_DW2_04" + register "key.wake_gpe" = "GPE0_DW2_04" + register "key.wakeup_route" = "WAKEUP_ROUTE_SCI" register "key.wakeup_event_action" = "EV_ACT_DEASSERTED" device generic 0 on end end diff --git a/src/mainboard/google/octopus/variants/garg/overridetree.cb b/src/mainboard/google/octopus/variants/garg/overridetree.cb index a91a730739..f3c580d2c0 100644 --- a/src/mainboard/google/octopus/variants/garg/overridetree.cb +++ b/src/mainboard/google/octopus/variants/garg/overridetree.cb @@ -104,7 +104,8 @@ chip soc/intel/apollolake register "key.linux_code" = "SW_PEN_INSERTED" register "key.linux_input_type" = "EV_SW" register "key.label" = ""pen_eject"" - register "key.wake" = "GPE0_DW2_04" + register "key.wake_gpe" = "GPE0_DW2_04" + register "key.wakeup_route" = "WAKEUP_ROUTE_SCI" register "key.wakeup_event_action" = "EV_ACT_DEASSERTED" device generic 0 on end end diff --git a/src/mainboard/google/poppy/variants/baseboard/devicetree.cb b/src/mainboard/google/poppy/variants/baseboard/devicetree.cb index 0f3cc0443f..d57070e61a 100644 --- a/src/mainboard/google/poppy/variants/baseboard/devicetree.cb +++ b/src/mainboard/google/poppy/variants/baseboard/devicetree.cb @@ -335,6 +335,7 @@ chip soc/intel/skylake register "key.linux_code" = "SW_PEN_INSERTED" register "key.linux_input_type" = "EV_SW" register "key.label" = ""pen_eject"" + register "key.wakeup_route" = "WAKEUP_ROUTE_DISABLED" device generic 0 on end end end # I2C #3 diff --git a/src/mainboard/google/poppy/variants/nami/devicetree.cb b/src/mainboard/google/poppy/variants/nami/devicetree.cb index 4fa41c55ca..a4dcad0d85 100644 --- a/src/mainboard/google/poppy/variants/nami/devicetree.cb +++ b/src/mainboard/google/poppy/variants/nami/devicetree.cb @@ -401,6 +401,7 @@ chip soc/intel/skylake register "key.linux_code" = "SW_PEN_INSERTED" register "key.linux_input_type" = "EV_SW" register "key.label" = ""pen_insert"" + register "key.wakeup_route" = "WAKEUP_ROUTE_DISABLED" device generic 0 on end end end # I2C #2 diff --git a/src/mainboard/google/poppy/variants/nautilus/devicetree.cb b/src/mainboard/google/poppy/variants/nautilus/devicetree.cb index c55562d0ec..a5f997a427 100644 --- a/src/mainboard/google/poppy/variants/nautilus/devicetree.cb +++ b/src/mainboard/google/poppy/variants/nautilus/devicetree.cb @@ -358,6 +358,7 @@ chip soc/intel/skylake register "key.linux_code" = "SW_PEN_INSERTED" register "key.linux_input_type" = "EV_SW" register "key.label" = ""pen_eject"" + register "key.wakeup_route" = "WAKEUP_ROUTE_DISABLED" device generic 0 on end end end # I2C #3 |