On Thu, Sep 29, 2016 at 11:41 PM, Jun Li <[email protected]> wrote: > Hi, > >> -----Original Message----- >> From: Guenter Roeck [mailto:[email protected]] >> Sent: Friday, September 30, 2016 12:37 AM >> To: Jun Li <[email protected]> >> Cc: Guenter Roeck <[email protected]>; Felipe Balbi >> <[email protected]>; Chandra Sekhar Anagani >> <[email protected]>; Bruce Ashfield >> <[email protected]>; Bin Gao <[email protected]>; Pranav Tipnis >> <[email protected]>; Heikki Krogerus >> <[email protected]>; [email protected]; linux- >> [email protected] >> Subject: Re: [RFC PATCH v3 1/2] usb: typec: USB Type-C Port Manager (tcpm) >> >> On Thu, Sep 29, 2016 at 7:35 AM, Jun Li <[email protected]> wrote: >> > Hi Guenter, >> > >> >> -----Original Message----- >> >> From: [email protected] [mailto:linux-usb- >> >> [email protected]] On Behalf Of Guenter Roeck >> >> Sent: Wednesday, August 24, 2016 5:11 AM >> >> To: Felipe Balbi <[email protected]> >> >> Cc: Chandra Sekhar Anagani <[email protected]>; Bruce >> >> Ashfield <[email protected]>; Bin Gao <[email protected]>; >> >> Pranav Tipnis <[email protected]>; Heikki Krogerus >> >> <[email protected]>; [email protected]; >> >> linux- [email protected]; Guenter Roeck <[email protected]> >> >> Subject: [RFC PATCH v3 1/2] usb: typec: USB Type-C Port Manager >> >> (tcpm) >> >> >> >> This driver implements the USB Type-C Power Delivery state machine >> >> for both source and sink ports. Alternate mode support is not fully >> >> implemented. >> >> >> >> The driver attaches to the USB Type-C class code implemented in the >> >> following patches. >> >> >> >> usb: typec: add driver for Intel Whiskey Cove PMIC USB Type-C PHY >> >> usb: USB Type-C connector class >> >> >> >> This driver only implements the state machine. Lower level drivers >> >> are responsible for >> >> - Reporting VBUS status and activating VBUS >> >> - Setting CC lines and providing CC line status >> >> - Setting line polarity >> >> - Activating and deactivating VCONN >> >> - Setting the current limit >> >> - Activating and deactivating PD message transfers >> >> - Sending and receiving PD messages >> >> >> >> The driver provides both a functional API as well as callbacks for >> >> lower level drivers. >> >> >> >> Signed-off-by: Guenter Roeck <[email protected]> >> >> --- >> >> v3: >> >> - Improve TCPM state machine resiliency if there are spurious CC line >> >> changes >> >> while the state machine is in a transient change (waiting for a >> >> timeout) >> >> - Update current limit after CC voltage level changes on a port which >> >> is not >> >> PD capable. >> >> >> >> v2: >> >> - Only update polarity if setting it was successful >> >> If setting the CC line polarity in the driver was not successful, >> >> don't update the internal polarity state. >> >> - All PD messages are little endian; convert to and from CPU endianness. >> >> - Avoid comparisons against NULL. >> >> - Use u8/u16/u32 instead of uint8_t/uint16_t/uint32_t consistently. >> >> - Callbacks into tcpm need to be lockless to avoid timing problems >> >> in low level drivers. >> >> - Simplify callbacks; tcpm can request the current state of cc/vbus >> >> when it is ready to use it. >> >> >> >> drivers/usb/typec/Kconfig | 7 + >> >> drivers/usb/typec/Makefile | 1 + >> >> drivers/usb/typec/tcpm.c | 3163 >> >> ++++++++++++++++++++++++++++++++++++++++++++ >> >> drivers/usb/typec/tcpm.h | 137 ++ >> >> include/linux/usb/pd.h | 282 ++++ >> >> include/linux/usb/pd_bdo.h | 31 + >> >> include/linux/usb/pd_vdo.h | 412 ++++++ >> >> 7 files changed, 4033 insertions(+) >> >> create mode 100644 drivers/usb/typec/tcpm.c create mode 100644 >> >> drivers/usb/typec/tcpm.h create mode 100644 include/linux/usb/pd.h >> >> create mode 100644 include/linux/usb/pd_bdo.h create mode 100644 >> >> include/linux/usb/pd_vdo.h >> >> >> > >> > ... >> > >> >> + >> >> +static void run_state_machine(struct tcpm_port *port) { >> >> + int ret; >> >> + >> >> + port->enter_state = port->state; >> >> + switch (port->state) { >> >> + /* SRC states */ >> >> + case SRC_UNATTACHED: >> >> + tcpm_swap_complete(port, -ENOTCONN); >> >> + tcpm_src_detach(port); >> >> + tcpm_set_cc(port, TYPEC_CC_RP_DEF); >> >> + if (port->typec_caps.type == TYPEC_PORT_DRP) >> >> + tcpm_set_state(port, SNK_UNATTACHED, >> >> + PD_T_DRP_SNK); >> > >> > With this and below, after disconnect, the DRP port state machine will >> > be in infinite loop of state transition between SRC_UNATTACHED <--> >> > SNK_UNATTACHED, correct? >> > >> >> Only while disconnected. It tries to alternatively connect as source and >> as sink (being configured as DRP). Once a CC line state change is reported >> it will transition out. I have a newer version of the patch (not yet >> published) which supports DRP toggling by the TCPC. With that enabled, >> TCPM does not change states until a CC state change is reported. >> > Great, that way will be better, do you plan post your newer patch recently? >
I should be able to send out a new version early next week, after applying and testing your suggested changes. I'll also try to make a test branch available in my repository at kernel.org. Guenter > Thanks > Li Jun > >> Guenter >> >> > Li Jun >> > ... >> > >> >> + /* SNK states */ >> >> + case SNK_UNATTACHED: >> >> + tcpm_swap_complete(port, -ENOTCONN); >> >> + tcpm_snk_detach(port); >> >> + tcpm_set_cc(port, TYPEC_CC_RD); >> >> + if (port->typec_caps.type == TYPEC_PORT_DRP) >> >> + tcpm_set_state(port, SRC_UNATTACHED, >> PD_T_DRP_SRC); >> >> + break; >> >>

