From: "Marek Behún" <kabel@kernel.org>
To: Bartosz Golaszewski <brgl@bgdev.pl>
Cc: Andy Shevchenko <andy.shevchenko@gmail.com>, linux-gpio@vger.kernel.org
Subject: how to request gpiochip line which is only valid as an interrupt?
Date: Mon, 10 Jun 2024 16:01:55 +0200 [thread overview]
Message-ID: <20240610160155.5ca7e0d7@dellmb> (raw)
Hello Bartosz,
I would like to ask you if you could find some time to look at
[PATCH v11 6/8] platform: cznic: turris-omnia-mcu: Add support for
MCU provided TRNG
https://lore.kernel.org/soc/20240605161851.13911-7-kabel@kernel.org/
Andy Shevchenko added you to that conversation asking you about how to
correctly do the following part:
irq = gpiod_to_irq(gpiochip_get_desc(&mcu->gc, irq_idx));
I am writing this to give some more light into the problem. What is
going on:
- the turris-omnia-mcu driver provides a gpio chip with interrupts
- some lines are gpio + irq, but some lines are interrupt only
- later, after the gpiochip is registered, another part of the
turris-omnia-mcu driver wants to use one interrupt only line
To use the gpiod_to_irq() function, I need gpio descriptor for that
line. I can get that with gpiochip_get_desc(), since this is within the
driver, I have access to the gpiochip. But this is semantically a
little weird, because
1. gpiochip_get_desc() is supposed to be used by gpio driver, not
consumer (and the trng part of the turris-omnia-mcu code is a
consumer of the gpio)
2. reference counting?
Looking at gpiolib, maybe the better function to use would be
gpiochip_request_own_desc(). This also is defined in
include/gpio/driver.c instead of include/gpio/consumer.c, but at least
it's name suggests that it is used by code that also owns the
gpiochip...
One problem is that gpiochip_request_own_desc() won't work, because the
gpiochip initializes valid masks for both gpios and irqs, and the
gpiochip_request_own_desc() function calls gpiod_request_commit(),
which executes the following code
if (guard.gc->request) {
offset = gpio_chip_hwgpio(desc);
if (gpiochip_line_is_valid(guard.gc, offset))
ret = guard.gc->request(guard.gc, offset);
else
ret = -EINVAL;
...
}
So if a gpiochip line is not valid GPIO, only valid IRQchip line, then
the GPIO cannot be requested, even for interrupts.
What is the proper solution here?
Thank you
Marek
next reply other threads:[~2024-06-10 14:01 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-10 14:01 Marek Behún [this message]
2024-06-11 9:03 ` how to request gpiochip line which is only valid as an interrupt? Marek Behún
2024-06-11 19:22 ` Bartosz Golaszewski
2024-06-12 8:55 ` Marek Behún
2024-06-12 9:03 ` Marek Behún
2024-06-12 12:30 ` Bartosz Golaszewski
2024-06-12 13:32 ` Marek Behún
2024-06-12 9:19 ` Marek Behún
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=20240610160155.5ca7e0d7@dellmb \
--to=kabel@kernel.org \
--cc=andy.shevchenko@gmail.com \
--cc=brgl@bgdev.pl \
--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