x86: gpio: Add support for obtaining ACPI info for a GPIO
authorSimon Glass <sjg@chromium.org>
Wed, 8 Jul 2020 03:32:26 +0000 (21:32 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Fri, 17 Jul 2020 06:32:24 +0000 (14:32 +0800)
Implement the method that converts a GPIO into the form used by ACPI, so
that GPIOs can be added to ACPI tables.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
drivers/gpio/intel_gpio.c

index b4d5be9..6a3a8c4 100644 (file)
@@ -12,6 +12,7 @@
 #include <pch.h>
 #include <pci.h>
 #include <syscon.h>
+#include <acpi/acpi_device.h>
 #include <asm/cpu.h>
 #include <asm/gpio.h>
 #include <asm/intel_pinctrl.h>
@@ -19,6 +20,7 @@
 #include <asm/io.h>
 #include <asm/pci.h>
 #include <asm/arch/gpio.h>
+#include <dm/acpi.h>
 #include <dt-bindings/gpio/x86-gpio.h>
 
 static int intel_gpio_direction_input(struct udevice *dev, uint offset)
@@ -128,6 +130,35 @@ static int intel_gpio_xlate(struct udevice *orig_dev, struct gpio_desc *desc,
        return 0;
 }
 
+#if CONFIG_IS_ENABLED(ACPIGEN)
+static int intel_gpio_get_acpi(const struct gpio_desc *desc,
+                              struct acpi_gpio *gpio)
+{
+       struct udevice *pinctrl;
+       int ret;
+
+       if (!dm_gpio_is_valid(desc))
+               return -ENOENT;
+       pinctrl = dev_get_parent(desc->dev);
+
+       memset(gpio, '\0', sizeof(*gpio));
+
+       gpio->type = ACPI_GPIO_TYPE_IO;
+       gpio->pull = ACPI_GPIO_PULL_DEFAULT;
+       gpio->io_restrict = ACPI_GPIO_IO_RESTRICT_OUTPUT;
+       gpio->polarity = ACPI_GPIO_ACTIVE_HIGH;
+       gpio->pin_count = 1;
+       gpio->pins[0] = intel_pinctrl_get_acpi_pin(pinctrl, desc->offset);
+       gpio->pin0_addr = intel_pinctrl_get_config_reg_addr(pinctrl,
+                                                           desc->offset);
+       ret = acpi_get_path(pinctrl, gpio->resource, sizeof(gpio->resource));
+       if (ret)
+               return log_msg_ret("resource", ret);
+
+       return 0;
+}
+#endif
+
 static int intel_gpio_probe(struct udevice *dev)
 {
        return 0;
@@ -152,6 +183,9 @@ static const struct dm_gpio_ops gpio_intel_ops = {
        .set_value              = intel_gpio_set_value,
        .get_function           = intel_gpio_get_function,
        .xlate                  = intel_gpio_xlate,
+#if CONFIG_IS_ENABLED(ACPIGEN)
+       .get_acpi               = intel_gpio_get_acpi,
+#endif
 };
 
 static const struct udevice_id intel_intel_gpio_ids[] = {