| .. | .. |
|---|
| 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 */ |
|---|