From: Robert Abel <rabel@cit-ec.uni-bielefeld.de>
To: Alexandre Courbot <gnurou@gmail.com>
Cc: "linux-gpio@vger.kernel.org" <linux-gpio@vger.kernel.org>,
Linus Walleij <linus.walleij@linaro.org>
Subject: Re: [PATCH] GPIOD, OF: parse flags into gpiod
Date: Mon, 05 May 2014 12:07:38 +0200 [thread overview]
Message-ID: <536762EA.8020605@cit-ec.uni-bielefeld.de> (raw)
In-Reply-To: <CAAVeFuK-ZSr__nLq9ZU7ASD_CsXOUBYqtZv4F4MTd5+XSxTGdg@mail.gmail.com>
On 01.05.2014 08:24, Alexandre Courbot wrote:
> This considerably changes the behavior of of_get_named_gpiod_flags(),
> and makes it apply DT flags to the GPIO descriptor no matter what.
Which should be done anyway, IMHO.
> In effect, it makes the flags argument completely unneeded.
Except for drivers who use the old integer interface and call
desc_to_gpio themselves. Which is why I kept it.
> of_get_named_gpiod_flags() ought to be gpiolib-private actually (I
> still need to send a patch fixing that) since its only user is
> of_find_gpio(), which correctly applies the flags.
of_find_gpio does _not_ apply the flags correctly. I'm looking at
dd34c37aa3e81715a1ed8da61fa438072428e188 here (head of for-next branch):
> static struct gpio_desc *of_find_gpio(struct device *dev, const char
> *con_id,
> unsigned int idx,
> enum gpio_lookup_flags *flags)
> {
> ...
> enum of_gpio_flags of_flags;
> struct gpio_desc *desc;
>
> ...
>
> desc = of_get_named_gpiod_flags(dev->of_node, prop_name, idx,
> &of_flags);
> ...
>
> if (of_flags & OF_GPIO_ACTIVE_LOW)
> *flags |= GPIO_ACTIVE_LOW;
>
> return desc;
> }
It just translates the parsed of_gpio_flags to gpio_lookup_flags for the
passed flags argument --which btw must not be NULL, which it can be for
many other exported functions. So the descriptor is strill _wrong_, i.e.
desc->flags not set, and any subsequent call to set the gpio will behave
incorrectly when flags were applied in the DT.
Which is why I fixed it in of_get_named_gpiod_flags to begin with.
IMHO gpio_desc should be a welcomed change to get away from drivers
having to manage their I/O polarity themselves. But right now it's
royally broken.
> We have users of of_get_named_gpio_flags() that could at first sight
> benefit from your change. However, your change will return them a GPIO
> which will behave differently from what they expect since the
> active_low property will be set on its GPIO descriptor.
They shouldn't expect anything. gpio_desc is an opaque type for exactly
that reason. Drivers should neither know nor care about the gpio_desc
flags. It's an API inconsistency to actually let them see the flags in
the first place -- but that's for historical reasons, apparently.
> Callers of of_get_named_gpio_flags(), working on integer GPIOs,
> typically manage that property themselves. This will result in the
> active_low property being applied twice, effectively canceling its effect.
The integer GPIO use-case is to convert gpio_desc to integers and call
the appropriate integer functions (gpio_*) depending on the flags. All
integer functions gpio_* call their gpiod_*_raw_* counterpart. The flags
are _not_ applied twice. They're applied once if the driver is aware of
them or not at all if the driver ignores them.
Any driver that mixes gpio_* and gpiod_* calls should not be expected to
be stable and work anyways, correct? The flags might be applied twice if
the driver parses them, is aware of them, but calls gpiod_* functions
depending on the parsed flags. However, this is incorrect driver
behavior. Though, to be fair, this distinction is less than ideally
documented...
> Also, for future contributions could you use "gpiod:of: " in your
> patch subject to keep the style consistent with existing practices in
> drivers/gpio?
I didn't see any such usage, but OK.
>> ---
>> +#if defined(CONFIG_OF)
>> +void gpiod_translate_flags(struct gpio_desc *desc, enum of_gpio_flags *flags)
> This function translates device tree flags - not just any tag. Its
> name should reflect that.
I had gpiod_translate_of_flags at first, but that sounded awkward, as
anything using the of abbreviation.
>> +{
>> +
>> + desc->flags = 0;
>> +
>> + if (*flags & OF_GPIO_ACTIVE_LOW)
>> + set_bit(FLAG_ACTIVE_LOW, &desc->flags);
>> +
>> +}
> You could also use this function to set the flags in of_find_gpio(),
> since the code is the same.
That would be ideal.
>> +EXPORT_SYMBOL_GPL(gpiod_translate_flags);
> I don't think this function should have been exported. It is only to
> be used in gpiolib-of.o, which will always be linked to gpiolib.o
> anyway.
I had trouble compiling without the export. I'll try again.
> Again, this should not be part of the public API. These declarations
> should have be moved into the gpiolib.h header.
OK.
>
>> #else /* CONFIG_GPIOLIB */
>>
>> --
>> 1.9.2
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2014-05-05 10:07 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-29 12:38 [PATCH] GPIOD, OF: parse flags into gpiod Robert ABEL
2014-05-01 6:24 ` Alexandre Courbot
2014-05-05 10:07 ` Robert Abel [this message]
2014-05-05 10:27 ` Robert Abel
2014-05-05 13:10 ` Alexandre Courbot
2014-05-05 14:08 ` Robert ABEL
2014-05-05 15:14 ` Alexandre Courbot
2014-05-05 16:46 ` Alexandre Courbot
2014-05-13 12:19 ` Robert ABEL
2014-05-13 13:38 ` Javier Martinez Canillas
2014-05-14 0:44 ` Robert Abel
2014-05-14 4:09 ` Alexandre Courbot
2014-05-13 14:24 ` Alexandre Courbot
2014-05-16 15:49 ` Linus Walleij
2014-05-13 8:42 ` Linus Walleij
2014-05-13 11:33 ` Robert ABEL
2014-05-13 13:20 ` Linus Walleij
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=536762EA.8020605@cit-ec.uni-bielefeld.de \
--to=rabel@cit-ec.uni-bielefeld.de \
--cc=gnurou@gmail.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).