hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/include/linux/usb/typec.h
....@@ -4,11 +4,15 @@
44 #define __LINUX_USB_TYPEC_H
55
66 #include <linux/types.h>
7
+#include <linux/android_kabi.h>
78
89 /* USB Type-C Specification releases */
910 #define USB_TYPEC_REV_1_0 0x100 /* 1.0 */
1011 #define USB_TYPEC_REV_1_1 0x110 /* 1.1 */
1112 #define USB_TYPEC_REV_1_2 0x120 /* 1.2 */
13
+#define USB_TYPEC_REV_1_3 0x130 /* 1.3 */
14
+#define USB_TYPEC_REV_1_4 0x140 /* 1.4 */
15
+#define USB_TYPEC_REV_2_0 0x200 /* 2.0 */
1216
1317 struct typec_partner;
1418 struct typec_cable;
....@@ -71,11 +75,25 @@
7175 };
7276
7377 /*
78
+ * struct enter_usb_data - Enter_USB Message details
79
+ * @eudo: Enter_USB Data Object
80
+ * @active_link_training: Active Cable Plug Link Training
81
+ *
82
+ * @active_link_training is a flag that should be set with uni-directional SBRX
83
+ * communication, and left 0 with passive cables and with bi-directional SBRX
84
+ * communication.
85
+ */
86
+struct enter_usb_data {
87
+ u32 eudo;
88
+ unsigned char active_link_training:1;
89
+};
90
+
91
+/*
7492 * struct usb_pd_identity - USB Power Delivery identity data
7593 * @id_header: ID Header VDO
7694 * @cert_stat: Cert Stat VDO
7795 * @product: Product VDO
78
- * @product_type: Product type VDO
96
+ * @vdo: Product Type Specific VDOs
7997 *
8098 * USB power delivery Discover Identity command response data.
8199 *
....@@ -86,7 +104,7 @@
86104 u32 id_header;
87105 u32 cert_stat;
88106 u32 product;
89
- u32 product_type;
107
+ u32 vdo[3];
90108 };
91109
92110 int typec_partner_set_identity(struct typec_partner *partner);
....@@ -110,9 +128,12 @@
110128 enum typec_port_data roles;
111129 };
112130
131
+void typec_partner_set_pd_revision(struct typec_partner *partner, u16 pd_revision);
132
+int typec_partner_set_num_altmodes(struct typec_partner *partner, int num_altmodes);
113133 struct typec_altmode
114134 *typec_partner_register_altmode(struct typec_partner *partner,
115135 const struct typec_altmode_desc *desc);
136
+int typec_plug_set_num_altmodes(struct typec_plug *plug, int num_altmodes);
116137 struct typec_altmode
117138 *typec_plug_register_altmode(struct typec_plug *plug,
118139 const struct typec_altmode_desc *desc);
....@@ -151,6 +172,7 @@
151172 * @type: The plug type from USB PD Cable VDO
152173 * @active: Is the cable active or passive
153174 * @identity: Result of Discover Identity command
175
+ * @pd_revision: USB Power Delivery Specification revision if supported
154176 *
155177 * Represents USB Type-C Cable attached to USB Type-C port.
156178 */
....@@ -158,6 +180,8 @@
158180 enum typec_plug_type type;
159181 unsigned int active:1;
160182 struct usb_pd_identity *identity;
183
+ u16 pd_revision; /* 0300H = "3.0" */
184
+
161185 };
162186
163187 /*
....@@ -165,15 +189,46 @@
165189 * @usb_pd: USB Power Delivery support
166190 * @accessory: Audio, Debug or none.
167191 * @identity: Discover Identity command data
192
+ * @pd_revision: USB Power Delivery Specification Revision if supported
168193 *
169194 * Details about a partner that is attached to USB Type-C port. If @identity
170195 * member exists when partner is registered, a directory named "identity" is
171196 * created to sysfs for the partner device.
197
+ *
198
+ * @pd_revision is based on the setting of the "Specification Revision" field
199
+ * in the message header on the initial "Source Capabilities" message received
200
+ * from the partner, or a "Request" message received from the partner, depending
201
+ * on whether our port is a Sink or a Source.
172202 */
173203 struct typec_partner_desc {
174204 unsigned int usb_pd:1;
175205 enum typec_accessory accessory;
176206 struct usb_pd_identity *identity;
207
+ u16 pd_revision; /* 0300H = "3.0" */
208
+};
209
+
210
+/**
211
+ * struct typec_operations - USB Type-C Port Operations
212
+ * @try_role: Set data role preference for DRP port
213
+ * @dr_set: Set Data Role
214
+ * @pr_set: Set Power Role
215
+ * @vconn_set: Source VCONN
216
+ * @port_type_set: Set port type
217
+ */
218
+struct typec_operations {
219
+ int (*try_role)(struct typec_port *port, int role);
220
+ int (*dr_set)(struct typec_port *port, enum typec_data_role role);
221
+ int (*pr_set)(struct typec_port *port, enum typec_role role);
222
+ int (*vconn_set)(struct typec_port *port, enum typec_role role);
223
+ int (*port_type_set)(struct typec_port *port,
224
+ enum typec_port_type type);
225
+ ANDROID_KABI_RESERVE(1);
226
+};
227
+
228
+enum usb_pd_svdm_ver {
229
+ SVDM_VER_1_0 = 0,
230
+ SVDM_VER_2_0 = 1,
231
+ SVDM_VER_MAX = SVDM_VER_2_0,
177232 };
178233
179234 /*
....@@ -182,16 +237,12 @@
182237 * @data: Supported data role of the port
183238 * @revision: USB Type-C Specification release. Binary coded decimal
184239 * @pd_revision: USB Power Delivery Specification revision if supported
240
+ * @svdm_version: USB PD Structured VDM version if supported
185241 * @prefer_role: Initial role preference (DRP ports).
186242 * @accessory: Supported Accessory Modes
187
- * @sw: Cable plug orientation switch
188
- * @mux: Multiplexer switch for Alternate/Accessory Modes
189243 * @fwnode: Optional fwnode of the port
190
- * @try_role: Set data role preference for DRP port
191
- * @dr_set: Set Data Role
192
- * @pr_set: Set Power Role
193
- * @vconn_set: Set VCONN Role
194
- * @port_type_set: Set port type
244
+ * @driver_data: Private pointer for driver specific info
245
+ * @ops: Port operations vector
195246 *
196247 * Static capabilities of a single USB Type-C port.
197248 */
....@@ -200,24 +251,16 @@
200251 enum typec_port_data data;
201252 u16 revision; /* 0120H = "1.2" */
202253 u16 pd_revision; /* 0300H = "3.0" */
254
+ enum usb_pd_svdm_ver svdm_version;
203255 int prefer_role;
204256 enum typec_accessory accessory[TYPEC_MAX_ACCESSORY];
257
+ unsigned int orientation_aware:1;
205258
206
- struct typec_switch *sw;
207
- struct typec_mux *mux;
208259 struct fwnode_handle *fwnode;
260
+ void *driver_data;
209261
210
- int (*try_role)(const struct typec_capability *,
211
- int role);
212
-
213
- int (*dr_set)(const struct typec_capability *,
214
- enum typec_data_role);
215
- int (*pr_set)(const struct typec_capability *,
216
- enum typec_role);
217
- int (*vconn_set)(const struct typec_capability *,
218
- enum typec_role);
219
- int (*port_type_set)(const struct typec_capability *,
220
- enum typec_port_type);
262
+ const struct typec_operations *ops;
263
+ ANDROID_KABI_RESERVE(1);
221264 };
222265
223266 /* Specific to try_role(). Indicates the user want's to clear the preference. */
....@@ -235,6 +278,10 @@
235278 struct typec_cable_desc *desc);
236279 void typec_unregister_cable(struct typec_cable *cable);
237280
281
+struct typec_cable *typec_cable_get(struct typec_port *port);
282
+void typec_cable_put(struct typec_cable *cable);
283
+int typec_cable_is_active(struct typec_cable *cable);
284
+
238285 struct typec_plug *typec_register_plug(struct typec_cable *cable,
239286 struct typec_plug_desc *desc);
240287 void typec_unregister_plug(struct typec_plug *plug);
....@@ -249,7 +296,15 @@
249296 enum typec_orientation typec_get_orientation(struct typec_port *port);
250297 int typec_set_mode(struct typec_port *port, int mode);
251298
299
+void *typec_get_drvdata(struct typec_port *port);
300
+
301
+int typec_find_pwr_opmode(const char *name);
302
+int typec_find_orientation(const char *name);
252303 int typec_find_port_power_role(const char *name);
253304 int typec_find_power_role(const char *name);
254305 int typec_find_port_data_role(const char *name);
306
+
307
+void typec_partner_set_svdm_version(struct typec_partner *partner,
308
+ enum usb_pd_svdm_ver svdm_version);
309
+int typec_get_negotiated_svdm_version(struct typec_port *port);
255310 #endif /* __LINUX_USB_TYPEC_H */