x86: gpio: Add support for obtaining ACPI info for a GPIO
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>
This commit is contained in:
@@ -12,6 +12,7 @@
|
|||||||
#include <pch.h>
|
#include <pch.h>
|
||||||
#include <pci.h>
|
#include <pci.h>
|
||||||
#include <syscon.h>
|
#include <syscon.h>
|
||||||
|
#include <acpi/acpi_device.h>
|
||||||
#include <asm/cpu.h>
|
#include <asm/cpu.h>
|
||||||
#include <asm/gpio.h>
|
#include <asm/gpio.h>
|
||||||
#include <asm/intel_pinctrl.h>
|
#include <asm/intel_pinctrl.h>
|
||||||
@@ -19,6 +20,7 @@
|
|||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/pci.h>
|
#include <asm/pci.h>
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <dm/acpi.h>
|
||||||
#include <dt-bindings/gpio/x86-gpio.h>
|
#include <dt-bindings/gpio/x86-gpio.h>
|
||||||
|
|
||||||
static int intel_gpio_direction_input(struct udevice *dev, uint offset)
|
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;
|
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)
|
static int intel_gpio_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@@ -152,6 +183,9 @@ static const struct dm_gpio_ops gpio_intel_ops = {
|
|||||||
.set_value = intel_gpio_set_value,
|
.set_value = intel_gpio_set_value,
|
||||||
.get_function = intel_gpio_get_function,
|
.get_function = intel_gpio_get_function,
|
||||||
.xlate = intel_gpio_xlate,
|
.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[] = {
|
static const struct udevice_id intel_intel_gpio_ids[] = {
|
||||||
|
Reference in New Issue
Block a user