Message ID | 20200614215726.v1.25.Ieac541912f8390ac07a3c9b693fb46858e3b813e@changeid |
---|---|
State | Accepted |
Commit | 43ee86cc4bb96686996f31071ce7da8c0c99fec5 |
Headers | show |
Series | x86: Programmatic generation of ACPI tables (Part C) | expand |
Hi Simon, On Mon, Jun 15, 2020 at 11:58 AM Simon Glass <sjg at 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 <sjg at 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
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; + 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[] = {
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 at chromium.org> --- Changes in v1: - Use acpi_get_path() to get device path drivers/gpio/intel_gpio.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)