On Thu, Sep 29, 2016 at 11:41 PM, Jun Li <jun.li@xxxxxxx> wrote: > Hi, > >> -----Original Message----- >> From: Guenter Roeck [mailto:groeck@xxxxxxxxxx] >> Sent: Friday, September 30, 2016 12:37 AM >> To: Jun Li <jun.li@xxxxxxx> >> Cc: Guenter Roeck <groeck@xxxxxxxxxxxx>; Felipe Balbi >> <felipe.balbi@xxxxxxxxxxxxxxx>; Chandra Sekhar Anagani >> <chandra.sekhar.anagani@xxxxxxxxx>; Bruce Ashfield >> <bruce.ashfield@xxxxxxxxxxxxx>; Bin Gao <bin.gao@xxxxxxxxx>; Pranav Tipnis >> <pranav.tipnis@xxxxxxxxx>; Heikki Krogerus >> <heikki.krogerus@xxxxxxxxxxxxxxx>; linux-kernel@xxxxxxxxxxxxxxx; linux- >> usb@xxxxxxxxxxxxxxx >> 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 <jun.li@xxxxxxx> wrote: >> > Hi Guenter, >> > >> >> -----Original Message----- >> >> From: linux-usb-owner@xxxxxxxxxxxxxxx [mailto:linux-usb- >> >> owner@xxxxxxxxxxxxxxx] On Behalf Of Guenter Roeck >> >> Sent: Wednesday, August 24, 2016 5:11 AM >> >> To: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx> >> >> Cc: Chandra Sekhar Anagani <chandra.sekhar.anagani@xxxxxxxxx>; Bruce >> >> Ashfield <bruce.ashfield@xxxxxxxxxxxxx>; Bin Gao <bin.gao@xxxxxxxxx>; >> >> Pranav Tipnis <pranav.tipnis@xxxxxxxxx>; Heikki Krogerus >> >> <heikki.krogerus@xxxxxxxxxxxxxxx>; linux-kernel@xxxxxxxxxxxxxxx; >> >> linux- usb@xxxxxxxxxxxxxxx; Guenter Roeck <groeck@xxxxxxxxxxxx> >> >> 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 <groeck@xxxxxxxxxxxx> >> >> --- >> >> 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; >> >> -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html