usb: typec: API for controlling USB Type-C Multiplexers
USB Type-C connectors consist of various muxes and switches that route the pins on the connector to the right locations. The USB Type-C drivers need to be able to control the muxes, as they are the ones that know things like the cable plug orientation, and the current mode that was negotiated with the partner. This introduces a small API for registering and controlling cable plug orientation switches, and separate small API for registering and controlling pin multiplexer/demultiplexer switches that are needed with Accessory/Alternate Modes. Reviewed-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
f2d9b66d84
commit
bdecb33af3
@@ -61,7 +61,7 @@ Registering the ports
|
||||
The port drivers will describe every Type-C port they control with struct
|
||||
typec_capability data structure, and register them with the following API:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
.. kernel-doc:: drivers/usb/typec/class.c
|
||||
:functions: typec_register_port typec_unregister_port
|
||||
|
||||
When registering the ports, the prefer_role member in struct typec_capability
|
||||
@@ -80,7 +80,7 @@ typec_partner_desc. The class copies the details of the partner during
|
||||
registration. The class offers the following API for registering/unregistering
|
||||
partners.
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
.. kernel-doc:: drivers/usb/typec/class.c
|
||||
:functions: typec_register_partner typec_unregister_partner
|
||||
|
||||
The class will provide a handle to struct typec_partner if the registration was
|
||||
@@ -92,7 +92,7 @@ should include handle to struct usb_pd_identity instance. The class will then
|
||||
create a sysfs directory for the identity under the partner device. The result
|
||||
of Discover Identity command can then be reported with the following API:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
.. kernel-doc:: drivers/usb/typec/class.c
|
||||
:functions: typec_partner_set_identity
|
||||
|
||||
Registering Cables
|
||||
@@ -113,7 +113,7 @@ typec_cable_desc and about a plug in struct typec_plug_desc. The class copies
|
||||
the details during registration. The class offers the following API for
|
||||
registering/unregistering cables and their plugs:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
.. kernel-doc:: drivers/usb/typec/class.c
|
||||
:functions: typec_register_cable typec_unregister_cable typec_register_plug typec_unregister_plug
|
||||
|
||||
The class will provide a handle to struct typec_cable and struct typec_plug if
|
||||
@@ -125,7 +125,7 @@ include handle to struct usb_pd_identity instance. The class will then create a
|
||||
sysfs directory for the identity under the cable device. The result of Discover
|
||||
Identity command can then be reported with the following API:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
.. kernel-doc:: drivers/usb/typec/class.c
|
||||
:functions: typec_cable_set_identity
|
||||
|
||||
Notifications
|
||||
@@ -135,7 +135,7 @@ When the partner has executed a role change, or when the default roles change
|
||||
during connection of a partner or cable, the port driver must use the following
|
||||
APIs to report it to the class:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
.. kernel-doc:: drivers/usb/typec/class.c
|
||||
:functions: typec_set_data_role typec_set_pwr_role typec_set_vconn_role typec_set_pwr_opmode
|
||||
|
||||
Alternate Modes
|
||||
@@ -150,7 +150,7 @@ and struct typec_altmode_desc which is a container for all the supported modes.
|
||||
Ports that support Alternate Modes need to register each SVID they support with
|
||||
the following API:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
.. kernel-doc:: drivers/usb/typec/class.c
|
||||
:functions: typec_port_register_altmode
|
||||
|
||||
If a partner or cable plug provides a list of SVIDs as response to USB Power
|
||||
@@ -159,12 +159,12 @@ registered.
|
||||
|
||||
API for the partners:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
.. kernel-doc:: drivers/usb/typec/class.c
|
||||
:functions: typec_partner_register_altmode
|
||||
|
||||
API for the Cable Plugs:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
.. kernel-doc:: drivers/usb/typec/class.c
|
||||
:functions: typec_plug_register_altmode
|
||||
|
||||
So ports, partners and cable plugs will register the alternate modes with their
|
||||
@@ -172,11 +172,62 @@ own functions, but the registration will always return a handle to struct
|
||||
typec_altmode on success, or NULL. The unregistration will happen with the same
|
||||
function:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
.. kernel-doc:: drivers/usb/typec/class.c
|
||||
:functions: typec_unregister_altmode
|
||||
|
||||
If a partner or cable plug enters or exits a mode, the port driver needs to
|
||||
notify the class with the following API:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
.. kernel-doc:: drivers/usb/typec/class.c
|
||||
:functions: typec_altmode_update_active
|
||||
|
||||
Multiplexer/DeMultiplexer Switches
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
USB Type-C connectors may have one or more mux/demux switches behind them. Since
|
||||
the plugs can be inserted right-side-up or upside-down, a switch is needed to
|
||||
route the correct data pairs from the connector to the USB controllers. If
|
||||
Alternate or Accessory Modes are supported, another switch is needed that can
|
||||
route the pins on the connector to some other component besides USB. USB Type-C
|
||||
Connector Class supplies an API for registering those switches.
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/mux.c
|
||||
:functions: typec_switch_register typec_switch_unregister typec_mux_register typec_mux_unregister
|
||||
|
||||
In most cases the same physical mux will handle both the orientation and mode.
|
||||
However, as the port drivers will be responsible for the orientation, and the
|
||||
alternate mode drivers for the mode, the two are always separated into their
|
||||
own logical components: "mux" for the mode and "switch" for the orientation.
|
||||
|
||||
When a port is registered, USB Type-C Connector Class requests both the mux and
|
||||
the switch for the port. The drivers can then use the following API for
|
||||
controlling them:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/class.c
|
||||
:functions: typec_set_orientation typec_set_mode
|
||||
|
||||
If the connector is dual-role capable, there may also be a switch for the data
|
||||
role. USB Type-C Connector Class does not supply separate API for them. The
|
||||
port drivers can use USB Role Class API with those.
|
||||
|
||||
Illustration of the muxes behind a connector that supports an alternate mode:
|
||||
|
||||
------------------------
|
||||
| Connector |
|
||||
------------------------
|
||||
| |
|
||||
------------------------
|
||||
\ Orientation /
|
||||
--------------------
|
||||
|
|
||||
--------------------
|
||||
/ Mode \
|
||||
------------------------
|
||||
/ \
|
||||
------------------------ --------------------
|
||||
| Alt Mode | / USB Role \
|
||||
------------------------ ------------------------
|
||||
/ \
|
||||
------------------------ ------------------------
|
||||
| USB Host | | USB Device |
|
||||
------------------------ ------------------------
|
||||
|
Reference in New Issue
Block a user