aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/driver-api
diff options
context:
space:
mode:
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>2018-03-20 08:57:03 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-03-22 08:40:10 -0400
commitbdecb33af34f79cbfbb656661210f77c8b8b5b5f (patch)
tree057621e106f12ad7de132ebc5064c255f67a19c4 /Documentation/driver-api
parentf2d9b66d84f3ff5ea3aff111e6a403e04fa8bf37 (diff)
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>
Diffstat (limited to 'Documentation/driver-api')
-rw-r--r--Documentation/driver-api/usb/typec.rst73
1 files changed, 62 insertions, 11 deletions
diff --git a/Documentation/driver-api/usb/typec.rst b/Documentation/driver-api/usb/typec.rst
index 8a7249f2ff04..feb31946490b 100644
--- a/Documentation/driver-api/usb/typec.rst
+++ b/Documentation/driver-api/usb/typec.rst
@@ -61,7 +61,7 @@ Registering the ports
61The port drivers will describe every Type-C port they control with struct 61The port drivers will describe every Type-C port they control with struct
62typec_capability data structure, and register them with the following API: 62typec_capability data structure, and register them with the following API:
63 63
64.. kernel-doc:: drivers/usb/typec/typec.c 64.. kernel-doc:: drivers/usb/typec/class.c
65 :functions: typec_register_port typec_unregister_port 65 :functions: typec_register_port typec_unregister_port
66 66
67When registering the ports, the prefer_role member in struct typec_capability 67When 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
80registration. The class offers the following API for registering/unregistering 80registration. The class offers the following API for registering/unregistering
81partners. 81partners.
82 82
83.. kernel-doc:: drivers/usb/typec/typec.c 83.. kernel-doc:: drivers/usb/typec/class.c
84 :functions: typec_register_partner typec_unregister_partner 84 :functions: typec_register_partner typec_unregister_partner
85 85
86The class will provide a handle to struct typec_partner if the registration was 86The 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
92create a sysfs directory for the identity under the partner device. The result 92create a sysfs directory for the identity under the partner device. The result
93of Discover Identity command can then be reported with the following API: 93of Discover Identity command can then be reported with the following API:
94 94
95.. kernel-doc:: drivers/usb/typec/typec.c 95.. kernel-doc:: drivers/usb/typec/class.c
96 :functions: typec_partner_set_identity 96 :functions: typec_partner_set_identity
97 97
98Registering Cables 98Registering Cables
@@ -113,7 +113,7 @@ typec_cable_desc and about a plug in struct typec_plug_desc. The class copies
113the details during registration. The class offers the following API for 113the details during registration. The class offers the following API for
114registering/unregistering cables and their plugs: 114registering/unregistering cables and their plugs:
115 115
116.. kernel-doc:: drivers/usb/typec/typec.c 116.. kernel-doc:: drivers/usb/typec/class.c
117 :functions: typec_register_cable typec_unregister_cable typec_register_plug typec_unregister_plug 117 :functions: typec_register_cable typec_unregister_cable typec_register_plug typec_unregister_plug
118 118
119The class will provide a handle to struct typec_cable and struct typec_plug if 119The 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
125sysfs directory for the identity under the cable device. The result of Discover 125sysfs directory for the identity under the cable device. The result of Discover
126Identity command can then be reported with the following API: 126Identity command can then be reported with the following API:
127 127
128.. kernel-doc:: drivers/usb/typec/typec.c 128.. kernel-doc:: drivers/usb/typec/class.c
129 :functions: typec_cable_set_identity 129 :functions: typec_cable_set_identity
130 130
131Notifications 131Notifications
@@ -135,7 +135,7 @@ When the partner has executed a role change, or when the default roles change
135during connection of a partner or cable, the port driver must use the following 135during connection of a partner or cable, the port driver must use the following
136APIs to report it to the class: 136APIs to report it to the class:
137 137
138.. kernel-doc:: drivers/usb/typec/typec.c 138.. kernel-doc:: drivers/usb/typec/class.c
139 :functions: typec_set_data_role typec_set_pwr_role typec_set_vconn_role typec_set_pwr_opmode 139 :functions: typec_set_data_role typec_set_pwr_role typec_set_vconn_role typec_set_pwr_opmode
140 140
141Alternate Modes 141Alternate Modes
@@ -150,7 +150,7 @@ and struct typec_altmode_desc which is a container for all the supported modes.
150Ports that support Alternate Modes need to register each SVID they support with 150Ports that support Alternate Modes need to register each SVID they support with
151the following API: 151the following API:
152 152
153.. kernel-doc:: drivers/usb/typec/typec.c 153.. kernel-doc:: drivers/usb/typec/class.c
154 :functions: typec_port_register_altmode 154 :functions: typec_port_register_altmode
155 155
156If a partner or cable plug provides a list of SVIDs as response to USB Power 156If a partner or cable plug provides a list of SVIDs as response to USB Power
@@ -159,12 +159,12 @@ registered.
159 159
160API for the partners: 160API for the partners:
161 161
162.. kernel-doc:: drivers/usb/typec/typec.c 162.. kernel-doc:: drivers/usb/typec/class.c
163 :functions: typec_partner_register_altmode 163 :functions: typec_partner_register_altmode
164 164
165API for the Cable Plugs: 165API for the Cable Plugs:
166 166
167.. kernel-doc:: drivers/usb/typec/typec.c 167.. kernel-doc:: drivers/usb/typec/class.c
168 :functions: typec_plug_register_altmode 168 :functions: typec_plug_register_altmode
169 169
170So ports, partners and cable plugs will register the alternate modes with their 170So 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
172typec_altmode on success, or NULL. The unregistration will happen with the same 172typec_altmode on success, or NULL. The unregistration will happen with the same
173function: 173function:
174 174
175.. kernel-doc:: drivers/usb/typec/typec.c 175.. kernel-doc:: drivers/usb/typec/class.c
176 :functions: typec_unregister_altmode 176 :functions: typec_unregister_altmode
177 177
178If a partner or cable plug enters or exits a mode, the port driver needs to 178If a partner or cable plug enters or exits a mode, the port driver needs to
179notify the class with the following API: 179notify the class with the following API:
180 180
181.. kernel-doc:: drivers/usb/typec/typec.c 181.. kernel-doc:: drivers/usb/typec/class.c
182 :functions: typec_altmode_update_active 182 :functions: typec_altmode_update_active
183
184Multiplexer/DeMultiplexer Switches
185~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
186
187USB Type-C connectors may have one or more mux/demux switches behind them. Since
188the plugs can be inserted right-side-up or upside-down, a switch is needed to
189route the correct data pairs from the connector to the USB controllers. If
190Alternate or Accessory Modes are supported, another switch is needed that can
191route the pins on the connector to some other component besides USB. USB Type-C
192Connector Class supplies an API for registering those switches.
193
194.. kernel-doc:: drivers/usb/typec/mux.c
195 :functions: typec_switch_register typec_switch_unregister typec_mux_register typec_mux_unregister
196
197In most cases the same physical mux will handle both the orientation and mode.
198However, as the port drivers will be responsible for the orientation, and the
199alternate mode drivers for the mode, the two are always separated into their
200own logical components: "mux" for the mode and "switch" for the orientation.
201
202When a port is registered, USB Type-C Connector Class requests both the mux and
203the switch for the port. The drivers can then use the following API for
204controlling them:
205
206.. kernel-doc:: drivers/usb/typec/class.c
207 :functions: typec_set_orientation typec_set_mode
208
209If the connector is dual-role capable, there may also be a switch for the data
210role. USB Type-C Connector Class does not supply separate API for them. The
211port drivers can use USB Role Class API with those.
212
213Illustration of the muxes behind a connector that supports an alternate mode:
214
215 ------------------------
216 | Connector |
217 ------------------------
218 | |
219 ------------------------
220 \ Orientation /
221 --------------------
222 |
223 --------------------
224 / Mode \
225 ------------------------
226 / \
227 ------------------------ --------------------
228 | Alt Mode | / USB Role \
229 ------------------------ ------------------------
230 / \
231 ------------------------ ------------------------
232 | USB Host | | USB Device |
233 ------------------------ ------------------------