summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@google.com>2018-12-10 11:29:36 -0800
committerDuncan Laurie <dlaurie@chromium.org>2019-02-01 21:56:07 +0000
commit718d185f1e041411a3a42862bf83c79b6e51fb36 (patch)
tree31080e7983d63b3a01da1c672043af52bcbbeae1
parentc01a505282526a7038463e937cbec83f704a6a89 (diff)
vendorcode/google/chromeos: Use ACPI GPIO pin when possible
Have the generated Chrome OS ACPI GPIO table provide the ACPI GPIO pin number instead of the raw GPIO number when possible. This is necessary if the OS uses a different numbering for GPIOs that are reported in ACPI than the actual underlying GPIO number. For example, if the SOC OS driver declares more pins in an ACPI GPIO bank than there are actual pins in the hardware it will have gaps in the number space. This is a reworked version of 6217e9beff16d805ca833e79a2931bcdb3d02a44 which does not try to convert CROS_GPIO_VIRTUAL. BUG=b:120686247 TEST=pass firmware_WriteProtect test on Sarien Signed-off-by: Duncan Laurie <dlaurie@google.com> Change-Id: I3ad5099b7f2f871c7e516988f60a54eb2a75bef7 Reviewed-on: https://review.coreboot.org/c/31080 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Subrata Banik <subrata.banik@intel.com> Reviewed-by: Nico Huber <nico.h@gmx.de>
-rw-r--r--src/vendorcode/google/chromeos/acpi.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/vendorcode/google/chromeos/acpi.c b/src/vendorcode/google/chromeos/acpi.c
index 6605809023..8fd47a6a76 100644
--- a/src/vendorcode/google/chromeos/acpi.c
+++ b/src/vendorcode/google/chromeos/acpi.c
@@ -14,11 +14,15 @@
*/
#include <arch/acpigen.h>
+#if IS_ENABLED(CONFIG_GENERIC_GPIO_LIB)
+#include <gpio.h>
+#endif
#include "chromeos.h"
void chromeos_acpi_gpio_generate(const struct cros_gpio *gpios, size_t num)
{
size_t i;
+ int gpio_num;
acpigen_write_scope("\\");
acpigen_write_name("OIPG");
@@ -28,7 +32,13 @@ void chromeos_acpi_gpio_generate(const struct cros_gpio *gpios, size_t num)
acpigen_write_package(4);
acpigen_write_integer(gpios[i].type);
acpigen_write_integer(gpios[i].polarity);
- acpigen_write_integer(gpios[i].gpio_num);
+ gpio_num = gpios[i].gpio_num;
+#if IS_ENABLED(CONFIG_GENERIC_GPIO_LIB)
+ /* Get ACPI pin from GPIO library if available */
+ if (gpios[i].gpio_num != CROS_GPIO_VIRTUAL)
+ gpio_num = gpio_acpi_pin(gpio_num);
+#endif
+ acpigen_write_integer(gpio_num);
acpigen_write_string(gpios[i].device);
acpigen_pop_len();
}