All of lore.kernel.org
 help / color / mirror / Atom feed
From: Grant Likely <grant.likely@linaro.org>
To: "Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Mika Westerberg <mika.westerberg@linux.intel.com>,
	ACPI Devel Maling List <linux-acpi@vger.kernel.org>,
	Aaron Lu <aaron.lu@intel.com>,
	devicetree@vger.kernel.org,
	Linus Walleij <linus.walleij@linaro.org>,
	Alexandre Courbot <gnurou@gmail.com>,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>,
	Bryan Wu <cooloney@gmail.com>, Arnd Bergmann <arnd@arndb.de>,
	Darren Hart <dvhart@linux.intel.com>,
	Mark Rutland <mark.rutland@arm.com>
Subject: Re: [PATCH 06/13] gpio / ACPI: Add support for _DSD device properties
Date: Tue, 14 Oct 2014 15:44:03 +0200	[thread overview]
Message-ID: <20141014134403.66480C408A6@trevor.secretlab.ca> (raw)
In-Reply-To: <1651636.CsIdshL7Av@vostro.rjw.lan>

On Tue, 07 Oct 2014 02:15:18 +0200
, "Rafael J. Wysocki" <rjw@rjwysocki.net>
 wrote:
> From: Mika Westerberg <mika.westerberg@linux.intel.com>
> 
> With release of ACPI 5.1 and _DSD method we can finally name GPIOs (and
> other things as well) returned by _CRS. Previously we were only able to
> use integer index to find the corresponding GPIO, which is pretty error
> prone if the order changes.
> 
> With _DSD we can now query GPIOs using name instead of an integer index,
> like the below example shows:
> 
>   // Bluetooth device with reset and shutdown GPIOs
>   Device (BTH)
>   {
>       Name (_HID, ...)
> 
>       Name (_CRS, ResourceTemplate ()
>       {
>           GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
>                   "\\_SB.GPO0", 0, ResourceConsumer) {15}
>           GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
>                   "\\_SB.GPO0", 0, ResourceConsumer) {27, 31}
>       })
> 
>       Name (_DSD, Package ()
>       {
>           ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
>           Package ()
> 	  {
>               Package () {"reset-gpio", Package() {^BTH, 1, 1, 0 }},
>               Package () {"shutdown-gpio", Package() {^BTH, 0, 0, 0 }},
>           }
>       })
>   }
> 
> The format of the supported GPIO property is:
> 
>   Package () { "name", Package () { ref, index, pin, active_low }}
> 
>   ref - The device that has _CRS containing GpioIo()/GpioInt() resources,
>         typically this is the device itself (BTH in our case).
>   index - Index of the GpioIo()/GpioInt() resource in _CRS starting from zero.
>   pin - Pin in the GpioIo()/GpioInt() resource. Typically this is zero.
>   active_low - If 1 the GPIO is marked as active_low.
> 
> Since ACPI GpioIo() resource does not have field saying whether it is
> active low or high, the "active_low" argument can be used here. Setting
> it to 1 marks the GPIO as active low.
> 
> In our Bluetooth example the "reset-gpio" refers to the second GpioIo()
> resource, second pin in that resource with the GPIO number of 31.
> 
> This patch implements necessary support to gpiolib for extracting GPIOs
> using _DSD device properties.

Patch looks good, but please put the above description into
/Documentation until we've got a better place to document extra bindings.

g.

> 
> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
> Acked-by: Linus Walleij <linus.walleij@linaro.org>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> ---
>  drivers/gpio/gpiolib-acpi.c | 78 +++++++++++++++++++++++++++++++++++++--------
>  drivers/gpio/gpiolib.c      | 30 ++++++++++++++---
>  drivers/gpio/gpiolib.h      |  7 ++--
>  3 files changed, 94 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c
> index 687476f..b14c045 100644
> --- a/drivers/gpio/gpiolib-acpi.c
> +++ b/drivers/gpio/gpiolib-acpi.c
> @@ -293,6 +293,7 @@ void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
>  struct acpi_gpio_lookup {
>  	struct acpi_gpio_info info;
>  	int index;
> +	int pin_index;
>  	struct gpio_desc *desc;
>  	int n;
>  };
> @@ -306,13 +307,24 @@ static int acpi_find_gpio(struct acpi_resource *ares, void *data)
>  
>  	if (lookup->n++ == lookup->index && !lookup->desc) {
>  		const struct acpi_resource_gpio *agpio = &ares->data.gpio;
> +		int pin_index = lookup->pin_index;
> +
> +		if (pin_index >= agpio->pin_table_length)
> +			return 1;
>  
>  		lookup->desc = acpi_get_gpiod(agpio->resource_source.string_ptr,
> -					      agpio->pin_table[0]);
> +					      agpio->pin_table[pin_index]);
>  		lookup->info.gpioint =
>  			agpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT;
> -		lookup->info.active_low =
> -			agpio->polarity == ACPI_ACTIVE_LOW;
> +
> +		/*
> +		 * ActiveLow is only specified for GpioInt resource. If
> +		 * GpioIo is used then the only way to set the flag is
> +		 * to use _DSD "gpios" property.
> +		 */
> +		if (lookup->info.gpioint)
> +			lookup->info.active_low =
> +				agpio->polarity == ACPI_ACTIVE_LOW;
>  	}
>  
>  	return 1;
> @@ -320,40 +332,75 @@ static int acpi_find_gpio(struct acpi_resource *ares, void *data)
>  
>  /**
>   * acpi_get_gpiod_by_index() - get a GPIO descriptor from device resources
> - * @dev: pointer to a device to get GPIO from
> + * @adev: pointer to a ACPI device to get GPIO from
> + * @propname: Property name of the GPIO (optional)
>   * @index: index of GpioIo/GpioInt resource (starting from %0)
>   * @info: info pointer to fill in (optional)
>   *
> - * Function goes through ACPI resources for @dev and based on @index looks
> + * Function goes through ACPI resources for @adev and based on @index looks
>   * up a GpioIo/GpioInt resource, translates it to the Linux GPIO descriptor,
>   * and returns it. @index matches GpioIo/GpioInt resources only so if there
>   * are total %3 GPIO resources, the index goes from %0 to %2.
>   *
> + * If @propname is specified the GPIO is looked using device property. In
> + * that case @index is used to select the GPIO entry in the property value
> + * (in case of multiple).
> + *
>   * If the GPIO cannot be translated or there is an error an ERR_PTR is
>   * returned.
>   *
>   * Note: if the GPIO resource has multiple entries in the pin list, this
>   * function only returns the first.
>   */
> -struct gpio_desc *acpi_get_gpiod_by_index(struct device *dev, int index,
> +struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev,
> +					  const char *propname, int index,
>  					  struct acpi_gpio_info *info)
>  {
>  	struct acpi_gpio_lookup lookup;
>  	struct list_head resource_list;
> -	struct acpi_device *adev;
> -	acpi_handle handle;
> +	bool active_low = false;
>  	int ret;
>  
> -	if (!dev)
> -		return ERR_PTR(-EINVAL);
> -
> -	handle = ACPI_HANDLE(dev);
> -	if (!handle || acpi_bus_get_device(handle, &adev))
> +	if (!adev)
>  		return ERR_PTR(-ENODEV);
>  
>  	memset(&lookup, 0, sizeof(lookup));
>  	lookup.index = index;
>  
> +	if (propname) {
> +		struct acpi_reference_args args;
> +
> +		dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname);
> +
> +		memset(&args, 0, sizeof(args));
> +		ret = acpi_dev_get_property_reference(adev, propname, NULL,
> +						      index, &args);
> +		if (ret)
> +			return ERR_PTR(ret);
> +
> +		/*
> +		 * The property was found and resolved so need to
> +		 * lookup the GPIO based on returned args instead.
> +		 */
> +		adev = args.adev;
> +		if (args.nargs >= 2) {
> +			lookup.index = args.args[0];
> +			lookup.pin_index = args.args[1];
> +			/*
> +			 * 3rd argument, if present is used to
> +			 * specify active_low.
> +			 */
> +			if (args.nargs >= 3)
> +				active_low = !!args.args[2];
> +		}
> +
> +		dev_dbg(&adev->dev, "GPIO: _DSD returned %s %zd %llu %llu %llu\n",
> +			dev_name(&adev->dev), args.nargs,
> +			args.args[0], args.args[1], args.args[2]);
> +	} else {
> +		dev_dbg(&adev->dev, "GPIO: looking up %d in _CRS\n", index);
> +	}
> +
>  	INIT_LIST_HEAD(&resource_list);
>  	ret = acpi_dev_get_resources(adev, &resource_list, acpi_find_gpio,
>  				     &lookup);
> @@ -362,8 +409,11 @@ struct gpio_desc *acpi_get_gpiod_by_index(struct device *dev, int index,
>  
>  	acpi_dev_free_resource_list(&resource_list);
>  
> -	if (lookup.desc && info)
> +	if (lookup.desc && info) {
>  		*info = lookup.info;
> +		if (active_low)
> +			info->active_low = active_low;
> +	}
>  
>  	return lookup.desc ? lookup.desc : ERR_PTR(-ENOENT);
>  }
> diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
> index c68d037..4c86601 100644
> --- a/drivers/gpio/gpiolib.c
> +++ b/drivers/gpio/gpiolib.c
> @@ -1487,14 +1487,36 @@ static struct gpio_desc *acpi_find_gpio(struct device *dev, const char *con_id,
>  					unsigned int idx,
>  					enum gpio_lookup_flags *flags)
>  {
> +	static const char * const suffixes[] = { "gpios", "gpio" };
> +	struct acpi_device *adev = ACPI_COMPANION(dev);
>  	struct acpi_gpio_info info;
>  	struct gpio_desc *desc;
> +	char propname[32];
> +	int i;
>  
> -	desc = acpi_get_gpiod_by_index(dev, idx, &info);
> -	if (IS_ERR(desc))
> -		return desc;
> +	/* Try first from _DSD */
> +	for (i = 0; i < ARRAY_SIZE(suffixes); i++) {
> +		if (con_id && strcmp(con_id, "gpios")) {
> +			snprintf(propname, sizeof(propname), "%s-%s",
> +				 con_id, suffixes[i]);
> +		} else {
> +			snprintf(propname, sizeof(propname), "%s",
> +				 suffixes[i]);
> +		}
> +
> +		desc = acpi_get_gpiod_by_index(adev, propname, 0, &info);
> +		if (!IS_ERR(desc) || (PTR_ERR(desc) == -EPROBE_DEFER))
> +			break;
> +	}
> +
> +	/* Then from plain _CRS GPIOs */
> +	if (IS_ERR(desc)) {
> +		desc = acpi_get_gpiod_by_index(adev, NULL, idx, &info);
> +		if (IS_ERR(desc))
> +			return desc;
> +	}
>  
> -	if (info.gpioint && info.active_low)
> +	if (info.active_low)
>  		*flags |= GPIO_ACTIVE_LOW;
>  
>  	return desc;
> diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h
> index 9db2b6a..e3a5211 100644
> --- a/drivers/gpio/gpiolib.h
> +++ b/drivers/gpio/gpiolib.h
> @@ -34,7 +34,8 @@ void acpi_gpiochip_remove(struct gpio_chip *chip);
>  void acpi_gpiochip_request_interrupts(struct gpio_chip *chip);
>  void acpi_gpiochip_free_interrupts(struct gpio_chip *chip);
>  
> -struct gpio_desc *acpi_get_gpiod_by_index(struct device *dev, int index,
> +struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev,
> +					  const char *propname, int index,
>  					  struct acpi_gpio_info *info);
>  #else
>  static inline void acpi_gpiochip_add(struct gpio_chip *chip) { }
> @@ -47,8 +48,8 @@ static inline void
>  acpi_gpiochip_free_interrupts(struct gpio_chip *chip) { }
>  
>  static inline struct gpio_desc *
> -acpi_get_gpiod_by_index(struct device *dev, int index,
> -			struct acpi_gpio_info *info)
> +acpi_get_gpiod_by_index(struct acpi_device *adev, const char *propname,
> +			int index, struct acpi_gpio_info *info)
>  {
>  	return ERR_PTR(-ENOSYS);
>  }
> -- 
> 1.9.3
> 
> 

  reply	other threads:[~2014-10-14 13:44 UTC|newest]

Thread overview: 109+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-07  0:10 [PATCH v4 00/13] Add ACPI _DSD and unified device properties support Rafael J. Wysocki
2014-10-07  0:12 ` [PATCH 01/13] ACPI: Add support for device specific properties Rafael J. Wysocki
2014-10-13 12:47   ` Grant Likely
2014-10-07  0:12 ` [PATCH 02/13] Driver core: Unified device properties interface for platform firmware Rafael J. Wysocki
2014-10-07  0:13 ` [PATCH 03/13] ACPI: Allow drivers to match using Device Tree compatible property Rafael J. Wysocki
2014-10-14 13:38   ` Grant Likely
2014-10-07  0:14 ` [PATCH 04/13] ACPI: Document ACPI device specific properties Rafael J. Wysocki
2014-10-13 12:41   ` Grant Likely
2014-10-14  9:42     ` Mika Westerberg
2014-10-07  0:14 ` [PATCH 05/13] misc: at25: Make use of device property API Rafael J. Wysocki
2014-10-07  9:10   ` Geert Uytterhoeven
2014-10-07  9:32     ` Mika Westerberg
2014-10-07  0:15 ` [PATCH 06/13] gpio / ACPI: Add support for _DSD device properties Rafael J. Wysocki
2014-10-14 13:44   ` Grant Likely [this message]
2014-10-15  8:46     ` Mika Westerberg
2014-10-07  0:15 ` [PATCH 07/13] gpio: sch: Consolidate core and resume banks Rafael J. Wysocki
2014-10-07  0:16 ` [PATCH 08/13] leds: leds-gpio: Add support for GPIO descriptors Rafael J. Wysocki
     [not found] ` <2660541.BycO7TFnA2-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2014-10-07  0:16   ` [PATCH 09/12] input: gpio_keys_polled - " Rafael J. Wysocki
2014-10-07  0:16     ` Rafael J. Wysocki
     [not found]     ` <1740633.d3tSWZ2Q0u-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2014-10-07 17:29       ` Dmitry Torokhov
2014-10-07 17:29         ` Dmitry Torokhov
2014-10-07  0:17 ` [PATCH 10/13] Driver core: Child node properties for devices Rafael J. Wysocki
2014-10-07  0:18 ` [PATCH 11/13] gpio: Support for unified device properties interface Rafael J. Wysocki
2014-10-07 10:22   ` Alexandre Courbot
2014-10-07 10:40     ` Mika Westerberg
2014-10-07 10:52       ` Alexandre Courbot
2014-10-08  0:09         ` Rafael J. Wysocki
2014-10-08  2:55           ` Alexandre Courbot
2014-10-08 14:01             ` Rafael J. Wysocki
2014-10-07  0:18 ` [PATCH 12/13] leds: leds-gpio: Make use of device property API Rafael J. Wysocki
2014-10-08 14:04   ` Rafael J. Wysocki
     [not found]     ` <2960802.kPr8UT7PvT-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2014-10-08 17:47       ` Bryan Wu
2014-10-08 17:47         ` Bryan Wu
2014-10-08 22:02         ` Rafael J. Wysocki
2014-10-07  0:19 ` [PATCH 13/13] input: gpio_keys_polled - " Rafael J. Wysocki
2014-10-07 17:30   ` Dmitry Torokhov
2014-10-07  0:39 ` [PATCH v4 00/13] Add ACPI _DSD and unified device properties support Rafael J. Wysocki
2014-10-07  2:28 ` Greg Kroah-Hartman
2014-10-15 13:04 ` David Woodhouse
2014-10-15 13:15   ` Mark Rutland
2014-10-15 13:15     ` Mark Rutland
2014-10-15 13:28     ` David Woodhouse
2014-10-15 13:42       ` Mark Rutland
2014-10-15 14:08         ` David Woodhouse
2014-10-15 14:46           ` Darren Hart
2014-10-15 15:11             ` David Woodhouse
2014-10-15 15:17             ` Mark Rutland
2014-10-15 15:43               ` Darren Hart
2014-10-16 10:05                 ` Rafael J. Wysocki
2014-10-16 14:55                 ` David Woodhouse
2014-10-18  8:37                   ` Grant Likely
2014-10-18  8:39                   ` Grant Likely
2014-10-18  8:35                 ` Grant Likely
2014-10-21 21:50                   ` [PATCH v4 00/13] Add ACPI _DSD and unified device properties? support Darren Hart
2015-01-14 18:42     ` [PATCH v4 00/13] Add ACPI _DSD and unified device properties support David Woodhouse
2015-01-15  9:12       ` Rafael J. Wysocki
2014-10-17 12:01 ` [PATCH v5 00/12] " Rafael J. Wysocki
2014-10-17 12:03   ` [PATCH v5 01/12] ACPI: Add support for device specific properties Rafael J. Wysocki
2014-10-17 12:04   ` [PATCH v5 02/12] Driver core: Unified device properties interface for platform firmware Rafael J. Wysocki
2014-10-20  0:07     ` [Update][PATCH " Rafael J. Wysocki
2014-10-17 12:05   ` [PATCH v5 03/12] ACPI: Allow drivers to match using Device Tree compatible property Rafael J. Wysocki
2014-10-20 14:05     ` Grant Likely
2014-10-20 22:19       ` Rafael J. Wysocki
2014-10-17 12:07   ` [PATCH v5 04/12] misc: at25: Make use of device property API Rafael J. Wysocki
2014-10-17 12:09   ` [PATCH v5 05/12] gpio / ACPI: Add support for _DSD device properties Rafael J. Wysocki
2014-10-17 12:10   ` [PATCH v5 06/12] gpio: sch: Consolidate core and resume banks Rafael J. Wysocki
2014-10-17 12:11   ` [PATCH v5 07/12] leds: leds-gpio: Add support for GPIO descriptors Rafael J. Wysocki
2014-10-28 15:26     ` Linus Walleij
2014-10-28 21:56       ` Rafael J. Wysocki
2014-10-29  8:53         ` Mika Westerberg
2014-10-30 15:40           ` Linus Walleij
2014-10-30 16:15             ` Mika Westerberg
2014-10-31  9:41               ` Linus Walleij
2014-10-31  9:55                 ` Mika Westerberg
2014-10-30 15:34         ` Linus Walleij
2014-10-17 12:12   ` [PATCH v5 08/12] input: gpio_keys_polled - " Rafael J. Wysocki
2014-10-17 12:14   ` [PATCH v5 09/12] Driver core: Unified interface for firmware node properties Rafael J. Wysocki
2014-10-18  9:35     ` Arnd Bergmann
2014-10-19 23:30       ` Rafael J. Wysocki
2014-10-20 14:14         ` Arnd Bergmann
2014-10-18 14:55     ` Grant Likely
2014-10-19 23:46       ` Rafael J. Wysocki
     [not found]         ` <7821406.D7i8JfDpzX-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2014-10-20 14:18           ` Grant Likely
2014-10-20 14:18             ` Grant Likely
2014-10-20 22:14             ` Rafael J. Wysocki
2014-10-20 14:19         ` Arnd Bergmann
2014-10-20 14:55           ` Grant Likely
2014-10-20 22:22           ` Rafael J. Wysocki
2014-10-19 22:14     ` Greg Kroah-Hartman
2014-10-19 23:31       ` Rafael J. Wysocki
2014-10-20  0:15     ` [Update][PATCH " Rafael J. Wysocki
2014-10-17 12:16   ` [PATCH v5 10/12] gpio: Support for unified device properties interface Rafael J. Wysocki
2014-10-17 18:09     ` Arnd Bergmann
2014-10-18  9:47       ` Arnd Bergmann
2014-10-19 23:58         ` Rafael J. Wysocki
2014-10-20 14:22           ` Arnd Bergmann
2014-10-20  6:12         ` Alexandre Courbot
2014-10-20 14:26           ` Arnd Bergmann
2014-10-17 12:17   ` [PATCH v5 11/12] leds: leds-gpio: Make use of device property API Rafael J. Wysocki
2014-10-17 12:18   ` [PATCH v5 12/12] input: gpio_keys_polled - " Rafael J. Wysocki
2014-10-17 12:22   ` [PATCH v5 00/12] Add ACPI _DSD and unified device properties support Rafael J. Wysocki
2014-10-17 15:40   ` Greg Kroah-Hartman
2014-10-17 19:23     ` Darren Hart
2014-10-17 21:49     ` Rafael J. Wysocki
2014-10-19 22:14       ` Greg Kroah-Hartman
2014-10-17 18:04   ` Arnd Bergmann
2014-10-17 22:50     ` Rafael J. Wysocki
2014-10-18  8:49       ` Grant Likely
2014-10-19 23:32         ` Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20141014134403.66480C408A6@trevor.secretlab.ca \
    --to=grant.likely@linaro.org \
    --cc=aaron.lu@intel.com \
    --cc=arnd@arndb.de \
    --cc=cooloney@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=dvhart@linux.intel.com \
    --cc=gnurou@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mika.westerberg@linux.intel.com \
    --cc=rjw@rjwysocki.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.