[BUG] Raxda Rock Pi 4A serial console output stops prematurely
Heinrich Schuchardt
xypron.glpk at gmx.de
Thu Nov 27 13:50:55 CET 2025
On 11/27/25 11:45, Quentin Schulz wrote:
> On 11/27/25 11:35 AM, Quentin Schulz wrote:
>> Hi Heinrich,
>>
>> On 11/26/25 5:46 PM, Heinrich Schuchardt wrote:
>>> On 11/26/25 16:00, Quentin Schulz wrote:
>>>> Hi Heinrich,
>>>>
>>>> On 11/25/25 7:02 PM, Heinrich Schuchardt wrote:
>>>>> Hello Jagan, hello Heiko,
>>>>>
>>>>> When testing U-Boot origin/master on my Raxda Rock Pi 4A serial
>>>>> console output stops after "PMIC: RK808". The same can be observed
>>>>> with v2025.01.
>>>>>
>>>>> The serial console works as expected if I disable
>>>>> CONFIG_ROCKCHIP_IODOMAIN.
>>>>>
>>>>
>>>> It is I believe implied here but asking for confirmation. The board
>>>> doesn't actually boot right? It's not that the serial console is
>>>> gone, it's that the device is stuck?
>>>
>>> Hello Quentin,
>>>
>>> Thank you for looking into this.
>>>
>>> The device boots I. But the serial console output becomes mute and I
>>> cannot send keystrokes via the serial console.
>>>
>>
>> Uh. That is *weird*.
>>
>>>>
>>>>> The problem seems to be specifically related to the bt656-supply.
>>>>> Removing the line below also fixes serial console output:
>>>>>
>>>>> diff --git a/drivers/misc/rockchip-io-domain.c b/drivers/misc/
>>>>> rockchip- io-domain.c
>>>>> index a0573c52193..b0d78f2d4b4 100644
>>>>> --- a/drivers/misc/rockchip-io-domain.c
>>>>> +++ b/drivers/misc/rockchip-io-domain.c
>>>>> @@ -239,7 +239,7 @@ static const struct rockchip_iodomain_soc_data
>>>>> soc_data_rk3328 = {
>>>>> static const struct rockchip_iodomain_soc_data soc_data_rk3399 = {
>>>>> .grf_offset = 0xe640,
>>>>> .supply_names = {
>>>>> - "bt656-supply", /* APIO2_VDD */
>>
>> Reading the code and this diff again, this you shouldn't do at all.
>> The offset in the array is the bit offset for the IO domain setting in
>> the GRF at offset 0xe640. So by removing this line, you configured
>> APIO2 IO domain with APIO5 settings (audio-supply).
>>
>> It would be better to write NULL instead, so that the others are tried
>> and we can pinpoint the faulty one.
>>
>>>>>
>>>>
>>>> The UART2 (which I assume is the serial you're using for the
>>>> console) isn't on that IO domain. And there doesn't seem to be
>>>> anything important to booting on APIO2 domain according to Rock 4A
>>>> schematics[1].
>>>>
>>>> bt656-supply also doesn't seem to be anything special. LDO5
>>>> (vcc_3v0) on RK808, which is using VCC10 (vcc10-supply) which is a
>>>> fixed regulator whose parent supply is also a fixed regulator. So I
>>>> am not sure what could be going wrong there.
>>>
>>> In the schema LD05 on the RK808 is connected to VCC_1V5.
>>>
>>
>> Sorry, I meant to say LDO8.
>>
>>> With any of the following values I can enter commands via serial
>>> console but still get no output. So none of the voltages seems to be
>>> the correct one.
>>>
>>> diff --git a/dts/upstream/src/arm64/rockchip/rk3399-rock-pi-4.dtsi b/
>>> dts/upstream/src/arm64/rockchip/rk3399-rock-pi-4.dtsi
>>> index 046dbe32901..f15b5b63815 100644
>>> --- a/dts/upstream/src/arm64/rockchip/rk3399-rock-pi-4.dtsi
>>> +++ b/dts/upstream/src/arm64/rockchip/rk3399-rock-pi-4.dtsi
>>> @@ -517,7 +517,7 @@
>>>
>>> &io_domains {
>>> audio-supply = <&vcca1v8_codec>;
>>> - bt656-supply = <&vcc_3v0>;
>>> + bt656-supply = <&vcc_1v5>;
>>> or
>>> + bt656-supply = <&vcc_0v9>;
>>> or
>>> + bt656-supply = <&vcc_1v8>;
>>>
>>>>
>>>> RK3399 Puma and RockPro64 have APIO2 set to 1.8V vs 3.0V for Radxa
>>>> Rock 4A. Puma boots master reaches U-Boot CLI with the IO domain
>>>> driver compiled in.
>>>>
>>>> Can you check the error paths (all the ones with a continue;) in
>>>> rockchip_iodomain_probe()? Which ones do you enter for which supply?
>>>>
>>>> Not sure where to start debugging tbh.
>>>
>>> I found the driver by setting CONFIG_LOG=y and log level 7.
>>>
>>> Here is how the console output ends. Do you have access to a board or
>>> do you need further debug output?
>>>
>>> ofnode_find_subnode: regulator-state-mem: regulator-state-mem:
>>> regulator-state-mem
>>> regulator-state-mem
>>> ofnode_read_bool: regulator-off-in-suspend: true
>>> ofnode_read_u32_index: regulator-suspend-microvolt:
>>> of_read_u32_index: regulator-suspend-microvolt: (not found)
>>> ofnode_read_prop: assigned-clock-rates: <not found>
>>> ofnode_read_u32_index: regulator-min-microvolt: of_read_u32_index:
>>> regulator-min-microvolt: (not found)
>>> ofnode_read_u32_index: regulator-max-microvolt: of_read_u32_index:
>>> regulator-max-microvolt: (not found)
>>> ofnode_read_u32_index: regulator-init-microvolt: of_read_u32_index:
>>> regulator-init-microvolt: (not found)
>>> ofnode_read_u32_index: regulator-min-microamp: of_read_u32_index:
>>> regulator-min-microamp: (not found)
>>> ofnode_read_u32_index: regulator-max-microamp: of_read_u32_index:
>>> regulator-max-microamp: (not found)
>>> ofnode_read_u32_index: regulator-ramp-delay: of_read_u32_index:
>>> regulator-ramp-delay: (not found)
>>> ofnode_read_bool: regulator-force-boot-off: false
>>> ofnode_find_subnode: regulator-state-mem: regulator-state-mem:
>>> regulator-state-mem
>>> regulator-state-mem
>>> ofnode_read_bool: regulator-off-in-suspend: true
>>> ofnode_read_u32_index: regulator-suspend-microvolt:
>>> of_read_u32_index: regulator-suspend-microvolt: (not found)
>>> ofnode_read_prop: assigned-clock-rates: <not found>
>>> ofnode_read_u32_index: regulator-min-microvolt: of_read_u32_index:
>>> regulator-min-microvolt: (not found)
>>> ofnode_read_u32_index: regulator-max-microvolt: of_read_u32_index:
>>> regulator-max-microvolt: (not found)
>>> ofnode_read_u32_index: regulator-init-microvolt: of_read_u32_index:
>>> regulator-init-microvolt: (not found)
>>> ofnode_read_u32_index: regulator-min-microamp: of_read_u32_index:
>>> regulator-min-microamp: (not found)
>>> ofnode_read_u32_index: regulator-max-microamp: of_read_u32_index:
>>> regulator-max-microamp: (not found)
>>> ofnode_read_u32_index: regulator-ramp-delay: of_read_u32_index:
>>> regulator-ramp-delay: (not found)
>>> ofnode_read_bool: regulator-force-boot-off: false
>>> ofnode_find_subnode: regulator-state-mem: regulator-state-mem:
>>> regulator-state-mem
>>> regulator-state-mem
>>> ofnode_read_bool: regulator-off-in-suspend: true
>>> ofnode_read_u32_index: regulator-suspend-microvolt:
>>> of_read_u32_index: regulator-suspend-microvolt: (not found)
>>> ofnode_read_prop: assigned-clock-rates: <not found>
>>> ofnode_read_prop: assigned-clock-rates: <not found>
>>> ofnode_read_u32_index: bt656-supply: of_read_u32_index: bt656-supply:
>>> 0x7a (122)
>>> rockchip_iodomain io-domains: bt656-supply: Regulator LDO_REG8 at
>>> 3000000 uV
>>> ofnode_read_u32_index: audio-supply: of_read_u32_index: audio-supply:
>>> 0x91 (145)
>>> rockchip_iodomain io-domains: audio-supply: Regulator LDO_REG1 at
>>> 1800000 uV
>>> ofnode_read_u32_index: sdmmc-supply: of_read_u32_ at L@@p0b at HHb```Hp0
>>> p0 $
>>>
>>
>> This seems to highlight the issue is rather audio-supply.
>>
>> And indeed, audio-supply should be vcc_3v0 and not vcca1v8_codec.
>>
>
> Mmmmmm, upstream kernel has 8240e87f16d1 ("arm64: dts: rockchip: fix
> audio-supply for Rock Pi 4"). So it seems it "fixed" something.
>
> So before I send a revert to the kernel and start an endless thread, can
> you test locally that the following indeed fixes it?
>
> diff --git a/arch/arm/dts/rk3399-rock-pi-4-u-boot.dtsi b/arch/arm/dts/
> rk3399-rock-pi-4-u-boot.dtsi
> index 4861574636e..dccc469a507 100644
> --- a/arch/arm/dts/rk3399-rock-pi-4-u-boot.dtsi
> +++ b/arch/arm/dts/rk3399-rock-pi-4-u-boot.dtsi
> @@ -14,6 +14,10 @@
> };
> };
>
> +&io_domains {
> + audio-supply = <&vcc_3v0>;
> +};
> +
> &sdhci {
> cap-mmc-highspeed;
> mmc-ddr-1_8v;
>
>
> Cheers,
> Quentin
Hello Quentin,
With the diff applied my U-Boot serial console works.
I checked the u-boot.dtb: audio-supply now points to
LDO_REG8 { regulator-name = "vcc_3v0";}
as expected.
CCing Alex
Best regards
Heinrich
More information about the U-Boot
mailing list