Hi Guenter, > -----Original Message----- > From: linux-usb-ow...@vger.kernel.org [mailto:linux-usb- > ow...@vger.kernel.org] On Behalf Of Guenter Roeck > Sent: Wednesday, August 24, 2016 5:11 AM > To: Felipe Balbi <felipe.ba...@linux.intel.com> > Cc: Chandra Sekhar Anagani <chandra.sekhar.anag...@intel.com>; Bruce > Ashfield <bruce.ashfi...@windriver.com>; Bin Gao <bin....@intel.com>; > Pranav Tipnis <pranav.tip...@intel.com>; Heikki Krogerus > <heikki.kroge...@linux.intel.com>; linux-kernel@vger.kernel.org; linux- > u...@vger.kernel.org; Guenter Roeck <gro...@chromium.org> > 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 <gro...@chromium.org> > --- > 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? 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; >