.. | .. |
---|
4 | 4 | #define __LINUX_USB_TYPEC_H |
---|
5 | 5 | |
---|
6 | 6 | #include <linux/types.h> |
---|
| 7 | +#include <linux/android_kabi.h> |
---|
7 | 8 | |
---|
8 | 9 | /* USB Type-C Specification releases */ |
---|
9 | 10 | #define USB_TYPEC_REV_1_0 0x100 /* 1.0 */ |
---|
10 | 11 | #define USB_TYPEC_REV_1_1 0x110 /* 1.1 */ |
---|
11 | 12 | #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 */ |
---|
12 | 16 | |
---|
13 | 17 | struct typec_partner; |
---|
14 | 18 | struct typec_cable; |
---|
.. | .. |
---|
71 | 75 | }; |
---|
72 | 76 | |
---|
73 | 77 | /* |
---|
| 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 | +/* |
---|
74 | 92 | * struct usb_pd_identity - USB Power Delivery identity data |
---|
75 | 93 | * @id_header: ID Header VDO |
---|
76 | 94 | * @cert_stat: Cert Stat VDO |
---|
77 | 95 | * @product: Product VDO |
---|
78 | | - * @product_type: Product type VDO |
---|
| 96 | + * @vdo: Product Type Specific VDOs |
---|
79 | 97 | * |
---|
80 | 98 | * USB power delivery Discover Identity command response data. |
---|
81 | 99 | * |
---|
.. | .. |
---|
86 | 104 | u32 id_header; |
---|
87 | 105 | u32 cert_stat; |
---|
88 | 106 | u32 product; |
---|
89 | | - u32 product_type; |
---|
| 107 | + u32 vdo[3]; |
---|
90 | 108 | }; |
---|
91 | 109 | |
---|
92 | 110 | int typec_partner_set_identity(struct typec_partner *partner); |
---|
.. | .. |
---|
110 | 128 | enum typec_port_data roles; |
---|
111 | 129 | }; |
---|
112 | 130 | |
---|
| 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); |
---|
113 | 133 | struct typec_altmode |
---|
114 | 134 | *typec_partner_register_altmode(struct typec_partner *partner, |
---|
115 | 135 | const struct typec_altmode_desc *desc); |
---|
| 136 | +int typec_plug_set_num_altmodes(struct typec_plug *plug, int num_altmodes); |
---|
116 | 137 | struct typec_altmode |
---|
117 | 138 | *typec_plug_register_altmode(struct typec_plug *plug, |
---|
118 | 139 | const struct typec_altmode_desc *desc); |
---|
.. | .. |
---|
151 | 172 | * @type: The plug type from USB PD Cable VDO |
---|
152 | 173 | * @active: Is the cable active or passive |
---|
153 | 174 | * @identity: Result of Discover Identity command |
---|
| 175 | + * @pd_revision: USB Power Delivery Specification revision if supported |
---|
154 | 176 | * |
---|
155 | 177 | * Represents USB Type-C Cable attached to USB Type-C port. |
---|
156 | 178 | */ |
---|
.. | .. |
---|
158 | 180 | enum typec_plug_type type; |
---|
159 | 181 | unsigned int active:1; |
---|
160 | 182 | struct usb_pd_identity *identity; |
---|
| 183 | + u16 pd_revision; /* 0300H = "3.0" */ |
---|
| 184 | + |
---|
161 | 185 | }; |
---|
162 | 186 | |
---|
163 | 187 | /* |
---|
.. | .. |
---|
165 | 189 | * @usb_pd: USB Power Delivery support |
---|
166 | 190 | * @accessory: Audio, Debug or none. |
---|
167 | 191 | * @identity: Discover Identity command data |
---|
| 192 | + * @pd_revision: USB Power Delivery Specification Revision if supported |
---|
168 | 193 | * |
---|
169 | 194 | * Details about a partner that is attached to USB Type-C port. If @identity |
---|
170 | 195 | * member exists when partner is registered, a directory named "identity" is |
---|
171 | 196 | * 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. |
---|
172 | 202 | */ |
---|
173 | 203 | struct typec_partner_desc { |
---|
174 | 204 | unsigned int usb_pd:1; |
---|
175 | 205 | enum typec_accessory accessory; |
---|
176 | 206 | 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, |
---|
177 | 232 | }; |
---|
178 | 233 | |
---|
179 | 234 | /* |
---|
.. | .. |
---|
182 | 237 | * @data: Supported data role of the port |
---|
183 | 238 | * @revision: USB Type-C Specification release. Binary coded decimal |
---|
184 | 239 | * @pd_revision: USB Power Delivery Specification revision if supported |
---|
| 240 | + * @svdm_version: USB PD Structured VDM version if supported |
---|
185 | 241 | * @prefer_role: Initial role preference (DRP ports). |
---|
186 | 242 | * @accessory: Supported Accessory Modes |
---|
187 | | - * @sw: Cable plug orientation switch |
---|
188 | | - * @mux: Multiplexer switch for Alternate/Accessory Modes |
---|
189 | 243 | * @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 |
---|
195 | 246 | * |
---|
196 | 247 | * Static capabilities of a single USB Type-C port. |
---|
197 | 248 | */ |
---|
.. | .. |
---|
200 | 251 | enum typec_port_data data; |
---|
201 | 252 | u16 revision; /* 0120H = "1.2" */ |
---|
202 | 253 | u16 pd_revision; /* 0300H = "3.0" */ |
---|
| 254 | + enum usb_pd_svdm_ver svdm_version; |
---|
203 | 255 | int prefer_role; |
---|
204 | 256 | enum typec_accessory accessory[TYPEC_MAX_ACCESSORY]; |
---|
| 257 | + unsigned int orientation_aware:1; |
---|
205 | 258 | |
---|
206 | | - struct typec_switch *sw; |
---|
207 | | - struct typec_mux *mux; |
---|
208 | 259 | struct fwnode_handle *fwnode; |
---|
| 260 | + void *driver_data; |
---|
209 | 261 | |
---|
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); |
---|
221 | 264 | }; |
---|
222 | 265 | |
---|
223 | 266 | /* Specific to try_role(). Indicates the user want's to clear the preference. */ |
---|
.. | .. |
---|
235 | 278 | struct typec_cable_desc *desc); |
---|
236 | 279 | void typec_unregister_cable(struct typec_cable *cable); |
---|
237 | 280 | |
---|
| 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 | + |
---|
238 | 285 | struct typec_plug *typec_register_plug(struct typec_cable *cable, |
---|
239 | 286 | struct typec_plug_desc *desc); |
---|
240 | 287 | void typec_unregister_plug(struct typec_plug *plug); |
---|
.. | .. |
---|
249 | 296 | enum typec_orientation typec_get_orientation(struct typec_port *port); |
---|
250 | 297 | int typec_set_mode(struct typec_port *port, int mode); |
---|
251 | 298 | |
---|
| 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); |
---|
252 | 303 | int typec_find_port_power_role(const char *name); |
---|
253 | 304 | int typec_find_power_role(const char *name); |
---|
254 | 305 | 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); |
---|
255 | 310 | #endif /* __LINUX_USB_TYPEC_H */ |
---|