From: Tianling Shen <cnsztl@gmail.com>
To: Quentin Schulz <quentin.schulz@cherry.de>,
Jonas Karlman <jonas@kwiboo.se>
Cc: Kever Yang <kever.yang@rock-chips.com>,
Philipp Tomsich <philipp.tomsich@vrull.eu>,
Simon Glass <sjg@chromium.org>, Tom Rini <trini@konsulko.com>,
"u-boot@lists.denx.de" <u-boot@lists.denx.de>
Subject: Re: [PATCH] rockchip: boot_mode: fix download key detection
Date: Thu, 2 Jul 2026 14:55:14 +0800 [thread overview]
Message-ID: <8eb88c7e-e71b-41e6-bfc8-d0fcd3a2bb84@gmail.com> (raw)
In-Reply-To: <d1471aa7-dc32-45f6-93d0-e55fb278945b@cherry.de>
Hi Quentin,
On 2026/6/26 19:52, Quentin Schulz wrote:
> Hi Tianling, Jonas,
>
> On 6/11/26 9:45 AM, Tianling Shen wrote:
>> Hi Jonas,
>>
>> On 2026/6/10 21:25, Jonas Karlman wrote:
>>> Hi Tianling,
>>>
>>> On 6/10/2026 5:01 AM, Tianling Shen wrote:
>>>> rockchip_dnl_key_pressed() looks for the ADC device by checking
>>>> whether the device name starts with "saradc".
>>>>
>>>> On RK3328, RK3576, RK3588 etc., the SARADC node is named "adc@...",
>>>> so the device name no longer has the "saradc" prefix. As a result,
>>>> U-Boot fails to find the SARADC device and does not sample the
>>>> download key state.
>>>>
>>>> Do not rely on the DT node name. Match the bound Rockchip SARADC
>>>> driver instead, which works for both "saradc@..." and "adc@..."
>>>> node names.
>>>>
>>>> Signed-off-by: Tianling Shen <cnsztl@gmail.com>
>>>> ---
>>>> arch/arm/mach-rockchip/boot_mode.c | 2 +-
>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/arch/arm/mach-rockchip/boot_mode.c b/arch/arm/mach-
>>>> rockchip/boot_mode.c
>>>> index 55e9456668ae..363fad523cbd 100644
>>>> --- a/arch/arm/mach-rockchip/boot_mode.c
>>>> +++ b/arch/arm/mach-rockchip/boot_mode.c
>>>> @@ -51,7 +51,7 @@ __weak int rockchip_dnl_key_pressed(void)
>>>> ret = -ENODEV;
>>>> uclass_foreach_dev(dev, uc) {
>>>> - if (!strncmp(dev->name, "saradc", 6)) {
>>>> + if (!strcmp(dev->driver->name, "rockchip_saradc")) {
>>>
>>> The adc channel used below may not fit all boards/SoCs, so this change
>>> may have unintended consequences.
>>>
>>> I have previously avoided "fixing"/enable this code path for RK35xx
>>> because the download key selection should really be improved when this
>>> is fixed/expanded to more boards/SoCs.
>>>
>>> E.g. maybe add support to declare a recovery button in u-boot,config
>>> node and use UCLASS_BUTTON to check if such button was pressed or
>>> something similar?
>>
>> Yes this is much better than evaluating raw ADC values, but BUTTON is
>> not available in SPL so we cannot have this functionality in SPL
>> (though this idea was already rejected :P).
>>
>
> I'm sorry my memory is failing me, do you have a link maybe to that
> discussion?
Please refer
https://lore.kernel.org/u-boot/fd15b6e4-5525-4ce5-a145-ceb47d44c40e@rock-chips.com/
>
>> I have made an initial version that use UCLASS_BUTTON:
>>
>> ```
>> __weak int rockchip_dnl_key_pressed(void)
>> {
>> #if CONFIG_IS_ENABLED(BUTTON)
>> const char *path;
>> struct udevice *button;
>> ofnode node;
>> int ret;
>>
>> path = ofnode_options_read_str("recovery-key");
>> if (!path)
>> path = ofnode_conf_read_str("u-boot,recovery-key");
>> if (!path)
>> return false;
>>
>> if (path[0] == '/')
>> node = ofnode_path(path);
>> else
>> node = ofnode_get_aliases_node(path);
>>
>> if (!ofnode_valid(node)) {
>> pr_err("%s: invalid recovery key '%s'\n", __func__, path);
>> return false;
>> }
>>
>> ret = uclass_get_device_by_ofnode(UCLASS_BUTTON, node, &button);
>> if (ret) {
>> pr_err("%s: recovery key is not a button: %d\n", __func__, ret);
>> return false;
>> }
>>
>> ret = button_get_state(button);
>> if (ret < 0) {
>> pr_err("%s: failed to read recovery key: %d\n", __func__, ret);
>> return false;
>> }
>>
>> return ret == BUTTON_ON;
>> #else
>> return false;
>> #endif
>> }
>> ```
>>
>> ... so it can be configured in u-boot.dtsi like this:
>> ```
>> / {
>> options {
>> u-boot {
>> recovery-key = "/keys-1/button-recovery";
>
> This should absolutely be a phandle and not a path.
This prop also works with phandle. However most dts from upstream kernel
does not have aliases for button, I have no idea how to refer them by
phandle without modifying original copy.
>
>> };
>> };
>> };
>> ```
>>
>> I have tested this on my DshanPi A1 board and it seems to work okay.
>>
>> Is this an acceptable way to configure recovery key? I'm also wondering
>
> It could be. Typically, when a new property makes it to the device tree,
> it must be documented in the binding. Here it would be part of a u-
> boot,config node, but I couldn't find a binding in U-Boot, Linux kernel
> or the Device Tree spec, so I don't know what we're supposed to do here.
> The button itself will need to be part of the Linux kernel upstream DTS,
> the difficult part will be which event code it needs to return and will
> be board-specific.
So recovery-key prop is added to detect if that button is pressed only.
We don't care the event code.
>
>> if it's necessary to keep compatibility with old
>> adc_channel_single_shot implementation.
>>
>
> Not necessarily, but we absolutely need all boards using this old
> mechanism to be supported by the new mechanism, which may be difficult
> since we don't necessarily have access to their schematics.
I'm not sure how many users are there. This code has been broken for a
long time. I can see a few boards implement their own download key
detection by similar (old) code.
>
> I think we can maybe compromise for now on a Kconfig symbol for the
> channel to use? What do you think? We would still need to check the
> schematics of all boards that exercise this path and check if fixing the
> condition won't cause side effects (because it now is reading the ADC
> channel while it wasn't before due to the typo). The other option is to
> explicitly disable it for all devices that could never meet the
> condition with the typo (so even at SoC level since SARADC is an SoC-
> specific IP) such that it can only be enabled if someone tests it on
> their board.
Honestly I don't want to "improve" this old path if we decide to use the
new config prop. KEY_DOWN_MAX_VAL=30 is also too strict for some boards
(for example the ADC value on DshanPi A1 can be up to 45~47 when the
button is pressed).
Thanks,
Tianling.
>
> Cheers,
> Quentin
prev parent reply other threads:[~2026-07-02 6:55 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-10 3:01 [PATCH] rockchip: boot_mode: fix download key detection Tianling Shen
2026-06-10 13:25 ` Jonas Karlman
2026-06-11 7:45 ` Tianling Shen
2026-06-26 11:52 ` Quentin Schulz
2026-07-02 6:55 ` Tianling Shen [this message]
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=8eb88c7e-e71b-41e6-bfc8-d0fcd3a2bb84@gmail.com \
--to=cnsztl@gmail.com \
--cc=jonas@kwiboo.se \
--cc=kever.yang@rock-chips.com \
--cc=philipp.tomsich@vrull.eu \
--cc=quentin.schulz@cherry.de \
--cc=sjg@chromium.org \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
/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