mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jon Hunter <jonathanh@nvidia.com>
To: Bartosz Golaszewski <brgl@kernel.org>
Cc: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>,
	Linus Walleij <linusw@kernel.org>,
	linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org,
	"linux-tegra@vger.kernel.org" <linux-tegra@vger.kernel.org>
Subject: Re: [PATCH] gpio: shared: call gpio_chip::of_xlate() if set
Date: Wed, 18 Mar 2026 19:09:08 +0000	[thread overview]
Message-ID: <ab009797-3b48-4568-8e80-b10a44b6fac1@nvidia.com> (raw)
In-Reply-To: <CAMRc=McGaF2XYedgy4n_RZzbHSBBZ2=EMvBEF4f8+ejLbu+CPQ@mail.gmail.com>


On 18/03/2026 08:09, Bartosz Golaszewski wrote:

...

>>>> I can reproduce this with a gpio-keys setup. I think you hit an
>>>> interesting corner-case where the consumer device is the same for two
>>>> shared pins assigned to its child fwnodes. The setup doesn't make
>>>> sense really but I guess this shouldn't just fail like that.
>>>>
>>>
>>> So the problem goes like this: we're using lookup tables for shared
>>> GPIOs but they are not capable of dealing with two fwnodes that are
>>> children of the same device that share the same pin but are themselves
>>> not attached to a device bound to a driver. While we could extend
>>> lookup tables to take that into account, I think that the setup here
>>> is so hypothetical, it doesn't really make sense to spend time on it.
>>
>> Makes sense.
>>
> 
> Just to be clear, this:
> 
> 	gpio-keys {
> 		compatible = "gpio-keys";
> 
> 		key-one {
> 			label = "foo";
> 			gpios = <&gpio_sim0 10 0>;
> 			linux,input-type = <EV_KEY>;
> 			linux,code = <KEY_POWER>;
> 		};
> 
> 		key-two {
> 			label = "bar";
> 			gpios = <&gpio_sim0 10 0>;
> 			linux,input-type = <EV_KEY>;
> 			linux,code = <KEY_POWER>;
> 		};
> 	};
> 
> doesn't work, but this:
> 
> 	gpio-keys-1 {
> 		compatible = "gpio-keys";
> 
> 		key-one {
> 			label = "foo";
> 			gpios = <&gpio_sim0 10 0>;
> 			linux,input-type = <EV_KEY>;
> 			linux,code = <KEY_POWER>;
> 		};
> 	};
> 
> 	gpio-keys-2 {
> 		compatible = "gpio-keys";
> 
> 		key-two {
> 			label = "bar";
> 			gpios = <&gpio_sim0 10 0>;
> 			linux,input-type = <EV_KEY>;
> 			linux,code = <KEY_POWER>;
> 		};
> 	};
> 
> does. I don't think making the former work is worth the effort.

That's fine with me.

>>> Does this patch fix the real problem on the tegra board that you
>>> reported initially? I doubt two separate GPIO keys, share the same pin
>>> in real life.
>>
>> Yes it fixes the initial issue. However, now I am seeing a different
>> error on the actual platform that is having the issue to begin with ...
>>
> 
> This is *with* the fix?

Yes.

>>    ------------[ cut here ]------------
>>    WARNING: kernel/rcu/srcutree.c:757 at cleanup_srcu_struct+0xc0/0x1e0, CPU#2: kworker/u49:1/114
>>    Modules linked in:
>>    CPU: 2 UID: 0 PID: 114 Comm: kworker/u49:1 Not tainted 6.19.0-tegra #1 PREEMPT
>>    Hardware name: NVIDIA NVIDIA Jetson AGX Orin Developer Kit/Jetson, BIOS buildbrain-gcid-44496888 03/15/2026
>>    Workqueue: events_unbound deferred_probe_work_func
>>    pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
>>    pc : cleanup_srcu_struct+0xc0/0x1e0
>>    lr : cleanup_srcu_struct+0xb4/0x1e0
>>    sp : ffff800081cbb930
>>    x29: ffff800081cbb930 x28: ffffd79ff96d0c40 x27: ffff000086059000
>>    x26: 00000000fffffff0 x25: ffff000086571200 x24: ffffd79ff94adb10
>>    x23: ffffd79ff86400c0 x22: ffff000086059390 x21: ffffd79ff94aa040
>>    x20: 0000000000000000 x19: fffffdffbf669d40 x18: 00000000ffffffff
>>    x17: 0000000000000000 x16: ffffd79ff62dc8a0 x15: 0081cf5fe0409838
>>    x14: 0000000000000000 x13: 0000000000000272 x12: 0000000000000000
>>    x11: 00000000000000c0 x10: f7c5d06d757a4b3a x9 : 15ccf89dfeffb5e1
>>    x8 : ffff800081cbb8c8 x7 : 0000000000000000 x6 : 000000000151e960
>>    x5 : 0800000000000000 x4 : 0000000000000000 x3 : 0000000000000000
>>    x2 : 0000000000000001 x1 : 0000000000000000 x0 : 0000000000000004
>>    Call trace:
>>     cleanup_srcu_struct+0xc0/0x1e0 (P)
>>     gpiochip_add_data_with_key+0x3dc/0xf68
>>     devm_gpiochip_add_data_with_key+0x30/0x84
>>     tegra186_gpio_probe+0x5e4/0x808
>>     platform_probe+0x5c/0xb0
>>     really_probe+0xbc/0x2b4
>>     __driver_probe_device+0x78/0x134
>>     driver_probe_device+0x3c/0x164
>>     __device_attach_driver+0xc8/0x15c
>>     bus_for_each_drv+0x88/0x100
>>     __device_attach+0xa0/0x198
>>     device_initial_probe+0x58/0x5c
>>     bus_probe_device+0x38/0xbc
>>     deferred_probe_work_func+0x88/0xc8
>>     process_one_work+0x16c/0x3fc
>>     worker_thread+0x2d8/0x3ec
>>     kthread+0x144/0x22c
>>     ret_from_fork+0x10/0x20
>>    ---[ end trace 0000000000000000 ]---

It seems that when the gpiochip_add_data_with_key(), then to avoid the
above warning I needed to ...

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 27ea5bc9ed8a..3130acfeeb66 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -1277,6 +1277,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
                 goto err_print_message;
         }
  err_cleanup_desc_srcu:
+       synchronize_srcu(&gdev->desc_srcu);
         cleanup_srcu_struct(&gdev->desc_srcu);
  err_cleanup_gdev_srcu:
         cleanup_srcu_struct(&gdev->srcu);


>>    gpiochip_add_data_with_key: GPIOs 512..675 (tegra234-gpio) failed to register, -16
>>    tegra186-gpio 2200000.gpio: probe with driver tegra186-gpio failed with error -16

Which leaves the above.

> There's a change to how gpiochip_add_data_with_key() error path works in
> linux-next at the moment but it's not in any stable branch yet.
> 

This commit?

16fdabe143fc ("gpio: Fix resource leaks on errors in gpiochip_add_data_with_key()")


> -EBUSY can typically only happen if gpiod_request_commit() is called twice on
> the same descriptor. Is that the case here?

I have been looking at this today and now I can see that we have a
'gpio-hog' set for the same pins that are shared and hence it is
getting request twice. If I drop the hog it goes away. This is a
produce device-tree, not upstream, for some camera modules so I am
wondering if we are doing something here we should not be. I am
taking a closer look.

Thanks!
Jon

-- 
nvpublic


  reply	other threads:[~2026-03-18 19:09 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-16 13:52 Bartosz Golaszewski
2026-03-17  8:47 ` Linus Walleij
2026-03-17 10:12 ` Jon Hunter
2026-03-17 11:44   ` Bartosz Golaszewski
2026-03-17 12:53     ` Jon Hunter
2026-03-17 13:43       ` Bartosz Golaszewski
2026-03-17 13:46         ` Jon Hunter
2026-03-17 14:05           ` Bartosz Golaszewski
2026-03-17 15:19             ` Bartosz Golaszewski
2026-03-17 22:46               ` Jon Hunter
2026-03-18  8:09                 ` Bartosz Golaszewski
2026-03-18 19:09                   ` Jon Hunter [this message]
2026-03-19  9:41                     ` Bartosz Golaszewski
2026-03-20  4:49                       ` Tzung-Bi Shih
2026-03-20 11:46                         ` Jon Hunter
2026-03-27 13:05   ` Konrad Dybcio
2026-03-17 12:53 ` Jon Hunter
2026-03-17 13:44   ` Bartosz Golaszewski

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=ab009797-3b48-4568-8e80-b10a44b6fac1@nvidia.com \
    --to=jonathanh@nvidia.com \
    --cc=bartosz.golaszewski@oss.qualcomm.com \
    --cc=brgl@kernel.org \
    --cc=linusw@kernel.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tegra@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

all inboxes | Powered by JetHome®