diff mbox series

[v1,25/43] x86: gpio: Add support for obtaining ACPI info for a GPIO

Message ID 20200614215726.v1.25.Ieac541912f8390ac07a3c9b693fb46858e3b813e@changeid
State Accepted
Commit 43ee86cc4bb96686996f31071ce7da8c0c99fec5
Headers show
Series x86: Programmatic generation of ACPI tables (Part C) | expand

Commit Message

Simon Glass June 15, 2020, 3:57 a.m. UTC
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(+)

Comments

Bin Meng June 30, 2020, 7:47 a.m. UTC | #1
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 mbox series

Patch

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[] = {