[PATCH v2 1/5] usb: tcpm: add core framework
Soeren Moch
smoch at web.de
Sat Jul 13 21:24:10 CEST 2024
On 13.07.24 17:13, Simon Glass wrote:
> 00000000000000000000000000000000000000000000000000000000000000000000Hi
> Sebastian,
>
> On Tue, 4 Jun 2024 at 17:35, Sebastian Reichel
> <sebastian.reichel at collabora.com> wrote:
>> This adds TCPM framework in preparation for fusb302 support, which can
>> handle USB power delivery messages. This is needed to solve issues with
>> devices, that are running from a USB-C port supporting USB-PD, but not
>> having a battery.
>>
>> Such a device currently boots to the kernel without interacting with
>> the power-supply at all. If there are no USB-PD message replies within
>> 5 seconds, the power-supply assumes the peripheral is not capable of
>> USB-PD. It usually takes more than 5 seconds for the system to reach
>> the kernel and probe the I2C based fusb302 chip driver. Thus the
>> system always runs into this state. The power-supply's solution to
>> fix this error state is a hard reset, which involves removing the
>> power from VBUS. Boards without a battery (or huge capacitors) will
>> reset at this point resulting in a boot loop.
>>
>> This imports the TCPM framework from the kernel. The porting has
>> originally been done by Rockchip using hardware timers and the Linux
>> kernel's TCPM code from some years ago.
>>
>> I had a look at upgrading to the latest TCPM kernel code, but that
>> beast became a lot more complex due to adding more USB-C features.
>> I believe these features are not needed in U-Boot and with multiple
>> kthreads and hrtimers being involved it is non-trivial to port them.
>> Instead I worked on stripping down features from the Rockchip port
>> to an even more basic level. Also the TCPM code has been reworked
>> to avoid complete use of any timers (Rockchip used SoC specific
>> hardware timers + IRQ to implement delayed work mechanism). Instead
>> the delayed state changes are handled directly from the poll loop.
>>
>> Note, that (in contrast to the original Rockchip port) the state
>> machine has the same hard reset quirk, that the kernel has - i.e.
>> it avoids disabling the CC pin resistors for devices that are not
>> self-powered. Without that quirk, the Radxa Rock 5B will not just
>> end up doing a machine reset when a hard reset is triggered, but will
>> not even recover, because the CPU will loose power and the FUSB302
>> will keep this state because of leak voltage arriving through the RX
>> serial pin (assuming a serial adapter is connected).
>>
>> This also includes a 'tcpm' command, which can be used to get
>> information about the current state and the negotiated voltage
>> and current.
>>
>> Co-developed-by: Wang Jie <dave.wang at rock-chips.com>
>> Signed-off-by: Wang Jie <dave.wang at rock-chips.com>
>> Signed-off-by: Sebastian Reichel <sebastian.reichel at collabora.com>
>> ---
>> Makefile | 1 +
>> cmd/Kconfig | 7 +
>> cmd/Makefile | 1 +
>> cmd/tcpm.c | 142 ++
>> drivers/usb/Kconfig | 2 +
>> drivers/usb/tcpm/Kconfig | 8 +
>> drivers/usb/tcpm/Makefile | 3 +
>> drivers/usb/tcpm/tcpm-internal.h | 174 +++
>> drivers/usb/tcpm/tcpm-uclass.c | 102 ++
>> drivers/usb/tcpm/tcpm.c | 2251 ++++++++++++++++++++++++++++++
>> include/dm/uclass-id.h | 1 +
>> include/usb/pd.h | 516 +++++++
>> include/usb/tcpm.h | 99 ++
>> 13 files changed, 3307 insertions(+)
>> create mode 100644 cmd/tcpm.c
>> create mode 100644 drivers/usb/tcpm/Kconfig
>> create mode 100644 drivers/usb/tcpm/Makefile
>> create mode 100644 drivers/usb/tcpm/tcpm-internal.h
>> create mode 100644 drivers/usb/tcpm/tcpm-uclass.c
>> create mode 100644 drivers/usb/tcpm/tcpm.c
>> create mode 100644 include/usb/pd.h
>> create mode 100644 include/usb/tcpm.h
> Can you please add docs for the command (and perhaps the whole feature)?
>
> How is this tested?
Asks the developer who caused the most u-boot regressions for me within
the last decade.
Did you notice this is a 5 part series?
It was tested on the board this was developed for. You received a t-b
~5 weeks ago.
Regards,
Soeren
> It should be possible to write a simple i2c
> emulator for the chip as a way to cover this in CI (search for
> UCLASS_I2C_EMUL to see examples).
>
> Regards,
> Simon
More information about the U-Boot
mailing list