diff options
author | Furquan Shaikh <furquan@chromium.org> | 2017-08-28 17:20:49 -0700 |
---|---|---|
committer | Furquan Shaikh <furquan@google.com> | 2017-08-30 16:40:14 +0000 |
commit | edf459fe65f9166a06899b2ed86a517ffe8bfdd9 (patch) | |
tree | 641b67d1e8af49e8bf38f5263199b0f150285c4e /src/arch/x86/acpi_device.c | |
parent | a62520bc79388f8ed2a33473d76959a18255c76e (diff) |
acpigen: Add stop gpio control to power resource
There is at least one I2C device (being used by Soraka) that has 3
controls -- enable, reset and stop. If the stop gpio is not put into
the right state when turning off the device in suspend mode, then it
causes leakage. Thus, we need control in power resource to be able to
stop the device when entering suspend state.
BUG=b:64987428
TEST=Verified on soraka that touchscreen stop is correctly configured
on suspend.
Change-Id: Iae5ec7eb3972c5c7f80956d60d0d3c321bbefb0f
Signed-off-by: Furquan Shaikh <furquan@chromium.org>
Reviewed-on: https://review.coreboot.org/21249
Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/arch/x86/acpi_device.c')
-rw-r--r-- | src/arch/x86/acpi_device.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/arch/x86/acpi_device.c b/src/arch/x86/acpi_device.c index de2d3375be..31e59eaf66 100644 --- a/src/arch/x86/acpi_device.c +++ b/src/arch/x86/acpi_device.c @@ -471,13 +471,15 @@ void acpi_device_write_spi(const struct acpi_spi *spi) /* PowerResource() with Enable and/or Reset control */ void acpi_device_add_power_res( struct acpi_gpio *reset, unsigned int reset_delay_ms, - struct acpi_gpio *enable, unsigned int enable_delay_ms) + struct acpi_gpio *enable, unsigned int enable_delay_ms, + struct acpi_gpio *stop, unsigned int stop_delay_ms) { static const char *power_res_dev_states[] = { "_PR0", "_PR3" }; unsigned int reset_gpio = reset->pins[0]; unsigned int enable_gpio = enable->pins[0]; + unsigned int stop_gpio = stop->pins[0]; - if (!reset_gpio && !enable_gpio) + if (!reset_gpio && !enable_gpio && !stop_gpio) return; /* PowerResource (PRIC, 0, 0) */ @@ -501,10 +503,17 @@ void acpi_device_add_power_res( if (reset_delay_ms) acpigen_write_sleep(reset_delay_ms); } + if (stop_gpio) { + acpigen_disable_tx_gpio(stop); + if (stop_delay_ms) + acpigen_write_sleep(stop_delay_ms); + } acpigen_pop_len(); /* _ON method */ /* Method (_OFF, 0, Serialized) */ acpigen_write_method_serialized("_OFF", 0); + if (stop_gpio) + acpigen_enable_tx_gpio(stop); if (reset_gpio) acpigen_enable_tx_gpio(reset); if (enable_gpio) |