[PATCH v1 3/3] usb: tcpm: fix toggling in host (SRC) mode

Maxim Kiselev bigunclemax at gmail.com
Wed Nov 6 17:10:47 CET 2024


Hi,

пт, 1 нояб. 2024 г. в 21:32, Sebastian Reichel
<sebastian.reichel at collabora.com>:
>
> Hi,
>
> On Fri, Nov 01, 2024 at 01:34:52PM +0300, bigunclemax at gmail.com wrote:
> > From: Maksim Kiselev <bigunclemax at gmail.com>
> >
> > PU\PD resistors on CC lines must be configured before running the TCPM
> > state machine.
> >
> > Also, when the Type-C port acts as a host (SRC), the VBUS sould be enabled
> > only after the toggling has been completed. And we have to wait for
> > the corresponding IRQ to finish the toggling process. But this doesn't
> > happen because we exit from tcpm_poll_event() if VBUS != OK.
> >
> > So, Let's check for VBUS state only when the port acts as a host (SRC)
> > to solve this problem.
> >
> > Signed-off-by: Maksim Kiselev <bigunclemax at gmail.com>
> > ---
>
> I will look into this patch next week and give it a try on the Rock
> 5B. As a first feedback the commit message seems to confuse data and
> power roles. SRC (source) and SNK (sink) are for the power direction
> while "host" and "device" are used for the data direction. With
> USB-PD these are independent from each other.

Yes, you're right. I'll drop a host mention from the commit message in
the next version.
This patch is for the case when our board acts as a source (SRC).

Best wishes,
Maksim

> You seem to have the
> old USB model in mind where e.g. a USB keyboard ("device") gets
> power from the PC ("host"). But USB-PD allows setups like a USB-C
> hub ("device") having its own power-supply and providing a laptop
> ("host") with power.
>
> Greetings,
>
> -- Sebastian
>
> >  drivers/usb/tcpm/tcpm.c | 8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/usb/tcpm/tcpm.c b/drivers/usb/tcpm/tcpm.c
> > index 0aee57cb2f4..c9f8dbdc795 100644
> > --- a/drivers/usb/tcpm/tcpm.c
> > +++ b/drivers/usb/tcpm/tcpm.c
> > @@ -2122,6 +2122,12 @@ static void tcpm_init(struct udevice *dev)
> >       else
> >               port->vbus_vsafe0v = true;
> >
> > +     if (port->self_powered)
> > +             tcpm_set_cc(dev, TYPEC_CC_OPEN);
> > +     else
> > +             tcpm_set_cc(dev, tcpm_default_state(port) == SNK_UNATTACHED ?
> > +                             TYPEC_CC_RD : tcpm_rp_cc(port));
> > +
> >       tcpm_set_state(dev, tcpm_default_state(port), 0);
> >
> >       if (drvops->get_cc(dev, &cc1, &cc2) == 0)
> > @@ -2234,7 +2240,7 @@ static void tcpm_poll_event(struct udevice *dev)
> >       const struct dm_tcpm_ops *drvops = dev_get_driver_ops(dev);
> >       struct tcpm_port *port = dev_get_uclass_plat(dev);
> >
> > -     if (!drvops->get_vbus(dev))
> > +     if (!drvops->get_vbus(dev) && (tcpm_default_state(port) == SNK_UNATTACHED))
> >               return;
> >
> >       while (port->poll_event_cnt < TCPM_POLL_EVENT_TIME_OUT) {
> > --
> > 2.45.2
> >


More information about the U-Boot mailing list