public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Darren Hart <dvhart@linux.intel.com>
Cc: Grant Likely <grant.likely@secretlab.ca>,
	Mika Westerberg <mika.westerberg@linux.intel.com>,
	Alexandre Courbot <acourbot@nvidia.com>,
	Linus Walleij <linus.walleij@linaro.org>,
	Arnd Bergmann <arnd@arndb.de>,
	linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] ACPI / GPIO: Pass index to acpi_get_gpiod_by_index() when using properties
Date: Mon, 03 Nov 2014 22:52:50 +0100	[thread overview]
Message-ID: <2331586.goAnq7FsMG@vostro.rjw.lan> (raw)
In-Reply-To: <4455568.bqAfQGqTU9@vostro.rjw.lan>

On Monday, November 03, 2014 04:25:08 PM Rafael J. Wysocki wrote:
> On Sunday, November 02, 2014 08:49:37 PM Darren Hart wrote:
> > 
> > On 11/1/14 4:11, Grant Likely wrote:
> > > On Tue, 28 Oct 2014 22:59:57 +0100
> > > , "Rafael J. Wysocki" <rjw@rjwysocki.net>
> > >  wrote:
> > >> On Tuesday, October 28, 2014 01:15:27 PM Mika Westerberg wrote:
> > >>> acpi_dev_add_driver_gpios() makes it possible to set up mapping between
> > >>> properties and ACPI GpioIo resources in a driver, so we can take index
> > >>> parameter in acpi_find_gpio() into use with _DSD device properties now.
> > >>>
> > >>> This index can be used to select a GPIO from a property with multiple
> > >>> GPIOs:
> > >>>
> > >>>   Package () {
> > >>>   	"data-gpios",
> > >>>   	Package () {
> > >>>   		\_SB.GPIO, 0, 0, 0,
> > >>>   		\_SB.GPIO, 1, 0, 0,
> > >>>   		\_SB.GPIO, 2, 0, 1,
> > >>>   	}
> > >>>   }
> > >>>
> > >>> In order to retrieve the last GPIO from a driver we can simply do:
> > >>>
> > >>>   desc = devm_gpiod_get_index(dev, "data", 2);
> > >>>
> > >>> and so on.
> > >>>
> > >>> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
> > >>
> > >> Cool. :-)
> > >>
> > >> Any objections anyone?
> > > 
> > > Actually, I do. Not in the idea, but in the implementation. The way this gets encoded:
> > > 
> > > 	Package () {
> > > 		\_SB.GPIO, 0, 0, 0,
> > > 		\_SB.GPIO, 1, 0, 0,
> > > 		\_SB.GPIO, 2, 0, 1,
> > > 	}
> > > 
> > > Means that decoding each GPIO tuple requires the length of a tuple to be
> > > fixed, or to implement a DT-like #gpio-cells. If it is fixed, then there
> > > is no way to expand the binding later. Can this be done in the following
> > > way instead?
> > > 
> > > 	Package () {
> > > 		Package () { \_SB.GPIO, 0, 0, 0 },
> > > 		Package () { \_SB.GPIO, 1, 0, 0 },
> > > 		Package () { \_SB.GPIO, 2, 0, 1 },
> > > 	}
> > > 
> > > This is one of the biggest pains in device tree. We don't have any way
> > > to group tuples so it requires looking up stuff across the tree to
> > > figure out how to parse each multi-item property.
> > > 
> > > I know that last year we talked about how bios vendors would get
> > > complicated properties wrong, but I think there is little risk in this
> > > case. If the property is encoded wrong, the driver simply won't work and
> > > it is unlikely to get shipped before being fixed.
> > 
> > This particular nesting of Packages is expressly prohibited by the
> > Device Properties UUID for the reasons you mention.
> > 
> > http://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf
> 
> Also we don't use properties where single name is assigned to multiple GPIOs
> anywhere in the current device-properties patchset, so this is not relevant at
> the moment.
> 
> Moreover, even if we were to use them, we would need to ensure that this:
> 
> 	Package () {
> 		\_SB.GPIO, 0, 0, 0
> 	}
> 
> was equivalent to
> 
> 	Package () {
>  		Package () { \_SB.GPIO, 0, 0, 0 }
> 	}
> 
> This is not impossible to do and I suppose we could even explain that in the
> implementation guide document in a sensible way, but that would require the
> document linked above to be changed first and *then* we can think about writing
> kernel code to it.  Not the other way around, please.
> 
> So Grant, do you want us to proceed with that?

Before you reply, one more observation that seems to be relevant.

In ACPI, both this:

	Package () {
		\_SB.GPIO, 0, 0, 0,
		\_SB.GPIO, 1, 0, 0,
		\_SB.GPIO, 2, 0, 1,
	}

and this:

	Package () {
		Package () { \_SB.GPIO, 0, 0, 0 },
		Package () { \_SB.GPIO, 1, 0, 0 },
		Package () { \_SB.GPIO, 2, 0, 1 },
	}

carry the same information, because every element of a package has a type,
so there is no danger of confusing an ACPI_TYPE_LOCAL_REFERENCE with
ACPI_TYPE_INTEGER.  Thus one can easily count the number of GPIOs represented
by the first package by counting the number of reference elements in it.
The second one has more structure which in this particular case is arguably
redundant.

Of course, that's not the case for list properties where each item consists
of a bunch of integers, like

	Package () {
		Package () { 0, 0, 0 },
		Package () { 1, 0, 0 },
		Package () { 2, 0, 1 },
	}

but I'm not sure if this is relevant at all.

Rafael


  reply	other threads:[~2014-11-03 21:32 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-28 11:15 [PATCH] ACPI / GPIO: Pass index to acpi_get_gpiod_by_index() when using properties Mika Westerberg
2014-10-28 15:57 ` Darren Hart
2014-10-28 21:59 ` Rafael J. Wysocki
2014-10-29  7:41   ` Alexandre Courbot
2014-10-29  8:54     ` Mika Westerberg
2014-10-29 14:42       ` Rafael J. Wysocki
2014-10-29 14:51         ` Rafael J. Wysocki
2014-10-29 14:44           ` Mika Westerberg
2014-11-01 11:11   ` Grant Likely
2014-11-03  4:49     ` Darren Hart
2014-11-03 15:25       ` Rafael J. Wysocki
2014-11-03 21:52         ` Rafael J. Wysocki [this message]
2014-11-04 14:48           ` Grant Likely
2014-11-04 16:06             ` Rafael J. Wysocki
2014-11-04 22:54               ` Rafael J. Wysocki
2014-11-04 22:58                 ` Grant Likely
2014-11-04 23:42                 ` Darren Hart
2014-11-05 20:59                   ` Rafael J. Wysocki
2014-11-05 20:53                     ` Darren Hart
2014-11-05  9:16                 ` Mika Westerberg
2014-11-05 21:00                   ` 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=2331586.goAnq7FsMG@vostro.rjw.lan \
    --to=rjw@rjwysocki.net \
    --cc=acourbot@nvidia.com \
    --cc=arnd@arndb.de \
    --cc=dvhart@linux.intel.com \
    --cc=grant.likely@secretlab.ca \
    --cc=linus.walleij@linaro.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mika.westerberg@linux.intel.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox