0001
0002
0003 #ifndef __LINUX_USB_TYPEC_H
0004 #define __LINUX_USB_TYPEC_H
0005
0006 #include <linux/types.h>
0007
0008
0009 #define USB_TYPEC_REV_1_0 0x100
0010 #define USB_TYPEC_REV_1_1 0x110
0011 #define USB_TYPEC_REV_1_2 0x120
0012 #define USB_TYPEC_REV_1_3 0x130
0013 #define USB_TYPEC_REV_1_4 0x140
0014 #define USB_TYPEC_REV_2_0 0x200
0015
0016 struct typec_partner;
0017 struct typec_cable;
0018 struct typec_plug;
0019 struct typec_port;
0020 struct typec_altmode_ops;
0021
0022 struct fwnode_handle;
0023 struct device;
0024
0025 struct usb_power_delivery;
0026
0027 enum typec_port_type {
0028 TYPEC_PORT_SRC,
0029 TYPEC_PORT_SNK,
0030 TYPEC_PORT_DRP,
0031 };
0032
0033 enum typec_port_data {
0034 TYPEC_PORT_DFP,
0035 TYPEC_PORT_UFP,
0036 TYPEC_PORT_DRD,
0037 };
0038
0039 enum typec_plug_type {
0040 USB_PLUG_NONE,
0041 USB_PLUG_TYPE_A,
0042 USB_PLUG_TYPE_B,
0043 USB_PLUG_TYPE_C,
0044 USB_PLUG_CAPTIVE,
0045 };
0046
0047 enum typec_data_role {
0048 TYPEC_DEVICE,
0049 TYPEC_HOST,
0050 };
0051
0052 enum typec_role {
0053 TYPEC_SINK,
0054 TYPEC_SOURCE,
0055 };
0056
0057 static inline int is_sink(enum typec_role role)
0058 {
0059 return role == TYPEC_SINK;
0060 }
0061
0062 static inline int is_source(enum typec_role role)
0063 {
0064 return role == TYPEC_SOURCE;
0065 }
0066
0067 enum typec_pwr_opmode {
0068 TYPEC_PWR_MODE_USB,
0069 TYPEC_PWR_MODE_1_5A,
0070 TYPEC_PWR_MODE_3_0A,
0071 TYPEC_PWR_MODE_PD,
0072 };
0073
0074 enum typec_accessory {
0075 TYPEC_ACCESSORY_NONE,
0076 TYPEC_ACCESSORY_AUDIO,
0077 TYPEC_ACCESSORY_DEBUG,
0078 };
0079
0080 #define TYPEC_MAX_ACCESSORY 3
0081
0082 enum typec_orientation {
0083 TYPEC_ORIENTATION_NONE,
0084 TYPEC_ORIENTATION_NORMAL,
0085 TYPEC_ORIENTATION_REVERSE,
0086 };
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 struct enter_usb_data {
0098 u32 eudo;
0099 unsigned char active_link_training:1;
0100 };
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114 struct usb_pd_identity {
0115 u32 id_header;
0116 u32 cert_stat;
0117 u32 product;
0118 u32 vdo[3];
0119 };
0120
0121 int typec_partner_set_identity(struct typec_partner *partner);
0122 int typec_cable_set_identity(struct typec_cable *cable);
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134 struct typec_altmode_desc {
0135 u16 svid;
0136 u8 mode;
0137 u32 vdo;
0138
0139 enum typec_port_data roles;
0140 };
0141
0142 void typec_partner_set_pd_revision(struct typec_partner *partner, u16 pd_revision);
0143 int typec_partner_set_num_altmodes(struct typec_partner *partner, int num_altmodes);
0144 struct typec_altmode
0145 *typec_partner_register_altmode(struct typec_partner *partner,
0146 const struct typec_altmode_desc *desc);
0147 int typec_plug_set_num_altmodes(struct typec_plug *plug, int num_altmodes);
0148 struct typec_altmode
0149 *typec_plug_register_altmode(struct typec_plug *plug,
0150 const struct typec_altmode_desc *desc);
0151 struct typec_altmode
0152 *typec_port_register_altmode(struct typec_port *port,
0153 const struct typec_altmode_desc *desc);
0154
0155 void typec_port_register_altmodes(struct typec_port *port,
0156 const struct typec_altmode_ops *ops, void *drvdata,
0157 struct typec_altmode **altmodes, size_t n);
0158
0159 void typec_unregister_altmode(struct typec_altmode *altmode);
0160
0161 struct typec_port *typec_altmode2port(struct typec_altmode *alt);
0162
0163 void typec_altmode_update_active(struct typec_altmode *alt, bool active);
0164
0165 enum typec_plug_index {
0166 TYPEC_PLUG_SOP_P,
0167 TYPEC_PLUG_SOP_PP,
0168 };
0169
0170
0171
0172
0173
0174
0175
0176
0177 struct typec_plug_desc {
0178 enum typec_plug_index index;
0179 };
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190 struct typec_cable_desc {
0191 enum typec_plug_type type;
0192 unsigned int active:1;
0193 struct usb_pd_identity *identity;
0194 u16 pd_revision;
0195
0196 };
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214 struct typec_partner_desc {
0215 unsigned int usb_pd:1;
0216 enum typec_accessory accessory;
0217 struct usb_pd_identity *identity;
0218 u16 pd_revision;
0219 };
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231 struct typec_operations {
0232 int (*try_role)(struct typec_port *port, int role);
0233 int (*dr_set)(struct typec_port *port, enum typec_data_role role);
0234 int (*pr_set)(struct typec_port *port, enum typec_role role);
0235 int (*vconn_set)(struct typec_port *port, enum typec_role role);
0236 int (*port_type_set)(struct typec_port *port,
0237 enum typec_port_type type);
0238 struct usb_power_delivery **(*pd_get)(struct typec_port *port);
0239 int (*pd_set)(struct typec_port *port, struct usb_power_delivery *pd);
0240 };
0241
0242 enum usb_pd_svdm_ver {
0243 SVDM_VER_1_0 = 0,
0244 SVDM_VER_2_0 = 1,
0245 SVDM_VER_MAX = SVDM_VER_2_0,
0246 };
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264 struct typec_capability {
0265 enum typec_port_type type;
0266 enum typec_port_data data;
0267 u16 revision;
0268 u16 pd_revision;
0269 enum usb_pd_svdm_ver svdm_version;
0270 int prefer_role;
0271 enum typec_accessory accessory[TYPEC_MAX_ACCESSORY];
0272 unsigned int orientation_aware:1;
0273
0274 struct fwnode_handle *fwnode;
0275 void *driver_data;
0276
0277 struct usb_power_delivery *pd;
0278
0279 const struct typec_operations *ops;
0280 };
0281
0282
0283 #define TYPEC_NO_PREFERRED_ROLE (-1)
0284
0285 struct typec_port *typec_register_port(struct device *parent,
0286 const struct typec_capability *cap);
0287 void typec_unregister_port(struct typec_port *port);
0288
0289 struct typec_partner *typec_register_partner(struct typec_port *port,
0290 struct typec_partner_desc *desc);
0291 void typec_unregister_partner(struct typec_partner *partner);
0292
0293 struct typec_cable *typec_register_cable(struct typec_port *port,
0294 struct typec_cable_desc *desc);
0295 void typec_unregister_cable(struct typec_cable *cable);
0296
0297 struct typec_cable *typec_cable_get(struct typec_port *port);
0298 void typec_cable_put(struct typec_cable *cable);
0299 int typec_cable_is_active(struct typec_cable *cable);
0300
0301 struct typec_plug *typec_register_plug(struct typec_cable *cable,
0302 struct typec_plug_desc *desc);
0303 void typec_unregister_plug(struct typec_plug *plug);
0304
0305 void typec_set_data_role(struct typec_port *port, enum typec_data_role role);
0306 void typec_set_pwr_role(struct typec_port *port, enum typec_role role);
0307 void typec_set_vconn_role(struct typec_port *port, enum typec_role role);
0308 void typec_set_pwr_opmode(struct typec_port *port, enum typec_pwr_opmode mode);
0309
0310 int typec_set_orientation(struct typec_port *port,
0311 enum typec_orientation orientation);
0312 enum typec_orientation typec_get_orientation(struct typec_port *port);
0313 int typec_set_mode(struct typec_port *port, int mode);
0314
0315 void *typec_get_drvdata(struct typec_port *port);
0316
0317 int typec_get_fw_cap(struct typec_capability *cap,
0318 struct fwnode_handle *fwnode);
0319
0320 int typec_find_pwr_opmode(const char *name);
0321 int typec_find_orientation(const char *name);
0322 int typec_find_port_power_role(const char *name);
0323 int typec_find_power_role(const char *name);
0324 int typec_find_port_data_role(const char *name);
0325
0326 void typec_partner_set_svdm_version(struct typec_partner *partner,
0327 enum usb_pd_svdm_ver svdm_version);
0328 int typec_get_negotiated_svdm_version(struct typec_port *port);
0329
0330 int typec_port_set_usb_power_delivery(struct typec_port *port, struct usb_power_delivery *pd);
0331 int typec_partner_set_usb_power_delivery(struct typec_partner *partner,
0332 struct usb_power_delivery *pd);
0333
0334 #endif