[PATCH v3 3/7] board: rock5b-rk3588: add USB-C controller support

Jonas Karlman jonas at kwiboo.se
Fri Aug 9 11:33:07 CEST 2024


Hi Sebastian,

On 2024-08-03 18:17, Sebastian Reichel wrote:
> Hi Jonas,
> 
> On Fri, Aug 02, 2024 at 10:42:56PM GMT, Jonas Karlman wrote:
>> On 2024-08-02 19:59, Sebastian Reichel wrote:
>>> Enable support for the fusb302 USB Type-C controller.
>>>
>>> This will do early USB PD (power deliver) negotiation, which must happen
>>> within 5 seconds after the USB-C connector has plugged in according to
>>> the specification. It takes almost 5 seconds to go through the bootchain
>>> on Rock 5B and jump to the operating system. When the Linux initializes
>>> the fusb302 usually 20-30 seconds have gone since the device has been
>>> plugged, which is far too late. The USB PD power source reacts with a
>>> hard reset, which disables VBUS for some time. This is not a problem for
>>> a battery driven device, but Rock 5B will loose its power-supply and
>>> reset. By initializing PD in U-Boot, this can be avoided.
>>>
>>> Signed-off-by: Sebastian Reichel <sebastian.reichel at collabora.com>
>>> ---
>>>  board/radxa/rock5b-rk3588/Makefile        |  6 ++++
>>>  board/radxa/rock5b-rk3588/rock5b-rk3588.c | 35 +++++++++++++++++++++++
>>>  2 files changed, 41 insertions(+)
>>>  create mode 100644 board/radxa/rock5b-rk3588/Makefile
>>>  create mode 100644 board/radxa/rock5b-rk3588/rock5b-rk3588.c
>>>
>>> diff --git a/board/radxa/rock5b-rk3588/Makefile b/board/radxa/rock5b-rk3588/Makefile
>>> new file mode 100644
>>> index 000000000000..95d813596da4
>>> --- /dev/null
>>> +++ b/board/radxa/rock5b-rk3588/Makefile
>>> @@ -0,0 +1,6 @@
>>> +# SPDX-License-Identifier:     GPL-2.0+
>>> +#
>>> +# Copyright (c) 2022 Collabora Ltd.
>>> +#
>>> +
>>> +obj-y += rock5b-rk3588.o
>>> diff --git a/board/radxa/rock5b-rk3588/rock5b-rk3588.c b/board/radxa/rock5b-rk3588/rock5b-rk3588.c
>>> new file mode 100644
>>> index 000000000000..1c17ae93c76c
>>> --- /dev/null
>>> +++ b/board/radxa/rock5b-rk3588/rock5b-rk3588.c
>>> @@ -0,0 +1,35 @@
>>> +// SPDX-License-Identifier: GPL-2.0+
>>> +/*
>>> + * Copyright (c) 2023-2024 Collabora Ltd.
>>> + */
>>> +
>>> +#include <usb/tcpm.h>
>>> +
>>> +#ifdef CONFIG_MISC_INIT_R
>>> +int misc_init_r(void)
>>
>> You should not override misc_init_r() here as it will override the
>> rockchip board common misc_init_r() function that read cpuid, set serial
>> and ethernet mac address env vars.

This needs to be addressed if you must add this code.

>>
>> I would suggest you instead of tcpm_get() add something similar to
>>
>> int tcpm_probe_all()
>> {
>> 	struct udevice *dev;
>> 	struct uclass *uc;
>> 	int ret;
>>
>> 	ret = uclass_get(UCLASS_TCPM, &uc);
>> 	if (ret)
>> 		return ret;
>>
>> 	for (ret = uclass_first_device_check(UCLASS_TCPM, &dev);
>> 	     dev;
>> 	     ret = uclass_next_device_check(&dev)) {
>> 		if (ret)
>> 			printf("Failed to probe Type-C controller '%s' (ret=%d)\n",
>> 			       dev->name, ret);
>> 	}
>>
>> 	return 0;
>> }
>>
>> or if we do not care about the error message this could use
>>
>> 	uclass_probe_all(UCLASS_TCPM);
>>
>> and call it from the rockchip board common code in mach-rockchip/board.c
>> directly after the call to regulators_enable_boot_on() in board_init().
>>
>> Alternatively you could call following in a tcpm_post_bind()
>>
>> 	dev_or_flags(dev, DM_FLAG_PROBE_AFTER_BIND);
>>
>> to automatically probe the device as soon as possible after all devices
>> have been bind, this is how the rockchip-io-domain driver does it.
>>
>> Otherwise we need to add custom board code for each board using USB PD,
>> something to avoid.
> 
> All of your suggestions result in any USB-PD controllers being
> probed automatically. I intentionally did not go that way, since
> probing can be quite slow depending on the remote side. For most
> power-supplies it seems to be quite fast, but I've seen a boot
> with one of the supplies being delayed by 2-3 seconds. Seems not
> nice to add this penality for a device not depending on it.

Since you add a cmd you could possible just add a PREBOOT to run that
cmd on boot.

We should try to avoid having to add new code for each board that needs
to negotiate USB PD.

For a more elaborate solution maybe a u-boot specific prop could be
added to the config node, similar to sysreset-gpio,
see doc/device-tree-bindings/config.txt.

Regards,
Jonas

> 
> Greetings,
> 
> -- Sebastian
> 
>>
>> Regards,
>> Jonas
>>
>>> +{
>>> +	struct udevice *dev;
>>> +	int ret;
>>> +
>>> +	/*
>>> +	 * This will do early USB PD (power deliver) negotiation, which must
>>> +	 * happen within 5 seconds after the USB-C connector has plugged in
>>> +	 * according to the specification. It takes almost 5 seconds to go
>>> +	 * through the bootchain on Rock 5B and jump to the operating system.
>>> +	 * When the Linux initializes the fusb302 usually 20-30 seconds have
>>> +	 * gone since the device has been plugged, which is far too late.
>>> +	 *
>>> +	 * The USB PD power source reacts with a hard reset, which disables
>>> +	 * VBUS for some time. This is not a problem for a battery driven
>>> +	 * device, but Rock 5B will loose its power-supply and reset. By
>>> +	 * initializing PD in U-Boot, this can be avoided.
>>> +	 */
>>> +	ret = tcpm_get("usb-typec at 22", &dev);
>>> +	if (ret) {
>>> +		printf("Failed to probe Type-C controller\n");
>>> +		return 0;
>>> +	}
>>> +
>>> +	return 0;
>>> +}
>>> +#endif
>>



More information about the U-Boot mailing list