diff options
| -rw-r--r-- | drivers/gpio/intel_gpio.c | 34 | 
1 files changed, 34 insertions, 0 deletions
| diff --git a/drivers/gpio/intel_gpio.c b/drivers/gpio/intel_gpio.c index b4d5be97dad..6a3a8c4cfaa 100644 --- a/drivers/gpio/intel_gpio.c +++ b/drivers/gpio/intel_gpio.c @@ -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[] = { | 
