Hi Simon, On Mon, Jun 15, 2020 at 11:58 AM Simon Glass <s...@chromium.org> wrote: > > 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 <s...@chromium.org> > --- > > Changes in v1: > - Use acpi_get_path() to get device path > > drivers/gpio/intel_gpio.c | 34 ++++++++++++++++++++++++++++++++++ > 1 file changed, 34 insertions(+) > > diff --git a/drivers/gpio/intel_gpio.c b/drivers/gpio/intel_gpio.c > index b4d5be97da..6a3a8c4cfa 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;
Is there a way to figure out these properties from DT, instead of hardcoding? > + 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[] = { > -- Regards, Bin