aboutsummaryrefslogtreecommitdiff
path: root/src/soc/intel/common/block/gpio
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@google.com>2018-12-10 11:19:36 -0800
committerDuncan Laurie <dlaurie@chromium.org>2018-12-14 18:30:15 +0000
commit28e8ae5385668bb7c26666c0a0bf0208231da78f (patch)
tree32f7cc62c9eb2a867c266d1255a0debb21448a5e /src/soc/intel/common/block/gpio
parent1c88cd6c2b70287589498686786038b774cdab61 (diff)
soc/intel/common: Add support for GPIO group pad base
In some situations the GPIO pad numbers used by the OS are not contiguous and coreboot must provide a way for ACPI to provide the expected GPIO number to the OS. To do this each GPIO group can now have a pad base value, which will be used as the starting pin number for this group and it is added to the relative pin number of this GPIO to compute the ACPI pin number for a particular GPIO. By default this change has no effect because the existing uses of INTEL_GPP() will set the pad base to PAD_BASE_NONE and the GPIO number is used as the ACPI pin number without translation. BUG=b:120686247 TEST=tested on a sarien(cannonlake) board Change-Id: I25f73df45ffae18c5721a00ca230a6b07c250bab Signed-off-by: Duncan Laurie <dlaurie@google.com> Reviewed-on: https://review.coreboot.org/c/30131 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc/intel/common/block/gpio')
-rw-r--r--src/soc/intel/common/block/gpio/gpio.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/soc/intel/common/block/gpio/gpio.c b/src/soc/intel/common/block/gpio/gpio.c
index 9b6ca7e1d5..c3b0ebfa25 100644
--- a/src/soc/intel/common/block/gpio/gpio.c
+++ b/src/soc/intel/common/block/gpio/gpio.c
@@ -397,10 +397,26 @@ void gpio_set(gpio_t gpio_num, int value)
uint16_t gpio_acpi_pin(gpio_t gpio_num)
{
- if (!IS_ENABLED(CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_MULTI_ACPI_DEVICES))
+ const struct pad_community *comm;
+ size_t group, pin;
+
+ if (IS_ENABLED(CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_MULTI_ACPI_DEVICES))
+ return relative_pad_in_comm(gpio_get_community(gpio_num),
+ gpio_num);
+
+ comm = gpio_get_community(gpio_num);
+ pin = relative_pad_in_comm(comm, gpio_num);
+ group = gpio_group_index(comm, pin);
+
+ /* If pad base is not set then use GPIO number as ACPI pin number. */
+ if (comm->groups[group].acpi_pad_base == PAD_BASE_NONE)
return gpio_num;
- return relative_pad_in_comm(gpio_get_community(gpio_num), gpio_num);
+ /*
+ * If this group has a non-zero pad base then compute the ACPI pin
+ * number from the pad base and the relative pad in the group.
+ */
+ return comm->groups[group].acpi_pad_base + gpio_within_group(comm, pin);
}
static void print_gpi_status(const struct gpi_status *sts)